私のアプリケーションでは、GUIスレッドはDirect2Dを使用して画像を表示し、ユーザーがパンとズームを行えるようにします。別のスレッドはCUDAを使用して画像処理を行います。画像処理スレッドがGUIスレッドによって妨害されるのを防ぎ、処理を高速化するために、次の設定でCUDAコンピューティング用に別のグラフィックカードを追加することを選択しました。
- ディスプレイ用のNvidiaQuadro400(Direct2D、PCと一緒に販売、ディスプレイ用に十分)
- CUDAコンピューティング専用のNvidiaGT640(コアが多く、アプリケーションが実行する必要のある処理がより効率的で、BIOSでの表示が無効で、画面が接続されていないため、CUDAコンピューティング専用に追加されました)。CUDAスレッドには、このGT640のみを使用するためのコードが含まれています。
ただし、これは期待どおりに機能しませんでした。ユーザーが画像をパンすると、表示が連続して更新されるため、CUDAの実行時間は通常の20ミリ秒から約800ミリ秒に跳ね上がります。GPUView(この問題を調査してまったく習得していないことを発見しました)を使用して、CUDAスレッドがGPUへのコマンドをキューに入れる前にディスプレイの更新が完了するのを待っているように見えることがわかりました。その間、Direct2DはGPUをほとんどの時間未使用のままにします(16ミリ秒のVSync期間で1ミリ秒の作業)。Direct2Dへの呼び出しがすべてのGPUを16ミリ秒間ブロックしているように見えます。その後、GUIスレッドによってCUDAスレッドが枯渇します(ただし、これらのスレッドはGPUアクセス以外の方法で同期されません)。
したがって、質問は次のとおりです。
- 何が起こっているのでしょうか?
- Direct2Dを1つの特定のGPUでのみ実行するように強制することは役に立ちますか?
- それも可能ですか、それとも私は問題を間違った方法で取っていますか?