我有一个非常简单的问题,但我不明白。我正在使用 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
我的指针地址在cudaMalloc调用之前是0,这是正常的,但我不明白为什么地址在函数之后是0。指针 dev_trimapExpanded 的地址不应更改。 cudaMalloc 的范围是否只在函数中?内存也不是免费的。如何跟踪不同内核调用之间的全局内存?
最佳答案
该行为是绝对正确的,您的问题是,您是在“按值”传递指针,而不是在调用函数时“按引用”传递指针。所以现在发生的事情是,当函数被调用时,你的指针被复制了,复制的值在函数内部发生了变化,但是当函数完成时,旧指针根本不受影响(因为所有的变化只发生在拷贝)。
试试这个代替你的函数头:
cudaError_t expansionTrimapCuda(unsigned char *& dev_trimapExpanded, ... )
关于c++ - cuda 内存分配 cudaMalloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738711/