2016-10-06 3 views
0

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はまだ私のカーネルを殺しています。

答えて

2

私が知っているすべての解決策がリストされています。ソリューション2は、カーネルが稼働している間はマシンを使用できない状態にしてしまうので、回避する必要があります。別のGPU(ソリューション3)を追加することはあなたにとって実用的ではないので、ソリューション1に焦点を当てるのが最善の方法です。TDRを避けるためにできるだけ長く実行するようにワークサイズを最大限にしようとしている理由はわかりません。代わりに、約10ミリ秒以下をターゲットにする必要があります(GUIが非常に遅い場合は、多くのカーネルを実行すると時間がかかります)。したがって、4 * 250000の代わりに、400 * 2500のように考えてください。それぞれの間でいくつかのclFinishコール(または10のバッチなど)を入れる必要があるかもしれません。実行時間を小さくして(10ms)、キューを過度に満たしていないと、GPUはカーネル間で他のことを行うことができます.TDRのリセットやマシンの使用不能にはなりませんが、GPUはかなりビジーです。

+0

お返事ありがとうございます。私は仕事のサイズを最大化すると、複数のenqueueNDRangeKernel() - finish()呼び出しによって引き起こされるオーバーヘッドをなくすことができると考えました。たとえば、テスト目的のためにTDRを10秒に設定し、カーネル全体を実行すると、4800msでジョブが終了しますが、42回の連続したカーネル呼び出しに分割すると合計計算は5900msになり、約20%遅くなります結果。良いことは、遅いバージョンでは、デフォルトの2秒のTDR遅延でサードパーティのコンピュータでGPUを再起動することはありません。 – FineCutBodies

関連する問題