如何调试:当线程很多时,CUDA内核会失败?

时间:2013-08-09 23:14:58

标签: cuda breadth-first-search

我正在使用Quadro K2000M卡,CUDA功能3.0,CUDA驱动程序5.5,运行时5.0,使用Visual Studio 2010进行编程。我的GPU算法运行树的许多并行广度优先搜索(BFS)(常量)。线程是独立的,除了从常量数组​​和树中读取。在每个线程中,可以有一些malloc / free操作,遵循带有队列的BFS算法(无递归)。有N个线程;树叶节点的数量也是N.我每块使用256个线程,每个网格使用(N + 256-1)/ 256个块。

现在的问题是该程序适用于较少的N = 100000个线程,但失败的原因不止于此。它也适用于CPU或GPU线程中的线程。当N很大(例如> 100000)时,内核崩溃,然后从设备到主机的cudaMemcpy也会失败。我尝试了Nsight,但它太慢了。

现在我设置cudaDeviceSetLimit(cudaLimitMallocHeapSize, 268435456);我也尝试了更大的值,高达1G; cudaDeviceSetLimit成功但问题仍然存在。

有谁知道上述问题的一些常见原因?或任何进一步调试的提示?我试图放一些printf,但有大量的输出。此外,一旦线程崩溃,所有剩余的printf都将被丢弃。因此很难确定问题。

1 个答案:

答案 0 :(得分:1)

“CUDA Driver 5.5,运行时5.0” - 这看起来很奇怪。

您可能遇到了windows TDR event。根据您的描述,我会先检查一下。如果在增加线程时,内核开始执行的时间超过2秒,则可能会触发Windows超时。

对于所有内核调用和CUDA API调用,您还应该为代码添加适当的cuda error checking。根据您收到的错误代码,Windows TDR事件将更容易明显。或者错误代码可能会引导您朝另一个方向发展。

最后,我会在传递和失败的情况下使用cuda-memcheck运行代码,寻找内核中的越界访问或其他问题。