非确定性输出的CUDA调试程序

4
我正在调试基于CUDA 4.0 / Thrust的图像重建代码,在我的Ubuntu 10.10 64位系统上,我一直在尝试找出如何调试这个运行时错误,其中我的输出图像显示为某些随机的“噪声”。我的代码中没有随机数生成器的输出,因此我希望输出在运行之间保持一致,即使是错误的。然而,它并不是这样的...
我只是想知道是否有任何人对调试CUDA运行时错误(例如这些)有一个通用的过程。我在我的cuda内核中没有使用任何共享内存。我已经努力避免涉及全局内存的任何竞争条件,但我可能会错过一些东西。
我已经尝试使用gpu ocelot,但它无法识别我的一些CUDA和CUSPARSE函数调用。
此外,我的代码通常都是可以工作的。只有当我更改了这个设置时,才会出现这些非确定性结果。我已经检查了与该设置相关的所有代码,但我无法弄清楚我做错了什么。如果我能将其简化为我可以发布的内容,我可能会这样做,但在这一点上,它太复杂了,无法在此处发布。

完全离题,你是否成功地将Ocelot与Thrust配合使用了?如果是,你是如何做到的呢? :-) - Kerrek SB
还没有,但如果我这样做了,我会告诉你的。 - Fares
很好,谢谢,我也会这样做! - Kerrek SB
1个回答

2

您确定所有的内核都正确处理了块大小/余数吗?我们曾经发现一处非确定性结果,就是当我们没有处理数组末尾的数据元素时。

我们的内核最初是针对已知为256个元素的整数倍的数据而设计的。因此,我们使用了256个块大小,并进行了简单的除法运算来获取块数。当数据长度改变为任意长度时,剩余的255个或更少的元素就没有被处理。输出中的这些位置随即包含了随机数据。


感谢您的反馈!事实证明,正如您所建议的那样,它确实与我的块大小有关。我为要处理的数据分配了足够多的块,只要您检查确保仅处理数据的适当索引边界内的线程,这是可以的。结果发现我使用了错误的边界。修复后问题得到解决 :) - Fares
@Fares - 是的,在这种情况下通常有两种处理“剩余”数据的方法。很多例子展示了你的方式。我们发现第二次运行内核,只使用剩余线程数的一个块,通常会稍微快一些。 - Steve Fallows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接