【问题标题】:CUDA debugging procedure for non-deterministic output非确定性输出的 CUDA 调试过程
【发布时间】:2011-07-20 22:07:28
【问题描述】:

我正在我的 Ubuntu 10.10 64 位系统上调试基于 CUDA 4.0/Thrust 的图像重建代码,并且我一直在尝试弄清楚如何调试出现输出图像的运行时错误到一些随机的“噪音”。我的代码中没有随机数生成器输出,所以我希望输出在运行之间保持一致,即使它是错误的。但是,并不是……

我只是想知道是否有人有调试此类 CUDA 运行时错误的通用程序。我没有在我的 cuda 内核中使用任何共享内存。我努力避免任何涉及全局内存的竞争条件,但我可能会错过一些东西。

我尝试过使用 gpu ocelot,但它无法识别我的一些 CUDA 和 CUSPARSE 函数调用。

另外,我的代码通常有效。只是当我更改这个设置时,我才会得到这些不确定的结果。我已经检查了与该设置相关的所有代码,但我无法弄清楚我做错了什么。如果我可以将其提炼成可以在此处发布的内容,我可能会这样做,但此时此处发布太复杂了。

【问题讨论】:

  • 完全跑题了,你有没有设法让 ocelot 与 Thrust 一起工作,如果是的话如何? :-)
  • 还没有,但我会告诉你的。
  • 太好了,谢谢,我也会这样做!

标签: c++ debugging cuda non-deterministic


【解决方案1】:

您确定您的所有内核都有适当的块大小/剩余处理吗?当我们在数组末尾的数据元素没有被处理时,我们看到了一个不确定的结果。

我们的内核最初是为已知为 256 个元素的整数倍的数据设计的。所以我们使用了 256 的块大小,并做了一个简单的除法来得到块的数量。当数据随后更改为任意长度时,剩余的 255 个或更少的元素永远不会被处理。然后输出中的那些点有随机数据。

【讨论】:

  • 感谢您的反馈!事实证明,正如您所建议的,它确实与我的块大小有关。我为要处理的数据分配了足够多的块,只要您检查以确保仅在数据的正确索引范围内处理线程,就可以了。原来我使用了错误的界限。修复它解决了问题:)
  • @Fares - 是的,在这种情况下,通常有两种方法可以处理“剩余”数据。很多例子展示了你的方式。我们发现,第二次运行内核通常会稍微快一点,其中一个块仅包含剩余的线程数。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2014-09-18
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多