【发布时间】: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 仍然会杀死我的内核。
【问题讨论】: