CUDA アプリケーションは、失敗して終了するまでの最大実行時間が 5 ~ 15 秒になる傾向があることに気付きました。CUDAアプリケーションをそれほど長く実行しないことが理想的であることは理解していますが、CUDAを使用するのが正しい選択であり、スレッドごとのシーケンシャル作業の量のためにそれを長く実行する必要があるため、この時間を延長する方法はありますか?それを回避するには?
8 に答える
私はCUDAの専門家ではありません---私はAMD Stream SDKを使用して開発してきましたが、これはAFAIKがほぼ同等です。
Windows ウォッチドッグ タイマーを無効にすることはできますが、明らかな理由から、これは強くお勧めしません。これを無効にするには、regedit を実行しHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck
、REG_DWORD を作成して 1 に設定する必要があります。また、NVidia コントロール パネルで何かを行う必要がある場合もあります。CUDA ドキュメントで「VPU Recovery」への参照を探してください。
理想的には、カーネル操作をデータの複数のパスに分割して、制限時間内に実行される操作に分割できる必要があります。
または、問題領域を分割して、コマンドごとに計算される出力ピクセルを少なくすることもできます。つまり、1,000,000 個の出力ピクセルを一気に計算する代わりに、GPU に 10 個のコマンドを発行して、それぞれ 100,000 個を計算します。
タイム スライス内に収まる必要がある基本単位は、アプリケーション全体ではなく、単一のコマンド バッファーの実行です。AMD Stream SDK では、CtxFlush() 呼び出しでコマンド キューを明示的にフラッシュすることで、長い一連の操作を複数のタイム スライスに分割できます。おそらくCUDAにも似たようなものがありますか?
すべてのタイム スライスで、PCIX バスを介してすべてのデータを前後に読み取る必要はありません。テクスチャなどを GPU ローカル メモリに残すことができます。無限ループに陥っていないことを OS に証明するために、いくつかのコマンド バッファを時々完成させます。
最後に、GPU は高速であるため、アプリケーションがその 5 秒または 10 秒で有用な作業を実行できない場合は、何かが間違っている兆候と見なします。
[更新する 2010 年 3 月編集: ] (これも古い情報です。最新情報については、以下の更新情報を参照してください)上記のレジストリ キーは古くなっています。それがWindows XP 64ビットの鍵だったと思います。Vista および Windows 7 用の新しいレジストリ キーがあります。これらは、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 モニター オプション] をクリックして、[一般] で [WDDM TDR 有効] を false に設定することです。これにより、レジストリ設定が変更されます。閉じて再起動します。TDR レジストリ設定への変更は、再起動するまで有効になりません。
[2018 年 8 月 の更新:] NVIDIA ツールで TDR を無効にできるようになりましたが、同じ質問が AMD/OpenCL 開発者に関連しています。それらの場合: TDR 設定を文書化する現在のリンクは、https: //docs.microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys にあります。
Windowsでは、グラフィックスドライバーにウォッチドッグタイマーがあり、5秒を超えて実行されるシェーダープログラムを強制終了します。Xorg / XFree86ドライバーはこれを行わないため、考えられる回避策の1つは、LinuxでCUDAアプリを実行することです。
AFAIKでは、Windowsでウォッチドッグタイマーを無効にすることはできません。Windowsでこれを回避する唯一の方法は、画面が表示されていない2枚目のカードを使用することです。テスラである必要はありませんが、アクティブな画面があってはなりません。
タイムアウトの検出と回復の解決 - WINDOWS 7 (32/64 ビット)
Windows でレジストリ キーを作成して TDR 設定をより高い値に変更し、Windows が TDR プロセスの開始前により長い遅延を許容できるようにします。
ファイル名を指定して実行または 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)からのソース 私もこれを確認し、正常に動作します。
最も基本的な解決策は、使用している GPU が時間内に完了することができると確信している計算の途中のポイントを選択し、すべての状態情報を保存して停止し、再度開始することです。
更新: Linux の場合: X を終了すると、必要なだけ CUDA アプリケーションを実行できます。テスラは不要 (これのテストには 9600 が使用されました)
ただし、X を入力しないと、ドライバーがロードされず、動作しない可能性があることに注意してください。
また、Linux の場合、その時点で X ディスプレイをまったく起動していなくても機能するようです。そのため、X 以外のフルスクリーン端末に画面を表示している限り、X を終了する必要はありません。
これは不可能です。タイムアウトは、計算のバグが長期間GPUを占有するのを防ぐためにあります。
CUDA作業専用のカードを使用すると、制限時間が解除されます。これにTeslaカードが必要かどうか、またはモニターが接続されていないGeForceを使用できるかどうかはわかりません。
ウォッチドッグ タイマーは、ディスプレイが接続された GPU にのみ適用されます。
Windows では、タイマーは WDDM の一部であり、一部のレジストリ キーを使用して設定 (タイムアウト、タイムアウトに達したときの動作など) を変更できます。詳細については、このMicrosoft の記事を参照してください。
私が使用する解決策は次のとおり
です。 1.すべての情報をデバイスに渡します。
2. アルゴリズムの反復バージョンを実行します。各反復は、デバイス内に既に格納されているメモリでカーネルを呼び出します。
3. 最後に、すべての反復が終了した後にのみメモリをホストに転送します。
これにより、反復間のコストのかかるデバイス<-->ホスト メモリ転送なしで、CPU から反復を制御できます (中止するオプションを含む)。
Linux では、この動作を無効にすることができます。「ウォッチドッグ」には明らかな目的がありますが、シェーダー/CUDA を使用して大規模な計算を行うと、非常に予期しない結果が生じる可能性があります。
このオプションは、X 構成 (おそらく /etc/X11/xorg.conf) で切り替えることができます。
追加: オプション "Interactive" "0" を GPU のデバイス セクションに追加すると、ジョブが実行されます。
CUDA Visual Profiler 'Interactive' X config オプションを参照してください。
構成の詳細については
と
ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactiveを参照してください。
パラメータの説明。