GPUデバイスで長時間実行しているカーネルを実行すると、2秒後(デフォルト)にWindows TDR(Timeout Detection and Recovery)が実行中のカーネルを強制終了します。私はそれを理解していますが、多くの計算を行う必要があるため、実際のユーザー、プログラムを実行する基盤GPUの容量/速度を知ることができないため、カーネルの実行時間を予測できない場合はどうすればよいですか?Windows GPUの「タイムアウトの検出と回復」を防ぐには?
この問題を解決するためのベストプラクティスは何ですか?
私が起こるためにそれを防止するための3つの方法を見つけましたが、それらのどれも私のために良い解決策だと思わない:
あなたのカーネルがあまりにも時間がかかりていないことを確認する必要があります。 カーネルは時間がかかりますが、何らかの断片化を行い、100万回実行することはできませんが、2 * 500kまたは4 * 250kを実行することはできますが、実際のユーザーの2秒間に収まるかどうかはまだ予測できませんGPU。 (あなたのカーネルがCL_INVALID_COMMAND_QUEUEエラーを落とさないようにするまで、私は半分の数のアイデアを持っていました。そして、少量で複数回呼び出すだけですが、本当にハッキリと聞こえ、いくつかの欠点があります)。
タイムアウトの検出とGPUの復旧: これはレジストリの編集によって行われ、Windowsを再起動して有効にする必要があります。ユーザーのマシンでは実行できません。
あなたは、ディスプレイにフックアップされていないGPU上でカーネルを実行することができます: はどのようにGPUは、ユーザーのマシン上のディスプレイにフックアップされていないことを確認することができますか?私のラップトップでも、私のプライマリGPUはIntel HD4000で、NVidia GPUは表示用に使用されていませんが、TDRはまだ私のカーネルを殺しています。
お返事ありがとうございます。私は仕事のサイズを最大化すると、複数のenqueueNDRangeKernel() - finish()呼び出しによって引き起こされるオーバーヘッドをなくすことができると考えました。たとえば、テスト目的のためにTDRを10秒に設定し、カーネル全体を実行すると、4800msでジョブが終了しますが、42回の連続したカーネル呼び出しに分割すると合計計算は5900msになり、約20%遅くなります結果。良いことは、遅いバージョンでは、デフォルトの2秒のTDR遅延でサードパーティのコンピュータでGPUを再起動することはありません。 – FineCutBodies