多个CUDA流崩溃了GPU

时间:2013-11-06 21:26:22

标签: c++ cuda gpu nvidia cuda-streams

这是this帖子的延续。

似乎通过添加volitile解决了一个特殊情况,但现在已经破坏了其他东西。如果我在两个内核调用之间添加任何内容,系统将恢复旧的行为,即立即冻结和打印所有内容。添加sleep(2)会显示此行为;在set_flagread_flag之间。此外,当放入另一个程序时,这会导致GPU锁定。我现在做错了什么?

再次感谢。

1 个答案:

答案 0 :(得分:1)

与X和显示驱动程序以及标准输出队列进行交互,并与图形显示驱动程序进行交互。

您可以尝试一些实验(在sleep(2);set_flag内核之间添加read_flag):

  1. 通过网络从另一台计算机通过网络登录您的计算机。我认为你的程序会奏效。 (在这种情况下,X不参与显示)
  2. 注释出打印出来的行“开始...”我想你的 程序将工作。 (这可以避免显示驱动程序/打印队列死锁,请参阅下文)。
  3. 在“Starting ...”打印行和第一个内核之间添加sleep(2);。我认为你的程序会有效。 (这允许显示驱动程序在第一个内核启动之前完全服务第一个打印输出,因此没有CPU线程停止。)
  4. 停止X并从控制台运行。我认为你的计划会奏效。
  5. 当GPU同时托管X显示器并运行CUDA任务时,它必须在两者之间切换。在CUDA任务期间,暂停普通显示处理。您可以阅读有关此here的更多信息。

    这里的问题是,当运行X时,第一个打印输出被发送到打印队列但在第一个内核启动之前没有实际显示。这很明显,因为在显示冻结之前您没有看到打印输出。之后,CPU线程停止等待显示文本。第二个内核没有启动。干预sleep(2);及其与操作系统的交互足以让这个失速发生。并且执行的第一个内核的显示驱动程序“停止”用于普通显示任务,因此操作系统永远不会超过它的停顿,因此第二个内核不会启动,导致明显挂起。

    请注意,链接的custhelp文章中的选项1,2或3对您的情况有效。选项4不会。