0

Computer Shaders と Cuda の違いと、それらがどのように動作するかを理解しようとしています。私はCudaのみを使用しており、私が理解しているように:

シェーダーベースのコンピューティングでは、シェーダーの数はピクセルの数と同じですが、Cuda では、複数の「ピクセル データ要素」に対して動作するカーネル スレッドを使用できます。

Cuda には、データをフェッチできるさまざまなメモリ タイプ (グローバル、共有、定数、テクスチャ) がありますが、シェーダー ベースのコンピューティングでは何が起こるのでしょうか? さまざまなメモリの種類と、コンピューティングがグラフィックス (カーネル、入力、出力) にどのようにマップされていますか? Compute Shaders ではプロセス間の通信がないというのは本当ですか (Cuda の共有メモリと同期など)? また、コンピューティング シェーダー カーネルに関するその他の制限はありますか?

4

1 に答える 1

1

これらは同じ一般的な目的を果たしますが、実際の違いは、計算シェーダーが OpenGL や Direct3D などのグラフィックス API の拡張であることです。コンピューティング シェーダーを使用すると、通常のプログラム可能なグラフィックス パイプライン (頂点 -> テッセレーション -> ジオメトリ -> フラグメントなど) をバイパスし、前述のパイプラインのどこかにアルゴリズムを押し込むことなく、ホスト GPU の基礎となる計算能力にアクセスできます。コンピューティング シェーダーのワークグループ内の呼び出し間に共有メモリ/同期が絶対に存在します。

また、この「ピクセル」という概念がどこから来ているのかもわかりません。コンピューティング シェーダーを作成する目的は、実際のグラフィックス パイプライン (頂点、フラグメント/ピクセルなど) にのみ適用される構成要素から開発の負担を取り除き、すべてを汎用目的 (したがってGPGPUという用語) のコンピューティング/メモリ機能に落とし込むことでした。確かに、OpenCL や CUDA などの専用 API ではなく D3D/OpenGL コンピューティング シェーダーを使用する場合、レンダリングに関連する何かを達成する必要があることがよくありますが、これは決して要件ではありません。

これらすべてをより正式なコンテキストに入れるために、GLSL 仕様が計算プロセッサをどのように導入するかを考えてみましょう。ここから取り除かなければならない重要な点は、それらが新しいタイプのシェーダーであるということですが、グラフィックス パイプラインの新しい段階ではなく、独自に存在するということです。


GLSL 4.4 仕様- 2.6 計算プロセッサ - pp. 8

計算プロセッサ

計算プロセッサは、他のシェーダ プロセッサから独立して動作するプログラム可能なユニットです。

[...]

計算シェーダーは、テクスチャ、バッファー、画像変数、アトミック カウンターなど、フラグメントやその他のシェーダー プロセッサと同じリソースの多くにアクセスできます。定義済みの入力も固定機能の出力もありません。これはグラフィックス パイプラインの一部ではなく、目に見える副作用は、画像、ストレージ バッファー、およびアトミック カウンターへの変更によるものです。

計算シェーダーは、ワーク グループと呼ばれるワーク アイテムのグループで動作します。ワーク グループは、同じコードを並列で実行するシェーダー呼び出しのコレクションです。ワーク グループ内の呼び出しは、共有変数を介して同じワーク グループの他のメンバーとデータを共有し、同じワーク グループの他のメンバーと同期するためにメモリと制御バリアを発行する場合があります。

于 2014-01-10T22:26:43.210 に答える