【问题标题】:CUDA output variable are always 0 [closed]CUDA 输出变量始终为 0 [关闭]
【发布时间】:2014-06-04 23:30:05
【问题描述】:

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

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

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

【问题讨论】:

  • proper cuda error checking 添加到您的代码中,您可能会知道哪里出了问题。
  • 除了错误检查点之外,如果您的代码是独立的,那就太好了。现在,它需要一个文件,并且需要了解除了您之外没有人可以访问的所需命令行参数和值。我不能/不知道如何运行你的程序,所以我看不到它做了什么或使用任何标准诊断工具来找出可能出错的地方。没有它,我看不到任何人实际上可以回答这个问题。投票结束。
  • @RobertCrovella - 我今晚一回家就会添加错误检查。感谢您的建议。
  • @talonmies - 我添加了输入参数和输入文件的描述。
  • @dead_jake:你是在告诉我,要运行你的程序,我应该创建自己的包含数十亿行的输入文本文件并运行你的代码?你觉得这合理吗?

标签: c linux cuda gpu nvidia


【解决方案1】:

这段代码中至少有两个巨大的基本问题,它们都与 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. 添加了 CUDA API 错误检查
  3. 运行 valgrind
  4. 使用 cuda-memcheck
  5. 使用了主机调试器
  6. 运行 nvprof

您可能会立即发现问题(可能还有更多问题,但我不在乎寻找它们,那是您的工作),并且这个 Stack Overflow 问题将不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2018-01-14
    • 2018-01-28
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多