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