Debugging cuda无限核

Debugging cuda无限核,debugging,cuda,infinite,Debugging,Cuda,Infinite,我正在开发一个需要无限期运行CUDA内核的应用程序。我有一个CPU线程将stg写入列表,gpu读取该列表并重置(至少对于start)。当我在内核中写入时 while(true) { //kernel code } 系统挂断。我知道GPU仍在处理,但当然什么也没发生。我不确定列表中的重置是否发生 我必须提到,用于计算的GPU不用于显示,因此没有看门狗问题 操作系统是Ubuntu 11.10和cuda toolkit 4.1。 我可以使用任何帮助/示例/链接成功编写无限内核。CUDA编程语言和CU

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

while(true)
{
//kernel code
}
系统挂断。我知道GPU仍在处理,但当然什么也没发生。我不确定列表中的重置是否发生

我必须提到,用于计算的GPU不用于显示,因此没有看门狗问题

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

CUDA编程语言和CUDA体系结构目前不支持无限内核。我建议你考虑一下罗杰的建议。 如果您想继续这样做,我建议您在内核中添加以下调试代码:

  • 每N个时钟在固定内存中增加一个变量(每个SM可能需要不同的位置),并且
  • 定期读取可由CPU更新的内存位置,以通知内核退出 这是一个软件看门狗

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

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


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

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

    从CUDA 9.2开始,有一个解决方案:

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

    在发散的分支中进行无限循环显然不是一个好主意。除此之外,不当处理
    而(1)
    构造IMO肯定是一个bug。

    CUDA调度程序在处理无限循环、自旋锁等方面非常糟糕,因为这些“对象”对于GPU体系结构来说是完全陌生的。更常见和可预测的方法是偶尔运行内核一次,检查新元素是否出现。此外,新元素不能只是出现。你必须把它们放在那里。因此,您知道何时需要重新运行内核。当内核运行时,高端GPU上的功耗会增加250W,因此选择何时运行内核可以节省资金。“无限内核对当前项目来说是强制性的。目标是一个gpu控制器,因此gpu必须在没有cpu干扰的情况下自主工作(当然,内核调用除外)。”在我看来,你的整个想法完全有缺陷。你应该回去仔细反思。记住我之前说过的:新元素不能只是出现。你必须把它们放在那里。因此,您知道何时需要重新运行内核。对于您的问题,您希望在后台运行一个完整的进程,或者至少运行一个线程,而不仅仅是一个CUDA内核。这是一个聪明的建议,但不起作用。即使我删除while(true)并用(for int I=0;ii)替换它,它也不起作用。如果您将数据保留在固定的系统内存中,请确保您正在执行一个u theradfence_系统来刷新对系统内存的写入。如果您正在读取一个值,请确保将其标记为volatile,以便编译器不会在寄存器中使用以前的读取。