web-dev-qa-db-ja.com

CUDAアプリは数秒後にタイムアウトして失敗します-これを回避するにはどうすればよいですか?

CUDAアプリケーションは、失敗して終了するまでの最大実行時間が5〜15秒になる傾向があることに気づきました。 CUDAアプリケーションをそれほど長く実行しないことが理想的ですが、CUDAを使用することが正しい選択であり、スレッドごとの順次作業の量のために、それを長く実行する必要があると仮定すると、この時間を延長する方法はありますか?それを回避するには?

30
rck

私はCUDAの専門家ではありません。---AMDStream SDKを使用して開発してきましたが、AFAIKはほぼ同等です。

Windowsウォッチドッグタイマーを無効にすることはできますが、それは強くお勧めしません。明らかです。これを無効にするには、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheckを登録し、REG_DWORDを作成して、1に設定する必要があります。NVidiaコントロールパネルで何かを行う必要がある場合もあります。 CUDAドキュメントで「VPUリカバリ」への参照を探してください。

理想的には、カーネル操作をデータの複数のパスに分割して、制限時間内に実行される操作に分割できる必要があります。

または、問題のドメインを分割して、コマンドごとに計算する出力ピクセルを少なくすることもできます。つまり、1回の急降下で1,000,000の出力ピクセルを計算する代わりに、GPUに10個のコマンドを発行して、それぞれ100,000を計算します。

タイムスライス内に収まらなければならない基本単位は、アプリケーション全体ではなく、単一のコマンドバッファーの実行です。 AMD Stream SDKでは、CtxFlush()呼び出しでコマンドキューを明示的にフラッシュすることにより、長い一連の操作を複数のタイムスライスに分割できます。おそらくCUDAには似たようなものがありますか?

タイムスライスごとにPCIXバスを介してすべてのデータを前後に読み取る必要はありません。テクスチャなどをGPUローカルメモリに残すことができます。無限ループに陥っていないことをOSに証明するために、コマンドバッファがときどき完成するだけです。

最後に、GPUは高速なので、アプリケーションがその5秒または10秒で有用な作業を実行できない場合は、何かが間違っていることを示していると考えます。

[2010年3月に編集して更新:](再び古くなっています。最新情報については、以下の更新を参照してください)上記のレジストリキーは古くなっています。それがWindowsのキーだったと思いますXP 64ビット。VistaとWindows7の新しいレジストリキーがあります。ここで見つけることができます: http://www.Microsoft .com/whdc/device/display/wddm_timeout.mspx またはここ: http://msdn.Microsoft.com/en-us/library/ee817001.aspx

[2015年4月に編集して更新:]これは本当に時代遅れになっています。 NVIDIA Nsightツールがインストールされている場合、CudaプログラミングのTDRを無効にする最も簡単な方法は、Nsightモニターを開き、[Nsightモニターオプション]をクリックして、[一般]で[WDDMTDRを有効にする]をfalseに設定することです。これにより、レジストリ設定が変更されます。閉じて再起動します。 TDRレジストリ設定への変更は、再起動するまで有効になりません。

[2018年8月に編集して更新:]NVIDIAツールではTDRを無効にできるようになりましたが、AMD/OpenCL開発者にも同じ質問が当てはまります。それらの場合:TDR設定を文書化した現在のリンクは https://docs.Microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys

26
Die in Sente

Windowsでは、グラフィックスドライバーにウォッチドッグタイマーがあり、5秒以上実行されているシェーダープログラムを強制終了します。 Xorg/XFree86ドライバーはこれを行わないため、考えられる回避策の1つは、LinuxでCUDAアプリを実行することです。

AFAIKでは、Windowsでウォッチドッグタイマーを無効にすることはできません。 Windowsでこれを回避する唯一の方法は、画面が表示されていない2枚目のカードを使用することです。テスラである必要はありませんが、アクティブな画面があってはなりません。

タイムアウトの検出と回復を解決する-WINDOWS7(32/64ビット)

Windowsでレジストリキーを作成して、TDR設定をより高い量に変更します。これにより、Windowsは、TDRプロセスが開始するまでの遅延を長くすることができます。

RunまたはDOSからRegeditを開きます。

Windows 7では、正しいレジストリキー領域に移動して、新しいキーを作成します。

HKEY_LOCAL_MACHINE> SYSTEM> CurrentControlSet> Control> GraphicsDrivers

おそらくそこには、DWordとしてDxgKrnlVersionと呼ばれる1つのキーがあります。

右クリックして選択し、新しいキーREG_DWORDを作成し、名前を付けますTdrDelay。割り当てられた値は、TDRが開始されるまでの秒数です。現在、Windowsでは自動的に2になります(登録キーの値は作成するまで存在しません)。 TDRまでの時間を2倍にする新しい値(4秒試しました)を割り当てます。その後、PCを再起動します。値が機能する前に、PCを再起動する必要があります。

ソース Win7 TDR(Driver Timeout Detection&Recovery) 私もこれを確認し、正常に動作します。

8
BugShotGG

最も基本的な解決策は、使用しているGPUが時間内に完了し、すべての状態情報を保存して停止し、再開できると確信できる途中のポイントを計算で選択することです。

更新:Linuxの場合:Xを終了すると、CUDAアプリケーションを好きなだけ実行できるようになります。テスラは必要ありません(これをテストするために9600が使用されました)

ただし、Xを入力しないと、ドライバーがロードされず、機能しない可能性があることに注意してください。

また、Linuxの場合、その時点でXディスプレイが表示されていなくても機能するようです。したがって、X以外のフルスクリーン端末に画面を表示する限り、Xを終了する必要はありません。

5
rck

これは不可能です。タイムアウトは、計算のバグがGPUを長期間使用するのを防ぐためにあります。

CUDA作業専用のカードを使用すると、制限時間が解除されます。これにTeslaカードが必要かどうか、またはモニターが接続されていないGeForceを使用できるかどうかはわかりません。

5
Branan

ウォッチドッグタイマーは、ディスプレイが接続されているGPUにのみ適用されます。

Windowsでは、タイマーはWDDMの一部であり、いくつかのレジストリキーを使用して設定(タイムアウト、タイムアウトに達したときの動作など)を変更できます。詳細については、これを参照してください Microsoftの記事

3
Tom

私が使用する解決策は次のとおりです。

1。すべての情報をデバイスに渡します。
2。アルゴリズムの反復バージョンを実行します。反復ごとに、デバイス内にすでに格納されているメモリでカーネルが呼び出されます。
3。最後に、すべての反復が終了した後にのみ、メモリをホストに転送します。

これにより、コストのかかるデバイス<->反復間のホストメモリ転送なしで、CPUからの反復(​​中止するオプションを含む)を制御できます。

3
Danny Varod

Linuxではこの動作を無効にすることができます。 「ウォッチドッグ」には明らかな目的がありますが、シェーダー/ CUDAを使用して大規模な計算を行うと、非常に予期しない結果が生じる可能性があります。

このオプションは、X構成で切り替えることができます(おそらく/etc/X11/xorg.conf)

追加:GPUのデバイスセクションにオプション「インタラクティブ」「0」が機能します。

CUDA Visual Profiler'Interactive 'X config option? を参照してください。

設定の詳細については

そして

ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive を参照してください。

パラメータの説明について。

2
Steven B