我注意到CUDA应用程序在失败并退出之前往往有5-15秒的粗略最大运行时间.我意识到没有CUDA应用程序运行那么久是理想的,但假设它是使用CUDA的正确选择,并且由于每个线程的顺序工作量必须运行那么长,有没有办法延长这个时间或者绕过它?
我不是CUDA专家,---我一直在使用AMD Stream SDK进行开发,AFAIK与AFAIK大致相当.
您可以禁用Windows监视程序计时器,但这是非常不推荐的,原因应该是显而易见的.要禁用它,你需要注册表编辑器HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck
,创建一个REG_DWORD并将其设置为1,您可能还需要做一些在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 /库/ ee817001.aspx
[编辑2015年4月更新: ]这已经过时了.假设您安装了NVIDIA Nsight工具,禁用TUD进行Cuda编程的最简单方法是打开Nsight Monitor,单击"Nsight Monitor options",然后在"General"下将"WDDM TDR enabled"设置为false.这将更改您的注册表设置.关闭并重启.重新启动后,对TDR注册表设置的任何更改都不会生效.
[编辑2018年8月更新:] 尽管NVIDIA工具现在允许禁用TDR,但同样的问题与AMD/OpenCL开发人员相关.对于那些:记录TDR设置的当前链接位于https://docs.microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys
在Windows上,图形驱动程序具有监视程序计时器,可以杀死运行时间超过5秒的任何着色器程序.请注意,Xorg/XFree86驱动程序不执行此操作,因此一种可能的解决方法是在Linux上运行CUDA应用程序.
AFAIK无法在Windows上禁用监视程序计时器.在Windows上解决此问题的唯一方法是使用第二张没有显示屏幕的卡片.它不一定是特斯拉,但它必须没有活动屏幕.
解决超时检测和恢复 - WINDOWS 7(32/64位)
在Windows中创建一个注册表项以将TDR设置更改为更高的数量,以便Windows在TDR进程启动之前允许更长的延迟.
从Run或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(驱动程序超时检测和恢复)的来源 我也验证了这一点并且工作正常.
最基本的解决方案是在计算中选择一个点,通过我确定我正在使用的GPU能够及时完成,保存所有状态信息并停止,然后再次启动.
更新:对于Linux:退出X将允许您根据需要运行CUDA应用程序.不需要特斯拉(9600用于测试)
但有一点需要注意的是,如果从未输入X,则可能无法加载驱动程序,也无法运行.
对于Linux来说,似乎当时没有任何X显示也可以工作,所以只要你屏幕到非X全屏终端,就不需要退出X.