cudaMemcpy会影响其他变量

时间:2013-10-09 21:24:44

标签: pointers memory cuda copy device

这是我的程序代码,该程序在图像上执行直方图,然后在直方图http://codepad.org/4RMtWn1e上执行前缀和扫描。问题出在第396行,它在1024处正确输出numBins(直方图的二进制数)的值。我将直方图从设备存储器复制回主机存储器。这会以某种方式改变numBins的值,并且下一个输出为0.这看起来很奇怪。我没有对numBins做任何具体的修改,但无论如何它都改变了值。我觉得如果能搞清楚这一点,我会理解为什么我的程序无效。

1 个答案:

答案 0 :(得分:2)

这是错误的:

unsigned int* h_histogram;
h_histogram = (unsigned int*) malloc(sizeof(unsigned int)* 1024);

std::cout << numBins;

checkCudaErrors(cudaMemcpy(&h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));
                           ^
                           |
                            h_histogram is already a pointer

而是这样做:

checkCudaErrors(cudaMemcpy(h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));

(唯一的变化就是删除h_histogram

前面的&符号

我不确定为什么numBins完全被损坏,但是这个特殊的错误cudaMemcpy操作不会复制到您期望的目标,而是会覆盖存储在{{{}的指针值。 1}}以及之后发生的任何事情。如果h_histogram恰好存储在它之后,它也会覆盖它。