DirectX 12は、グラフィックス(「Direct」と呼ばれます)、計算、またはコピータスクのいずれかのコマンドキューを公開します。提供される機能に関しては、それぞれが次の機能のスーパーセットです。この仕様では、コマンドキューはデバイスで同時に実行できると記載されています。ただし、APIはコマンドキューの数を決して制限しません(少なくとも、私は制限を認識していません)。
どうやら、さまざまなベンダーがこれを非常に異なって処理します:
- Intelは最近のプレゼンテーション(スライド23)で、現在GPUはグラフィックスとコンピューティングを並行して処理することができず、コピーエンジンのスループットが弱いと述べています。彼らは、複数のグラフィックス/計算キューの使用を推奨していません。
- AMDは、Mantleと現在のgenコンソールから始まるキュー/「非同期シェーダー」の使用を宣伝するためにずっと前に始めました。また、計算タスクとグラフィックスタスクを並行して実行することで大幅なパフォーマンスの向上を確認する開発者(例)もいます。
- 最近、ハードウェアでNvidiaが非同期シェーダーをサポートしていないという大騒ぎがありました。一度に個別のグラフィックスキューと計算キューを使用すると、動作が遅くなり、ドライバーのエミュレーションを示しています。一方、並行コピー操作は非常に長い間CUDAによってサポートされており、DMAエンジンが独立して動作できることは明らかです。
CommandListを1つではなく複数のCommandQueueにコミットすることが意味があるかどうかを実行時に決定する方法はありますか?(前者のケースにはエンジニアリングのオーバーヘッドがあまりないことを前提とする)
メモリー操作を計算/グラフィックス操作と並行して実行することがどのように役立つかは簡単にわかりますが、複数の計算とグラフィックスプロセスを並行して実行することは不必要に複雑であると思います(大きなパフォーマンス上の利点がない限り)。また、これがどのようにしてパフォーマンスを大幅に向上させることができるかについても、私には明らかではありません。多くの小さな順次タスクが十分なGPU負荷を生成できない病理学的な場合を除きます。