【问题标题】:CUDA apps time out & fail after several seconds - how to work around this?CUDA 应用程序在几秒钟后超时并失败 - 如何解决这个问题?
【发布时间】:2010-10-04 14:30:01
【问题描述】:

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

【问题讨论】:

    标签: cuda timeout gpgpu gpu


    【解决方案1】:

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

    【讨论】:

    • 我不是 SIMD 程序员,我也不会在电视上播放一个,但恕我直言,说“最后,GPU 很快,所以如果你的应用程序无法做到在那 5 或 10 秒内有用的工作,我认为这是有问题的迹象。”在科学应用程序中(例如 CUDA 经常用于的应用程序),有时您需要计算的东西很多。
    • 圣哈辛托:见下面汤姆的回答。在您正在计算的 GPU 也是您的显示 GPU 的情况下,超时是合理的。在不用于显示的情况下,您有更多选择。
    • 说不应该禁用看门狗绝对是错误的。看门狗完全坏了:它会在调试器中单步执行时触发,而且它往往会在多显示器/显示端口配置中完全冻结系统,这对任何人都没有任何帮助。
    • @Glenn。 NSight Cuda 调试器具有软件抢占模式,因此当您使用调试器单步执行时,它不会触发 TDR。在 NSight 选项菜单下查找它。如果您使用的是连接了显示器的 GPU,调试器将自动使用该模式。如果您使用的 GPU 没有连接显示器,那么关闭 TDR 或将其设置为非常长的值是合理的。
    • 鉴于看门狗严重崩溃了我的整个系统(具有使我的两个显示器痉挛闪烁的可爱副作用,并使我的扬声器发出 DMA 循环噪音),我想我会坚持下去将其关闭。
    【解决方案2】:

    在 Windows 上,图形驱动程序有一个看门狗计时器,它会终止所有运行超过 5 秒的着色器程序。请注意,Xorg/XFree86 驱动程序不这样做,因此一种可能的解决方法是在 Linux 上运行 CUDA 应用程序。

    AFAIK 无法在 Windows 上禁用看门狗计时器。在 Windows 上解决此问题的唯一方法是使用第二张没有显示屏幕的卡。它不必是特斯拉,但它必须没有活动屏幕。

    【讨论】:

    • 实际上,在 Windows 上,任何带有 WDDM 驱动程序的设备都会出现看门狗定时器问题,无论它是否连接了显示器。 NVIDA Tesla 卡通过使用完全不同类型的驱动程序(TCC 或 Tesla Compute Cluster)驱动程序来解决此问题,该驱动程序不会将 GPU 识别为操作系统作为显示适配器。如果您只是插入第二个没有连接显示器的显卡(Radeon 或 GeForce),它仍然会被操作系统识别为 WDDM 显示适配器设备,并且看门狗定时器仍然适用。
    【解决方案3】:

    解决超时检测和恢复 - 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) 我也验证了这一点并且工作正常。

    【讨论】:

      【解决方案4】:

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

      更新: 对于 Linux:退出 X 将允许您根据需要运行 CUDA 应用程序。不需要 Tesla(测试时使用了 9600)

      但是,需要注意的一点是,如果从未输入 X,则驱动程序可能不会被加载,并且它不会工作。

      似乎对于 Linux,当时根本不显示任何 X 也可以,因此只要您屏幕到非 X 全屏终端,就不需要退出 X。

      【讨论】:

      【解决方案5】:

      这是不可能的。超时是为了防止计算中的错误长时间占用 GPU。

      如果您使用专用卡进行 CUDA 工作,则取消时间限制。我不确定这是否需要 Tesla 卡,或者是否可以使用没有连接显示器的 GeForce。

      【讨论】:

      • 确定是哪种情况会很有用。我将不得不尝试没有连接显示器的非特斯拉卡并找出答案。
      • 我刚试过这个。不需要特斯拉卡。使用 Linux,我实际上只是懒得进入 X 并且限制被解除。
      • 所以,正如其他答案所暗示的那样,这实际上是可能的......你能改写你的答案吗?
      【解决方案6】:

      我使用的解决方案是:

      1. 将所有信息传递给设备。
      2. 运行算法的迭代版本,每次迭代都会调用已存储在设备中的内存上的内核。
      3. 最后在所有迭代结束后才将内存转移到主机。

      这可以控制来自 CPU 的迭代(包括中止选项),而无需昂贵的设备迭代之间的主机内存传输。

      【讨论】:

        【解决方案7】:

        看门狗定时器仅适用于带有显示器的 GPU。

        在 Windows 上,计时器是 WDDM 的一部分,可以使用一些注册表项修改设置(超时、达到超时时的行为等),请参阅此Microsoft article 了解更多信息。

        【讨论】:

        • 嗨,Tom,我已经修改了看门狗定时器(大约 6 天),并设法让单个内核运行 40 秒。我刚刚尝试运行一个更大的,但我不断收到“ErrorLaunch TimeOut”错误。我只有一个 GPU,所以我想知道是否有其他东西可能会迫使 gpu 在完成内核之前做出响应,尤其是因为它应该只需要大约 4-5 分钟即可运行并且超时设置为这样大数字?谢谢你的时间,我真的很感激。
        【解决方案8】:

        可以在 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

        关于参数的描述。

        【讨论】:

          猜你喜欢
          • 2021-06-06
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 2022-07-26
          • 2014-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多