1

私は現在、openCV GPU/CUDA コードを実行している OS X 10.9 を使用して rMBP に取り組んでいます。より具体的には、BruteForceMatcher_GPU knnMatchSingle/knnMatch 機能を使用しています。GPU 計算の 5 秒後、OSX はプログラムをオーバーライドして終了します。これは、OSX の launchd または NVIDIA GPU ドライバーからの画面のフリーズを回避するためのかなりよく知られた回復プロセスです。Windows と Linux では GPU ウォッチドッグ タイマーをオフにすることができますが、OSX ではオフにすることができません。とにかく、私の質問は、openCV で GPU メモリの状態を保存し、一定の遅延後にそれを復元して、ウォッチドッグ タイマーの制限を克服することは可能ですか? そうでない場合、OSX の GPU ウォッチドッグ タイマーを回避する方法に関する他のアイデアはありますか? どうもありがとう

PS: gfxCardStatus 2.3 をインストールして、グラフィック カード間の切り替えを確認できるようにしました。

4

1 に答える 1

1

OpenCV GPU モジュールと低レベルの CUDA プログラミングの両方を使用して、この問題にも遭遇しました。短い答えはノーです.Windowsのレジストリキーを介してできるようにウォッチドッグタイマーをバイパスすることはできません-または、さまざまなCUDA Devフォーラムでいくつかの提案を試みましたが、それを行う方法が見つかりませんでした.

NVidia GPU の GPU アーキテクチャにより、GPU の状態をそのまま保存することはできません。一般に、GPU で何かを計算するには、CPU でデータを初期化して RAM に保存し、GPU コアがアクセスできる GPU グローバル メモリにデータをコピーし、計算を行い、結果をグローバル メモリに保存し、 CPUが結果にアクセスできるCPU / RAMにコピーし、カーネルはすべてのデータの解放を終了します。ウォッチドッグ タイマーが起動すると、カーネルが終了し、すべてのデータが失われます。

技術的には、この問題を回避するには 2 つの解決策しかありません: 回避策は、5 秒タイマー (またはシステム上のタイマー) よりも短い GPU 計算のみを実行し、中間結果を CPU に保存することです。 /RAM を実行し、キューで待機している次のデータで新しいカーネルを開始します。完了するまでこれを続けます。ただし、最初にデータを分割し、適切にキューに入れ、GPU との間でデータを数回コピーする必要があるため、これはパフォーマンスに大きな影響を与えます。そのため、データによっては多くのパフォーマンスが低下する可能性があります。

もう 1 つの解決策は、2 つの専用 GPU をインストールすることです。1 つはシステム GPU として機能し、もう 1 つはそこに座って、指示されたときに数値を計算します。少なくとも Windows と Linux では、ウォッチドッグ タイマーを無効にしなくても問題なく動作します。Macで複数のCUDA GPUを使用した経験がないため、OSXでも同じことが当てはまるかどうかはわかりません。CUDA は、使用するデバイスを手動で設定できる関数を公開しています。

http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__DEVICE_g418c299b069c4803bfb7cab4943da383.html

デフォルトの GPU は常にインデックス 0 であり、私の経験によると、現在のディスプレイ デバイスとしてシステムによって設定されたものです。したがって、インデックスを 1 に設定すると、システムで現在使用されていない GPU が使用されます (SLI セットアップで動作が同じかどうかはわかりません)。たとえば、テストに使用した Windows マシンには、ディスプレイ デバイスとして 8800GT があり、側面には TESLA C2075 がありました。どちらも CUDA をサポートしていたので、TESLA を CUDA デバイス (インデックス 1) として手動で設定すると、ディスプレイ デバイスがフリーズすることはありませんでした。そのため、ウォッチドッグが起動することはありませんでした。

cudaSetDevice は CUDA デバイスしか認識しないことに注意してください。そのため、統合 GPU または AMD GPU と Nvidia カードを一緒に使用している場合、cudaSetDevice でそれらの間を変更することはできません。常にCUDA対応デバイスを使用するか、完全に失敗します。私が知る限り、cv::gpu:cudaSetDevice は存在しないため、この関数を OpenCV コードと一緒に呼び出すことができるかどうかはわかりません。C++ ではなく C を使用している場合は、NVCC コンパイラを使用して、OpenCV 関数の前にネイティブ CUDA (cudaSetDevice など) 関数を実際に呼び出すことができる場合があります。

ただし、OpenCV を使用すると、(独自のカーネルを作成する場合と比較して) CUDA コードで何が起こるかを制御することがはるかに少なくなり、実際にデータを分割して満足のいく結果を得ることができない場合があります。その場合、問題の解決策はないと思います。さらに、OSX は MacBook Pro の現在のワークロードに応じて複数の GPU を切り替えるのが好きです。

MacBook Pro でこの問題が発生したとき、VS2010 と CUDA ツールキットと共に Windows 7 をブートキャンプにインストールし、ウォッチドッグ タイマーを無効にして、完全に実行しました。これは完璧なソリューションではありませんが、少なくともテスト サーバーにデプロイする前に、CUDA コードをローカルで開発することができました。

于 2013-12-01T18:19:41.317 に答える