0

我正在使用 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 都将被丢弃。因此很难确定问题所在。

4

1 回答 1

1

“CUDA 驱动程序 5.5,运行时 5.0”——这似乎很奇怪。

您可能遇到了Windows TDR 事件。根据您的描述,我会先检查一下。如果随着线程的增加,内核开始花费超过 2 秒的时间来执行,您可能会遇到 windows 超时。

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

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

于 2013-08-09T23:35:07.880 回答