【问题标题】:How to prevent Windows GPU "Timeout Detection and Recovery"?如何防止 Windows GPU“超时检测和恢复”?
【发布时间】:2021-09-23 17:26:33
【问题描述】:

如果我在 GPU 设备上运行长时间运行的内核,2 秒后(默认情况下)Windows TDR (Timeout Detection and Recovery) 将终止正在运行的内核。我理解,但是如果您无法预测内核将运行多长时间,因为您需要进行大量计算,而且您也不知道运行程序的实际用户的底层 GPU 的容量/速度怎么办?

解决此问题的最佳做法是什么?

我找到了 3 种方法来防止它发生,但这些方法对我来说似乎都不是一个好的解决方案:

  • 您需要确保您的内核不会太耗时: 内核非常耗时,虽然我可以进行某种碎片化而不是运行 100 万个,而是运行 2*500k 或 4*250k,但我仍然无法预测它是否适合实际用户的默认 2 秒显卡。 (我的想法是将数字减半,直到您的内核不会丢弃 CL_INVALID_COMMAND_QUEUE 错误,然后您只需以较小的数量多次调用它,但老实说,这听起来很老套,还有其他一些缺点。)

  • 您可以关闭看门狗定时器(或增加延迟):GPU 的超时检测和恢复: 它是通过注册表编辑完成的,您需要重新启动Windows才能使其生效。你不能在用户的机器上做。

  • 您可以在未连接到显示器的 GPU 上运行内核: 如何确保 GPU 没有连接到用户机器上的显示器?即使在我的笔记本电脑中,我的主要 GPU 是 Intel HD4000 并且 NVidia GPU 没有用于显示(我认为是这样),但 TDR 仍然会杀死我的内核。

【问题讨论】:

    标签: windows opencl


    【解决方案1】:

    您列出了我所知道的所有解决方案。由于解决方案 2 在内核运行时使机器处于不可用状态(不是一个好的做法),因此应该避免使用它。由于添加另一个 GPU(解决方案 3)对您来说不切实际,因此您最好的选择是专注于解决方案 1。我不知道您为什么要尝试最大化工作大小以尽可能长时间地运行以避免 TDR。相反,您应该以大约 10 毫秒或更短的时间为目标(如果您运行许多需要更长时间的内核,则 GUI 非常缓慢)。所以不要把 4*250000 想成 400*2500。您可能需要在每个(或 10 个批次或其他)之间进行一些 clFinish 调用。保持较短的执行时间(10 毫秒)并且不会过度填充队列将允许 GPU 在内核之间执行其他操作,并且不会导致 TDR 重置,也不会使机器无法使用,但 GPU 会非常繁忙。

    【讨论】:

    • 感谢您的回答。我认为最大化工作量可以消除由多个 enqueueNDRangeKernel()-finish() 调用引起的开销。例如,如果出于测试目的,我将 TDR 设置为 10 秒并运行整个内核,它将在 4800 毫秒内完成工作,但如果我将其分成 42 个连续的内核调用,那么总和计算将占用 5900 毫秒,大约慢 20%结果。虽然好消息是较慢的版本不会在任何具有默认 2 秒 TDR 延迟的第三方计算机上触发 GPU 重启。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多