我注意到 CUDA 应用程序在失败并退出之前往往有大约 5-15 秒的粗略最大运行时间。我意识到最好不要让 CUDA 应用程序运行那么长时间,但假设使用 CUDA 是正确的选择,并且由于每个线程的顺序工作量必须运行那么长时间,有没有办法延长这段时间或绕过它?
8 回答
我不是 CUDA 专家,--- 我一直在使用 AMD Stream SDK 进行开发,AFAIK 与它大致相当。
您可以禁用 Windows 看门狗计时器,但强烈建议不要这样做,原因应该很明显。要禁用它,您需要 regedit 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有类似的东西?
您不必在每个时间片上通过 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 工具,为 Cuda 编程禁用 TDR 的最简单方法是打开 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 进程开始之前允许更长的延迟。
从运行或 DOS 打开 Regedit。
在 Windows 7 中导航到正确的注册表项区域,以创建新项:
HKEY_LOCAL_MACHINE>SYSTEM>CurrentControlSet>Control>GraphicsDrivers。
那里可能会有一个名为 DxgKrnlVersion 的键作为 DWord。
右键单击并选择创建一个新键REG_DWORD,并将其命名为 TdrDelay。分配给它的值是 TDR 启动前的秒数 - 它 > 当前在 Windows 中自动为 2(即使 reg. 键值不存在 > 直到您创建它)。为它分配一个新值(我尝试了 4 秒),这使 TDR 之前的时间加倍。然后重启电脑。您需要重新启动 PC 才能使该值生效。
来自Win7 TDR(驱动程序超时检测和恢复)的来源 我也验证了这一点并且工作正常。
最基本的解决方案是在计算过程中选择一个点,我确信我正在使用的 GPU 能够及时完成,保存所有状态信息并停止,然后重新开始。
更新:对于 Linux:退出 X 将允许您根据需要运行 CUDA 应用程序。不需要特斯拉(测试时使用了 9600)
然而,需要注意的一件事是,如果从未输入 X,驱动程序可能不会被加载,并且它不会工作。
似乎对于 Linux,当时根本不显示任何 X 也可以,因此只要您屏幕到非 X 全屏终端,就不需要退出 X。
这是不可能的。超时是为了防止计算中的错误长时间占用 GPU。
如果您使用专用卡进行 CUDA 工作,则取消时间限制。我不确定这是否需要 Tesla 卡,或者是否可以使用没有连接显示器的 GeForce。
看门狗定时器仅适用于带有显示器的 GPU。
在 Windows 上,计时器是 WDDM 的一部分,可以使用某些注册表项修改设置(超时、达到超时时的行为等),有关详细信息,请参阅此Microsoft 文章。
我使用的解决方案是:
1. 将所有信息传递给设备。
2. 运行算法的迭代版本,其中每次迭代调用已经存储在设备中的内存上的内核。
3. 最后只有在所有迭代结束后才将内存转移到主机。
这可以控制来自 CPU 的迭代(包括中止选项),而无需在迭代之间进行昂贵的设备<-->主机内存传输。
可以在 Linux 中禁用此行为。尽管“看门狗”有一个明显的目的,但在使用着色器/CUDA 进行大量计算时,它可能会导致一些非常意外的结果。
该选项可以在您的 X 配置中切换(可能是 /etc/X11/xorg.conf)
添加:将选项“交互式”“0”添加到 GPU 的设备部分即可完成这项工作。
请参阅CUDA Visual Profiler 'Interactive' X 配置选项?
有关配置的详细信息
和
请参阅ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive
有关参数的说明。