C++ 多个CUDA流导致GPU崩溃

C++ 多个CUDA流导致GPU崩溃,c++,cuda,gpu,nvidia,cuda-streams,C++,Cuda,Gpu,Nvidia,Cuda Streams,这是这篇文章的延续 似乎通过添加volitile解决了一个特例,但现在其他东西坏了。如果在两个内核调用之间添加任何内容,系统将恢复到旧的行为,即立即冻结并打印所有内容。此行为通过添加睡眠(2)来显示;在set_flag和read_flag之间。另外,当放入另一个程序时,这会导致GPU锁定。我现在做错了什么 再次感谢。有一个与X和显示驱动程序的交互,以及标准输出队列,它与图形显示驱动程序的交互 您可以尝试一些实验,(在set_标志和read_标志内核之间添加sleep(2);): 通过ssh从另一

这是这篇文章的延续

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


再次感谢。

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

您可以尝试一些实验,(在
set_标志
read_标志
内核之间添加
sleep(2);
):

  • 通过ssh从另一台计算机通过网络登录到您的计算机。我认为你的计划会奏效。(在这种情况下,X不参与显示)
  • 注释出打印“开始…”的行,我认为您的 然后,该程序将起作用。(这避免了显示驱动程序/打印队列死锁,请参见下文)
  • 添加一个
    睡眠(2)在“开始…”打印行和第一个内核之间。我认为你的计划会奏效。(这允许显示驱动程序在启动第一个内核之前完全服务于第一个打印输出,因此不会出现CPU线程暂停。)
  • 停止X并从控制台运行。我认为你的计划会奏效
  • 当GPU同时承载X显示和运行CUDA任务时,它必须在两者之间切换。在CUDA任务期间,普通显示处理暂停。你可以阅读更多关于这方面的内容

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


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

    您在windows上吗?您的机器配置是什么?(操作系统,GPU,CUDA版本,其他GPU,如果有的话,等等)我正在使用Ubuntu12.04和GeForce GTX 650.add来添加你的代码,特别是在内核上。我相信它会告诉你一些事情。我怀疑与X发生了交互。您是否在GTX650上运行X(即,您是否有GTX650托管的图形显示)?我假设我在GTX650上运行X,因为我有两个监视器连接到它。这种行为在其他情况下不会出现,但在尝试实现我所描述的行为时会一直出现。另一个问题是,由于程序冻结,我无法恢复任何错误。谢谢你的建议。如果我断开显示器与GPU的连接,是否可以获得绕过X的相同效果,或者这仍然会导致冲突?断开显示器不会有帮助。但是,从GTX650 GPU中删除X服务器会有所帮助。这需要对xorg.conf文件进行修改,详细信息超出了我在评论中所能涵盖的范围。很明显,这意味着GTX650将无法显示任何内容。请重复我的评论。我说的一件事是通过SSH登录到您的机器,并且以这种方式运行,至少基于我的测试,它将解决这个问题。因此,如果断开监控器的连接意味着您要远程登录,那么“断开监控器的连接”会有所帮助。我使用SSH远程登录,但无法获得所需的操作。我可以让打印工作(与断开显示器的连接相同),但设备实际上并没有完成。我打印出所有的错误代码,它们都返回0。我又卡住了。