DirectX 11 で Compute Shader を使用して、単純ではあるが高価な計算を実行しようとしています (Mandelbrot Set を考えてください)。計算結果はテクスチャに配置され、オーバーラップしません。1 ~ 10 秒かかると予想されるため、リアルタイムではありませんが、終了するとすぐに UI に表示されます。
http://directx4wpf.codeplex.com/経由で WPF と SharpDX を使用しています。そのライブラリには、RenderScene 関数を備えた DX11 ビュー オブジェクトがあり、DX レンダリング関数が呼び出され (コンピューター シェーダーを含む)、メイン スレッドで実行され、私の理解では、できる限り頻繁に呼び出されます (FPS を最大化しようとします)。 )。明らかに、コンピューター シェーダーを固定するオプションはありません。メイン スレッドが残りの UI と共にブロックされ、GPU も使用している場合は OS の残りの部分もブロックされるからです。
問題は、アプリケーションの残りの UI に遅れを生じさせずに、これらの計算をどのように実行すればよいかということです。
これが純粋に CPU で実行される場合は、別のスレッドを実行するだけです。ただし、GPU の初歩的な理解では、GPU はスケジューリング/コンテキスト切り替えにあまり適していないという印象を受けています。したがって、別のスレッドで計算を実行しても (DX11 で遅延レンダリングを使用)、計算が完了するまで GPU がブロックされます。あれは正しいですか?
計算シェーダーの作業を小さな断片 (約 8000 スレッド) に分割しようとしました。これは、基礎となるジオメトリがなくても実行可能です。計算シェーダーを呼び出すたびにオフセットを追加するだけです。膨大なオーバーヘッドがあるため、実際には機能しません。実際、(計算シェーダーを連続して N 回呼び出すことによって) 作業を N 個に分割すると、N 倍の直線的な速度低下が発生するようです。 、または GPU の使用に関する避けられない事実です。
そのようなシナリオでどのように進めるかについて提案がある人はいますか?おそらく似たようなことを行うサンプルプロジェクト、または読むべき良いリソースですか? 私は誤った仮定をしていますか?