0

这是这篇文章的延续。

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

再次感谢。

4

1 回答 1

1

与 X 和显示驱动程序有交互,以及标准输出队列和它与图形显示驱动程序的交互。

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

  1. 通过网络从另一台机器上通过 ssh 登录到您的机器。我认为你的程序会起作用。(本例中X不参与显示)
  2. 注释掉打印出“正在启动...”的行,我认为您的程序将可以运行。(这避免了显示驱动程序/打印队列死锁,见下文)。
  3. 在“Starting...”打印行和第一个内核之间添加一个sleep(2);。我认为您的程序将起作用。(这允许显示驱动程序在第一个内核启动之前完全服务于第一个打印输出,因此不会出现 CPU 线程停顿。)
  4. 停止 X 并从控制台运行。我认为你的程序会起作用。

当 GPU 同时托管 X 显示器并运行 CUDA 任务时,它必须在两者之间切换。在 CUDA 任务期间,普通显示处理暂停。您可以在此处阅读有关此内容的更多信息。

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

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

于 2013-11-06T22:54:01.167 回答