我正在开发一个需要无限期运行 CUDA 内核的应用程序。我有一个 CPU 线程将 stg 写入列表,GPU 读取该列表并重置(至少在启动时)。当我在内核中写入时
while(true)
{
//kernel code
}
系统挂起。我知道 GPU 仍在处理,但当然什么也没有发生。而且我不确定列表中是否会发生重置。
不得不提的是,用于计算的GPU不是用于显示的,所以不存在看门狗问题。
操作系统是Ubuntu 11.10和cuda工具包4.1。 我可以使用任何帮助/示例/链接来成功编写无限内核。
最佳答案
CUDA 编程语言和 CUDA 架构目前不支持无限内核。我建议您考虑罗杰的建议。
如果您想实现这一点,我建议您将以下调试代码添加到内核中:
- 每 N 个时钟增加固定内存中的一个变量(可能需要为每个 SM 使用不同的位置),
- 定期读取可由 CPU 更新的内存位置,以告诉内核退出。
这是一个软件看门狗。
您可以使用clock()或clock64()来控制执行(1)和(2)的频率。
您可以使用 cuda-gdb 来调试您的问题。
该语言不支持无限循环。编译器可能会剥离代码。您可能需要查看 PTX 和 SASS。如果编译器生成错误代码,您可以通过让编译器认为存在有效的退出条件来伪造它。
关于debugging - cuda无限内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436228/