我不是 CUDA 专家,---我一直在使用 AMD Stream SDK 进行开发,据我所知,它大致相当。
您可以禁用 Windows 看门狗定时器,但那是强烈不推荐,原因应该是显而易见的。
要禁用它,您需要重新编辑HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck
,创建一个 REG_DWORD 并将其设置为 1。
您可能还需要在 NVidia 控制面板中执行某些操作。在 CUDA 文档中查找有关“VPU 恢复”的一些参考。
理想情况下,您应该能够将内核操作分解为对数据的多次传递,以将其分解为在时间限制内运行的操作。
或者,您可以划分问题域,以便每个命令计算更少的输出像素。也就是说,不是一下子计算 1,000,000 个输出像素,而是向 GPU 发出 10 个命令,每个命令计算 100,000 个。
必须适合时间片的基本单元不是整个应用程序,而是单个命令缓冲区的执行。在 AMD Stream SDK 中,通过使用 CtxFlush() 调用显式刷新命令队列,可以将长操作序列分解为多个时间片。也许CUDA有类似的东西?
你应该not必须在每个时间片上通过 PCIX 总线来回读取所有数据;您可以将纹理等保留在 GPU 本地内存中;您只是偶尔完成一些命令缓冲区,以向操作系统证明您没有陷入无限循环。
最后,GPU 是fast,因此,如果您的应用程序无法在 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 options”,然后在“General”下将“WDDM TDRenabled”设置为 false。这将为您更改注册表设置。关闭并重新启动。对 TDR 注册表设置的任何更改只有在重新启动后才会生效。
[编辑 2018 年 8 月更新:]尽管 NVIDIA 工具现在允许禁用 TDR,但 AMD/OpenCL 开发人员也面临同样的问题。对于这些:记录 TDR 设置的当前链接位于https://learn.microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys