補足概念ヘルプ
始める前に、私は GPU メーカーで働いたことがないことを説明しておく必要があります。以下で私が言うことのいくつかは事実上間違っているかもしれませんが、それは私がプログラマーとして理解している方法です.
以下は、最新の GPU のイメージです。この画像は、それぞれが 8 つのキューを含む 8 つの汎用パイプを示しているため、クロックのサイクルごとに 64 命令の単一命令操作を処理できます。
古い GPU には固定されたプログラム不可能なパイプラインがありましたが、私たちはそれらにあまり関心がありません。中間の GPU には、ベクター プログラムを実行するための特定のパイプと、ピクセル シェーディング用の別のパイプがありました。最新の GPU には、あらゆるタイプのプログラム (テッセレーション、計算などを含む) を実行できる汎用パイプがあります。
アービトレーション プローブとアロケーション プローブは、どのパイプでどのプログラムを実行するか、どの入力をパイプに送信するかを決定し、各サイクルでできるだけ多くのプロセッサが使用されるようにします。プログラマーとして、私たちはこれらとは何の関係もないので、これは私にとって完全なブラック ボックスです。
パイプを制御するプログラムを書いています。したがって、AA プローブが pipe0 をピクセル シェーダーとして使用することを決定したと想像してください (頂点が飛び跳ねる原因となる丸めについて心配していないため、プログラムは色で何かを行っていると思います)。次に、同じプログラム (テクスチャを参照) を必要とする 8 つのピクセルを選択し、それらをプロセス バッファにロードします。次に、プログラムが完了するまで、8 つのピクセルすべてが一度に 1 命令ずつ並列に実行され、パイプが AA プローブに戻されて新しいジョブが与えられます。そのプログラムを必要とするピクセルが 8 ピクセル未満の場合、プロセス バッファの一部が空の状態でパイプが実行され、チップが十分に活用されていません。画面上のすべてのテクスチャが異なると、GPU が殺されます。
したがって、1 サイクルで 1 つの計算パイプは 8 ピクセルに対して 8 muls または 8 ピクセルに対して 8 sin を実行できますが、すべてのピクセルに対してすべての命令を直線的に実行する必要があります。これが、if ステートメントがシェーダー プログラムにとって非常に複雑である理由です。条件に合格したピクセルは処理されますが、失敗したピクセルは、合格したピクセルが処理されるまでサイクルを待機する必要があります。
明らかに、私がピクセルと言ったすべての場所は、頂点または CU 要素である可能性があります。
ここで言及したと私が考えることができる唯一のことは、精度です。精度を下げると、処理バッファーをより密に詰めることができます。したがって、どこでも半精度を使用している場合、GPU は 1 秒あたり 64 の数値を処理する代わりに、128 などを処理できます。
それがGPUの仕組みです。確かに、アーキテクチャを理解することで、シェーダー プログラムがそのようになっている理由がより理解できるようになりました。
