我为代码制作了一个串行版本来计算直方图,我知道算法有效。问题是,当我在CUDA中执行此操作时,我唯一得到的结果是0.我可以将输入数组dev_x复制到输出变量h中,并且我能够看到x的输入值。 / p>
输入数据是x和y位置的列表,具有相应的颜色(int从1到5)
参数是输入文件名,输出文件名,cellWidth和cellHeight,其中 cellWidth和cellHeight是输入分割的区域数.1000000 X 1000000阵列分为1000 X 1000个区域。我需要计算每个区域中每种颜色的出现次数。
答案 0 :(得分:2)
此代码中至少存在两个巨大的基本问题,这两个问题都与CUDA无关:
histSize = sizeof(unsigned int) * xMax/cellWidth * yMax/cellHeight * numColors;
//....
h = (unsigned int*) malloc(histSize);
//.....
for(i=0; i<histSize; i++)
h[i]=0; // <-- buffer oveflow
可能在它启动内核之前就已经杀了程序,并且:
cudaMalloc( (void**) &dev_h, histSize );
// .......
cudaMemcpy(dev_h, h, size, cudaMemcpyHostToDevice); // buffer overflow
如果程序到目前为止会破坏CUDA上下文。
这些基本错误,你还没有检测到它们,因为你唯一的用例显然是一个试图处理150Mb输入文件并从中发出大直方图的程序,你的只有检测错误的方法是查看包含该直方图的文件。这是开发和调试代码的完全疯狂的方法。如果您已完成以下任何操作:
你可能会立即发现问题(可能会有更多,但我不在乎寻找它们,这是你的工作),这个Stack Overflow问题不会存在。< / p>