CUDA应用程序在几秒钟后超时并失败 - 如何解决这个问题?

32

我注意到CUDA应用程序在运行时间达到5-15秒后通常会失败并退出。我知道最好不要让CUDA应用程序运行那么长时间,但是假设使用CUDA是正确的选择,并且由于每个线程的顺序工作量很大,必须运行那么长时间,是否有任何方法可以延长这段时间或绕过这个问题?

8个回答

28

我不是CUDA专家,但我一直在使用AMD Stream SDK进行开发,就我所知大致上是可以比较的。

您可以禁用Windows的看门狗定时器,但强烈不建议这样做,原因显而易见。要禁用它,您需要在注册表中创建一个REG_DWORD,并将其设置为1,路径是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck。 您可能还需要在NVidia控制面板中进行一些设置。 在CUDA文档中寻找关于“VPU Recovery”的参考。

理想情况下,您应该能够将内核操作拆分为多个对数据的传递,以将其拆分为在时间限制内运行的操作。

或者,可以将问题域划分为每个命令计算更少输出像素的方式。 即,不要一口气计算1,000,000个输出像素,而是向gpu发出10个命令,每个命令计算100,000个像素。

必须适应时间片的基本单元不是整个应用程序,而是执行单个命令缓冲区。 在AMD Stream SDK中,通过使用CtxFlush()调用来明确刷新命令队列,可以将长序列的操作分解成多个时间片。或许CUDA也有类似的功能吧?

您不应该在每个时间片上都将所有数据来回读取到PCIX总线上;您可以将纹理等存储在gpu本地内存中;只需偶尔完成一些命令缓冲区,以向操作系统证明您没有陷入无限循环即可。

最后,GPU运算速度非常快,因此如果您的应用程序在这5或10秒内无法执行有用的工作,那么我会将其视为某些问题的征兆。

[编辑 2010 年 3 月更新:] (已过时,请看下面的更新以获取最新信息) 上述注册表键已经过时了。我想那是适用于 Windows XP 64 位版本的键。现在,Vista 和 Windows 7 的注册表有新的键。你可以在这里找到它们:http://www.microsoft.com/whdc/device/display/wddm_timeout.mspx 或者在这里:http://msdn.microsoft.com/en-us/library/ee817001.aspx

[编辑 2015 年 4 月更新:] 这已经非常过时了。禁用 Cuda 编程的 TDR 最简单的方法(假设你已经安装了 NVIDIA Nsight 工具),是打开 Nsight Monitor,单击“Nsight Monitor 选项”,在“一般”下将“启用 WDDM TDR”设置为 false。这将为你更改注册表设置。关闭并重新启动。对 TDR 注册表设置的任何更改在重启之前都不会生效。

[编辑 2018 年 8 月更新:] 尽管 NVIDIA 工具现在允许禁用 TDR,但同样的问题对 AMD/OpenCL 开发者也是相关的。对于他们来说,当前记录 TDR 设置的链接在这里:https://learn.microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys


15
我不是一个SIMD程序员,也不在电视上扮演那样的角色,但我认为说“最后,GPU很快,所以如果你的应用程序不能在5或10秒钟内完成有用的工作,我会把这看作是某些问题的信号”有点太笼统了。在科学应用程序中(比如CUDA经常用于的应用程序),有时候你需要进行大量计算。 - San Jacinto
绝对不能说看门狗不应该被禁用。看门狗完全失效:在调试器中单步执行时会触发它,而且在多显示器/DisplayPort配置中往往会完全冻结系统,这对任何人都没有帮助。 - Glenn Maynard
@Glenn。NSight Cuda调试器具有软件抢占模式,因此在使用调试器进行单步调试时不会触发TDR。请在NSight选项菜单中查找它。如果您正在使用连接了显示器的GPU,则调试器将自动使用该模式。如果您正在使用未连接显示器的GPU,则关闭TDR或将其设置为非常长的值是合理的。 - Die in Sente
@Glenn,除非您仍在运行Windows XP,否则TDR不应该导致整个系统崩溃。它应该只是重置/重新启动WDDM驱动程序。显示器应该会短暂地变黑然后恢复。当然,任何使用GPU的应用程序(Cuda或图形)都将丢失上下文并可能崩溃,但您描述的症状不应该发生在TDR中。 - Die in Sente
@DieinSente 理想主义很美好,但在现实世界中,它确实会让我的Windows 7崩溃。 - Glenn Maynard
显示剩余6条评论

10
在Windows系统中,显卡驱动程序有一个看门狗定时器,会在超过5秒运行的着色器程序中终止。请注意,Xorg/XFree86驱动程序不会这样做,因此一种可能的解决方法是在Linux上运行CUDA应用程序。
据我所知,在Windows上无法禁用看门狗定时器。在Windows上解决这个问题的唯一方法是使用另一张没有显示屏的卡。它不必是一张Tesla,但必须没有活动的屏幕。

5
实际上,在Windows系统中,任何具有WDDM驱动程序的设备都会存在看门狗定时器问题,无论它是否连接显示器。NVIDA Tesla卡通过拥有完全不同类型的驱动程序(TCC或Tesla计算集群驱动程序)来解决这个问题,该驱动程序不会将GPU识别为显示适配器并呈现给操作系统。如果您只是插入一个没有连接显示器的第二个视频卡(如Radeon或GeForce),操作系统仍将将其识别为WDDM显示适配器设备,并且仍然会应用看门狗定时器。 - Die in Sente

9
解决超时检测和恢复问题 - WINDOWS 7(32/64位)
在Windows中创建一个注册表键来更改TDR设置以延长TDR进程启动前的延迟时间。
从运行或DOS中打开Regedit。
在Windows 7中导航到正确的注册表键区域以创建新键:HKEY_LOCAL_MACHINE> SYSTEM> CurrentControlSet> Control> GraphicsDrivers。
那里可能有一个名为DxgKrnlVersion的DWord键。
右键单击并选择创建一个新的REG_DWORD键,并将其命名为TdrDelay。分配给它的值是TDR启动之前的秒数 - 在Windows中自动为2(即使reg.键值不存在,直到您创建它)。将其分配一个新值(我尝试了4秒),这会将TDR之前的时间加倍。然后重新启动PC。在该值起作用之前,您需要重新启动PC。

来源于Win7 TDR (驱动程序超时检测和恢复) 我也验证过,它可以正常工作。


5
最基本的解决方案是在计算中选择一个百分比,确保我使用的GPU能够及时完成,保存所有状态信息并停止,然后重新开始。
更新: 对于Linux:退出X将允许您运行CUDA应用程序,时间没有限制。不需要特斯拉(在测试中使用了9600)。
但需要注意的是,如果从未进入X,则驱动程序可能不会加载,因此无法工作。
另外,在Linux中,似乎只要没有任何X显示器,也可以工作,因此只要将屏幕切换到非X全屏终端即可,无需退出X。

如果您没有加载X,则可以使用脚本加载CUDA驱动程序。有关更多信息,请查看入门指南(http://developer.download.nvidia.com/compute/cuda/3_2_prod/docs/Getting_Started_Linux.pdf)。 - Tom

4

这是不可能的。超时设置是为了防止计算中的错误占用GPU长时间。

如果您使用专用显卡进行CUDA工作,则超时限制将被取消。我不确定这是否需要Tesla卡,或者是否可以使用未连接显示器的GeForce。


确定这些情况中的哪一种会很有用。我将尝试使用没有连接显示器的非特斯拉卡并找出答案。 - rck
2
我刚试了一下。不需要特斯拉卡。使用Linux,我实际上没有进入X,限制被解除了。 - rck
因此,如其他答案所建议,这实际上是可能的... 你能重新表述你的回答吗? - einpoklum

3

看门狗计时器仅适用于连接有显示器的GPU。

在Windows上,计时器是WDDM的一部分,可以使用一些注册表键修改设置(超时时间、到达超时后的行为等),有关更多信息,请参见此Microsoft文章


嗨Tom,我已经修改了看门狗定时器(约为6天),并成功让单个内核运行了40秒。我刚刚尝试运行一个显著更大的内核,但一直出现“ErrorLaunch TimeOut”错误。我只有一个GPU,所以想知道是否有其他东西会在内核完成之前强制GPU响应,特别是因为它只需要大约4-5分钟就可以运行,而超时设置为如此之大?感谢您的时间,我非常感激。 - Hans Rudel

3
我使用的解决方案是:

1. 将所有信息传递给设备。
2. 运行迭代版本的算法,其中每个迭代在设备内存上调用内核。
3. 最后在所有迭代结束后仅将内存传输到主机。

这样可以通过 CPU(包括中止选项)对迭代进行控制,避免了迭代之间昂贵的设备<-->主机内存传输。

2
在Linux中可以禁用这种行为。虽然“看门狗”有明显的目的,但在使用着色器/CUDA进行大量计算时可能会导致一些非常意外的结果。
可以在X配置中切换选项(可能是/etc/X11/xorg.conf)。
在GPU设备部分添加:Option "Interactive" "0" 即可完成工作。
详见CUDA Visual Profiler 'Interactive' X config option? 有关配置的详细信息,请参见:
以及 ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive
有关该参数的描述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接