我注意到CUDA应用程序在运行时间达到5-15秒后通常会失败并退出。我知道最好不要让CUDA应用程序运行那么长时间,但是假设使用CUDA是正确的选择,并且由于每个线程的顺序工作量很大,必须运行那么长时间,是否有任何方法可以延长这段时间或绕过这个问题?
我不是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
来源于Win7 TDR (驱动程序超时检测和恢复) 我也验证过,它可以正常工作。
这是不可能的。超时设置是为了防止计算中的错误占用GPU长时间。
如果您使用专用显卡进行CUDA工作,则超时限制将被取消。我不确定这是否需要Tesla卡,或者是否可以使用未连接显示器的GeForce。
看门狗计时器仅适用于连接有显示器的GPU。
在Windows上,计时器是WDDM的一部分,可以使用一些注册表键修改设置(超时时间、到达超时后的行为等),有关更多信息,请参见此Microsoft文章。