当前位置:  开发笔记 > 运维 > 正文

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

如何解决《CUDA应用程序在几秒钟后超时和失败-如何解决这个问题?》经验,为你挑选了4个好方法。

我注意到CUDA应用程序在失败并退出之前往往有5-15秒的粗略最大运行时间.我意识到没有CUDA应用程序运行那么久是理想的,但假设它是使用CUDA的正确选择,并且由于每个线程的顺序工作量必须运行那么长,有没有办法延长这个时间或者绕过它?



1> Die in Sente..:

我不是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


我不是SIMD程序员,也不是在电视上播放,但恕我直言,有点过于笼统地说"最后,GPU很快,所以如果你的应用程序无法在5或10秒内完成有用的工作,我认为这是一个错误的迹象." 在科学应用程序中(比如经常使用CUDA),有时你只需要计算很多东西.

2> ConcernedOfT..:

在Windows上,图形驱动程序具有监视程序计时器,可以杀死运行时间超过5秒的任何着色器程序.请注意,Xorg/XFree86驱动程序不执行此操作,因此一种可能的解决方法是在Linux上运行CUDA应用程序.

AFAIK无法在Windows上禁用监视程序计时器.在Windows上解决此问题的唯一方法是使用第二张没有显示屏幕的卡片.它不一定是特斯拉,但它必须没有活动屏幕.


实际上,在Windows上,任何带有WDDM驱动程序的设备都会出现看门狗定时器问题,无论是否附加了显示器.NVIDA Tesla卡通过使用完全不同类型的驱动程序(TCC或Tesla计算群集)驱动程序来解决这个问题,该驱动程序不会将OS识别为OS作为显示适配器.如果您只是插入没有连接显示器的第二个视频卡(Radeon或GeForce),它仍然会被操作系统识别为WDDM显示适配器设备,并且看门狗定时器仍然适用.

3> BugShotGG..:

解决超时检测和恢复 - 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(驱动程序超时检测和恢复)的来源 我也验证了这一点并且工作正常.



4> rck..:

最基本的解决方案是在计算中选择一个点,通过我确定我正在使用的GPU能够及时完成,保存所有状态信息并停止,然后再次启动.

更新:对于Linux:退出X将允许您根据需要运行CUDA应用程序.不需要特斯拉(9600用于测试)

但有一点需要注意的是,如果从未输入X,则可能无法加载驱动程序,也无法运行.

对于Linux来说,似乎当时没有任何X显示也可以工作,所以只要你屏幕到非X全屏终端,就不需要退出X.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有