如何防止Windows GPU“超时检测和恢复”?

时间:2016-10-06 05:26:25

标签: windows opencl

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

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

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

  • 您需要确保内核不会太耗时: 内核是耗时的,虽然我可以做一些碎片而不是运行100万但是2 * 500k或4 * 250k,但我仍然无法预测它是否适合实际用户的默认2秒GPU。 (我有一半的想法,直到你的内核不会丢失CL_INVALID_COMMAND_QUEUE错误,然后你只用较小的数量调用它多次,但说实话,它听起来真的很hackie并有其他一些缺点。)

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

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

1 个答案:

答案 0 :(得分:2)

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