3

我正在开发一个需要无限期运行 CUDA 内核的应用程序。我有一个 CPU 线程将 stg 写入列表,而 gpu 读取该列表并重置(至少在开始时)。当我在内核中写

while(true)
{
//kernel code
}

系统挂断。我知道 GPU 仍在处理,但当然没有任何反应。而且我不确定列表中的重置是否会发生。

不得不提的是,用于计算的GPU不用于显示,所以没有看门狗问题。

操作系统是 Ubuntu 11.10 和 cuda 工具包 4.1。我可以使用任何帮助/示例/链接来成功编写无限内核。

4

2 回答 2

2

CUDA 编程语言和 CUDA 架构目前不支持无限内核。我建议你考虑一下罗杰的建议。

如果你想追求这个,我建议你在你的内核中添加以下调试代码:

  1. 每 N 个时钟在固定内存中增加一个变量(可能希望每个 SM 有不同的位置),并且,
  2. 定期读取一个可以被 CPU 更新的内存位置,告诉内核退出。

这是一个软件看门狗。

您可以使用 clock() 或 clock64() 来控制执行 (1) 和 (2) 的频率。

您可以使用 cuda-gdb 来调试您的问题。

该语言不支持无限循环。编译器可能正在剥离代码。您可能需要查看 PTX 和 SASS。如果编译器生成错误代码,您可以通过让编译器认为存在有效的退出条件来伪造它。

于 2012-05-06T01:51:28.083 回答
0

正如@Greg Smith 已经指出的那样,CUDA 编译器不会为无限循环生成正确的程序集。当然,在某些情况下它是一个完美的解决方案,例如运行一个后台服务内核,它接收来自主机的更新,推送到主机映射的内存。

一种解决方法,从 CUDA 9.2 开始有效:

volatile int infinity = 1;
while (infinity)
{
  ...
}

在发散分支内进行无限循环显然不是一个好主意。除此之外,while (1)构造 IMO 的不当处理绝对是一个错误。

于 2018-06-12T11:46:09.933 回答