【发布时间】:2010-10-04 14:30:01
【问题描述】:
我注意到 CUDA 应用程序在失败并退出之前往往有大约 5-15 秒的粗略最大运行时间。我意识到最好不要让 CUDA 应用程序运行那么长时间,但假设使用 CUDA 是正确的选择,并且由于每个线程的顺序工作量必须运行那么长时间,有没有办法延长这段时间或绕过它?
【问题讨论】:
我注意到 CUDA 应用程序在失败并退出之前往往有大约 5-15 秒的粗略最大运行时间。我意识到最好不要让 CUDA 应用程序运行那么长时间,但假设使用 CUDA 是正确的选择,并且由于每个线程的顺序工作量必须运行那么长时间,有没有办法延长这段时间或绕过它?
【问题讨论】:
我不是 CUDA 专家,--- 我一直在使用 AMD Stream SDK 进行开发,AFAIK 与它大致相当。
您可以禁用 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有类似的东西?
您应该不必须在每个时间片上通过 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 月更新:] 这已经过时了。假设您安装了 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 的键作为 双字。
右键选择创建一个新键REG_DWORD,并命名 TdrDelay。分配给它的值是之前的秒数 TDR 启动 - 它 > 目前在 Windows 中自动为 2(甚至 虽然注册。键值不存在>直到您创建它)。分配 它具有一个新值(我尝试了 4 秒),这使之前的时间翻了一番 TDR。然后重启电脑。您需要重新启动 PC,然后该值才会生效 工作。
来自Win7 TDR (Driver Timeout Detection & Recovery) 我也验证了这一点并且工作正常。
【讨论】:
最基本的解决方案是在计算过程中选择一个点,我确信我正在使用的 GPU 能够及时完成,保存所有状态信息并停止,然后重新开始.
更新: 对于 Linux:退出 X 将允许您根据需要运行 CUDA 应用程序。不需要 Tesla(测试时使用了 9600)
但是,需要注意的一点是,如果从未输入 X,则驱动程序可能不会被加载,并且它不会工作。
似乎对于 Linux,当时根本不显示任何 X 也可以,因此只要您屏幕到非 X 全屏终端,就不需要退出 X。
【讨论】:
这是不可能的。超时是为了防止计算中的错误长时间占用 GPU。
如果您使用专用卡进行 CUDA 工作,则取消时间限制。我不确定这是否需要 Tesla 卡,或者是否可以使用没有连接显示器的 GeForce。
【讨论】:
我使用的解决方案是:
1. 将所有信息传递给设备。
2. 运行算法的迭代版本,每次迭代都会调用已存储在设备中的内存上的内核。
3. 最后在所有迭代结束后才将内存转移到主机。
这可以控制来自 CPU 的迭代(包括中止选项),而无需昂贵的设备迭代之间的主机内存传输。
【讨论】:
看门狗定时器仅适用于带有显示器的 GPU。
在 Windows 上,计时器是 WDDM 的一部分,可以使用一些注册表项修改设置(超时、达到超时时的行为等),请参阅此Microsoft article 了解更多信息。
【讨论】:
可以在 Linux 中禁用此行为。虽然“看门狗”的目的很明显,但在使用着色器/CUDA 进行大量计算时,它可能会导致一些非常意外的结果。
可以在您的 X 配置中切换该选项(可能是 /etc/X11/xorg.conf)
在 GPU 的设备部分添加:选项“交互式”“0”即可完成这项工作。
见CUDA Visual Profiler 'Interactive' X config option?
有关配置的详细信息
和
见ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive
关于参数的描述。
【讨论】: