CUDA输出变量始终为0

时间:2014-04-20 22:24:18

标签: c linux cuda gpu nvidia

我为代码制作了一个串行版本来计算直方图,我知道算法有效。问题是,当我在CUDA中执行此操作时,我唯一得到的结果是0.我可以将输入数组dev_x复制到输出变量h中,并且我能够看到x的输入值。 / p>

输入数据是x和y位置的列表,具有相应的颜色(int从1到5)

参数是输入文件名,输出文件名,cellWidth和cellHeight,其中 cellWidth和cellHeight是输入分割的区域数.1000000 X 1000000阵列分为1000 X 1000个区域。我需要计算每个区域中每种颜色的出现次数。

1 个答案:

答案 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输入文件并从中发出大直方图的程序,你的只有检测错误的方法是查看包含该直方图的文件。这是开发和调试代码的完全疯狂的方法。如果您已完成以下任何操作:

  1. 硬编码了一个非常小的测试用例,你已经知道了
  2. 的答案
  3. 添加了CUDA API错误检查
  4. 运行valgrind
  5. 使用cuda-memcheck
  6. 使用主机调试程序
  7. ran nvprof
  8. 你可能会立即发现问题(可能会有更多,但我不在乎寻找它们,这是你的工作),这个Stack Overflow问题不会存在。< / p>