выделение памяти cuda cudaMalloc

У меня довольно простой вопрос, но я его не понимаю. Я работаю с 4.2 CUDA.

У меня есть следующий код:

в моем cudaClass.h:

unsigned char *dev_trimapExpanded;

в моем cudaClass.cpp:

void cudaClass::expansionTrimap() {
printf("dev_trimapExpanded %d before function \n", dev_trimapExpanded);
//Call cuda function
cudaError_t cudaStatus = expansionTrimapCuda(dev_trimapExpanded, width, height);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "expansionTrimapCuda failed!\n");
}

printf("dev_trimapExpanded %d after function \n", dev_trimapExpanded);
}

в моем файле kernel.cu у меня есть:

cudaError_t expansionTrimapCuda(unsigned char *dev_trimapExpanded, size_t width, size_t height)
{
size_t size = width*height;

cudaError_t cudaStatus;

// Choose which GPU to run on, change this on a multi-GPU system.
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
return cudaStatus;
}

printf("dev_trimapExpanded %d before cudaMalloc \n", dev_trimapExpanded);
cudaStatus = cudaMalloc((void**)&dev_trimapExpanded, size);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc dev_trimapExpanded failed!");
return cudaStatus;
}
printf("dev_trimapExpanded %d after cudaMalloc \n", dev_trimapExpanded);

return cudaStatus;
}

Выход:

dev_trimapExpanded 0 before function
dev_trimapExpanded 0 before cudaMalloc
dev_trimapExpanded 93323264 after cudaMalloc
dev_trimapExpanded 0 after function

Адрес моего указателя равен 0 до вызова cudaMalloc, что является нормальным, но я не понимаю, почему адрес равен 0 после функции. Адрес указателя dev_trimapExpanded не должен изменяться. Является ли область действия cudaMalloc только функцией? Память тоже не свободна. Как я могу отслеживать свою глобальную память между различными вызовами ядра?

1

Решение

Поведение абсолютно правильное, ваша проблема в том, что вы передаете указатель «по значению», а не «по ссылке», когда вы вызываете функцию. Итак, что происходит сейчас, так как функция называется, когда вы копируете указатель, значение копии изменяется внутри функции, но когда функция завершается, старый указатель не затрагивается вообще (поскольку все изменения происходят только копия).

Попробуйте вместо этого использовать заголовок функции:

cudaError_t expansionTrimapCuda(unsigned char *& dev_trimapExpanded, ... )

Смотрите также: Указатель на указатель / Ссылка на указатель

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector