这是this帖子的延续。
似乎通过添加volitile
解决了一个特殊情况,但现在已经破坏了其他东西。如果我在两个内核调用之间添加任何内容,系统将恢复旧的行为,即立即冻结和打印所有内容。添加sleep(2)
会显示此行为;在set_flag
和read_flag
之间。此外,当放入另一个程序时,这会导致GPU锁定。我现在做错了什么?
再次感谢。
答案 0 :(得分:1)
与X和显示驱动程序以及标准输出队列进行交互,并与图形显示驱动程序进行交互。
您可以尝试一些实验(在sleep(2);
和set_flag
内核之间添加read_flag
):
sleep(2);
。我认为你的程序会有效。 (这允许显示驱动程序在第一个内核启动之前完全服务第一个打印输出,因此没有CPU线程停止。)当GPU同时托管X显示器并运行CUDA任务时,它必须在两者之间切换。在CUDA任务期间,暂停普通显示处理。您可以阅读有关此here的更多信息。
这里的问题是,当运行X时,第一个打印输出被发送到打印队列但在第一个内核启动之前没有实际显示。这很明显,因为在显示冻结之前您没有看到打印输出。之后,CPU线程停止等待显示文本。第二个内核没有启动。干预sleep(2);
及其与操作系统的交互足以让这个失速发生。并且执行的第一个内核的显示驱动程序“停止”用于普通显示任务,因此操作系统永远不会超过它的停顿,因此第二个内核不会启动,导致明显挂起。
请注意,链接的custhelp
文章中的选项1,2或3对您的情况有效。选项4不会。