Gong Da's Video Study Notes: God's Perspective on GPU (2) - 論理モジュール部門

序文

前号では基本QQにどのようなパイプラインを盛り込むべきかをご紹介しましたが、時代の発展に伴い、新たな要求が徐々に出てきました。基本的なグラフィックス パイプラインから現在の状態に徐々に拡張する方法を見てみましょう。
ここに画像の説明を挿入

ここに画像の説明を挿入

1 ジオメトリ シェーダー

上記の頂点シェーダーとピクセル シェーダーはどちらも単一入力および単一出力の構造であり、1 つの入力ユニットのみを受け入れます。処理後、出力しますが、処理したい単位が頂点でもピクセルでもない場合、そのようなパイプラインには機能がありません。

それがプリミティブである場合、それはできません。この要求は、ジオメトリ シェーダーと呼ばれる新しいシェーダーを生み出しました。これは、プリミティブ アセンブラーを逆アセンブルすることに相当します。
ここに画像の説明を挿入

頂点シェーダーが処理された頂点を出力した後、プリミティブ全体が最初にジオメトリ シェーダーに送信され、処理後に残りのプリミティブ アセンブラーが実行されます。

ここに画像の説明を挿入

最初の 2 つのシェーダーと比較して、ジオメトリ シェーダーは単一入力複数出力という大きな特徴があります。

ここに画像の説明を挿入
ここに画像の説明を挿入

ジオメトリ シェーダーに入るプリミティブは、複数のプリミティブを出力できます。したがって、三角形全体を移動したり、三角形をいくつかにカットしたりできます。その存在により、GPU は不均一な出力などのより柔軟なタスクを実行できます。

たとえば、最初の三角形は 1 つの三角形を出力し、2 番目の三角形は 5 を出力し、3 番目の三角形は 3 を出力します。
ここに画像の説明を挿入

もう 1 つの違いは、頂点シェーダーとピクセル シェーダーの両方が必要であることです。指定しないと、パイプライン全体をストリングすることはできません。ジオメトリ シェーダはオプションです。指定しない場合は、直接接続されることを意味します。

ここに画像の説明を挿入

ジオメトリ シェーダーによるプリミティブ出力は、プリミティブ アセンブラーに入力してパイプライン全体を完成させるだけではありません。

データをメモリに直接出力することも可能で、このプロセスはストリーム出力と呼ばれます。もちろん、ジオメトリ シェーダーを指定せずに頂点シェーダーから直接出力することもできます。これにより、パイプラインの途中からデータを直接エクスポートすることができます。

ここに画像の説明を挿入
頂点バッファー内の頂点を処理して保存し、繰り返し使用して繰り返し計算を減らすことがあります。

ここに画像の説明を挿入
ここに画像の説明を挿入

しかし、ここで問題があります。ジオメトリ シェーダーは非常に柔軟で、あらゆる種類の操作を実行できるようです。ただし、実際に使用すると、パフォーマンスが非常に低いことがわかります. その柔軟性のために、ハードウェアはパフォーマンスを最適化するためのさまざまな仮定を行うことができません. 非常に控えめにしか達成できません

特に三角形を複数に切り分ける場合は、本来は固定アルゴリズムでの演算ですが、完全にプログラム可能にすると。ハードウェアは、実行前に三角形を細分化する必要があることさえ認識していないため、最適化する方法がありません.三角形が細分化されるにつれて、この要件は徐々に増加します.

2-テッセレーション

頂点シェーダーの後、GPU のパイプラインに特別なテッセレーション機能が追加されました。1台ではなく3台、

  • まず第一に、各プリミティブをどのように細分化する必要があるかを指定できる、プログラム可能なハル シェーダーがあります。たとえば、内部パーツをいくつに分割するか、各辺をいくつのセグメントに分割するか、そしてパイプラインが固定されたテッセレーターがあります。固定アルゴリズムを使用して細分割を実行し、

  • 次はドメイン シェーダーで、サブディビジョン パラメーターに従って、サブディビジョン後の各頂点の情報を計算します。この部分もオプションです。有効になっていない場合は、直接送信されます。

ここに画像の説明を挿入

現時点では、gpu は非常に強力な計算能力を備えているため、グラフィックスをレンダリングするだけではないのではないかと考える人もいました。より一般的な並列コンピューティングとしても使用できます。最も初期の方法は、画面を覆う大きな三角形をレンダリングすることです。ピクセル シェーダーで一般的な並列計算を行うことは、各ピクセルがスレッドであることに相当します。

ここに画像の説明を挿入

これによりいくつかの問題を解決できますが、単一の入力と単一の出力の制限は依然として存在し、データは頂点シェーダーなどのパイプライン全体を通過する必要があります。
ここに画像の説明を挿入

まだ無駄があり、このアプローチでは、開発者はグラフィック パイプラインを学習する必要があります。バーを上げました。

それでも 2003 年頃の Explorers は止まりませんでした。この展開された方向はgpgpuと呼ばれます。

3 コンピューター シェーダー

一般的なコンピューティングには GPU を使用します。この需要は、さらにハードウェアをサポートする gpgpu を生み出しました。

複数の入力と複数の出力が可能です。任意に読み取ることができ、任意に書き込むことができ、これらの固定パイプライン ユニットを通過する必要がなくなり、GPU の計算ユニットを使用して変形計算を実行できます。
この種のシェーダーはコンピューター シェーダーと呼ばれ、グラフィックス パイプラインとは独立して存在し、入力と出力はすべてメモリで制限され、グラフィックス パイプラインよりも小さくなります。

コンピューティング パイプライン全体で 1 つのステップしかないため、開発の難易度とプログラムの構成が従来のものに近づき、しきい値がはるかに低くなります。

ここに画像の説明を挿入

これまでのところ、GPU のパイプラインは現在のものに非常に近く、リアルタイム レンダリングとコンピューティングのさまざまな要件を満たすことができます。

同時に、GPU のパイプラインも非常に複雑になっています。はい、ラスタライザーの前の頂点シェーダー、ハル シェーダー、ドメイン シェーダー、ジオメトリ シェーダーの一部です。それらの存在の意味は、ジオメトリ データを変更および分解し、最終的にラスタライザーに送信することです。

より複雑なオブジェクトをレンダリングするには、より複雑なデータを入力する必要があります。

この問題を解決するには、入力データがほとんどまたはまったくない状態で、GPU 自体に大量の複雑なデータを生成させる必要があります。コンピューターシェーダーの読み書きはできるが、ラスタライザーに接続できないという要件から、増幅シェーダーとメッシュシェーダーが誕生しました。

ここに画像の説明を挿入

増幅シェーダーは、メッシュ シェーダーが実行される回数を指定する役割を担い、メッシュ シェーダーはジオメトリを生成する役割を果たします。この時点で、レンダリングされたユニットはもはやプリミティブではなく、 mashlate と呼ばれる小さなグリッドです

ここに画像の説明を挿入

マッシュレートが増幅シェーダーに送信されると、マッシュレートをさらに処理する必要があるかどうかを判断し、必要な場合はメッシュ シェーダーに送信します。

詳細が豊富なプリミティブのスタックを生成します。これら 2 つの shalder は元のものを置き換えることができますが、現在の gqu では、サポートされている GPU とそれらを使用するプログラムは多くありません。元のパイプラインと共存できます。

もちろん、需要の拡大は止まらず、長年にわたり、ゲームはさまざまな方法を使用してリアルな体験を改善してきました。

一方、これらの方法は互いに競合するか、大きな制限のある多くのハックを使用することがよくあります。古くからあるが汎用のテクノロジであるレイ トレーシングは、計算量が多いだけではないため、GPU にはあまり適用されていません。

4-レイトレーシング

また、ラスタライズベースのレンダリング方法とはプロセスがまったく異なり、研究者は長い間、既存の GPU でより効率的なレイ トレーシングを実現しようとしてきました。このような需要は、レイ トレーシングを提供する GPU の機能によって、ようやく大幅に発展し、この時点で独立したパイプラインが登場しました。さまざまな新しいタイプのシャルダーが含まれています。

ここに画像の説明を挿入

ここに画像の説明を挿入

  • レイ生成シェーダ: 光を生成する
  • 交差シェーダー: ライトがオブジェクトと交差するかどうかを決定します
  • 任意のヒット シェーダー: 光がオブジェクトに当たったときに、前進し続けるかどうかを決定し、
  • 最寄りのヒット シェーダー: 光がオブジェクトに当たる最も近いポイントで色を計算し、
  • miss shader: 光がどのオブジェクトにも当たらないときの色の計算を担当し、
  • また、それらで使用される clllable シェーダーは動的に呼び出すことができます。

5-GPUロジックモジュール構成

ハードウェア レイ トレーシングの詳細については、別号で説明する予定です。同じアイデアは、より多くの分野でも使用できます. たとえば、GPU は、ニューラル ネットワークの計算専用のテンソル計算モジュール、ビデオ エンコード、およびデコード モジュールなどを追加しますが、これらはすべて独立したパイプラインです。

ここに画像の説明を挿入

ここで、cpu と gpu の 2 番目の大きな違いを見ることができます.cpu の目的は汎用モジュールです.プログラミングするときは、すべて書き留めるだけです.

GPU は複数のモジュールに分割されており、それぞれに独自の特性と用途があります.プログラミングを行う場合、開発者はこれらのモジュールを明確に理解する必要があります。プログラムでの使用方法を整理します。

ここに画像の説明を挿入

グラフィックス パイプラインでコンピューティング パイプラインを使用する場合、現在の GPU パイプラインは相互に呼び出すことができません。最初に計算を呼び出し、結果をテクスチャまたはバッファに書き込んでから、グラフィックス パイプラインで読み取る必要があります。

10 年以上前、私は、構成はアセンブリ ラインであり、プログラム可能なユニットだけでなく、プログラム可能な接続も含むという考えを提案しました。これにより、組立ラインを必要に応じて組み立てることができます

ここに画像の説明を挿入

そして今、そのような GPU はありませんが、現在はグラフィックス パイプラインのさまざまなユニットがあります。この問題を部分的に解決する任意の出力機能もあります。

ここに画像の説明を挿入

長い間、GPU で開発する人々は 2 つの陣営に分けられてきました。1 つは、基本的に GPU のみを使用するグラフィックス パイプラインです。典型的なアプリケーションは、ゲームのグラフィックスです。

基本的に GPU のみを使用する別のタイプのコンピューティング パイプラインは、通常、機械学習アプリケーションです。後者は近年非常に人気があり、PCから携帯電話、サーバーまですべてをカバーしているため、一部の企業はGPUチップであると主張しています. 私たちが行っているのは、パイプラインのみを計算する汎用 GPU である、いわゆる gpgpu チップです。

ここに画像の説明を挿入

前号で述べたように、GPU の g はグラフィックスであり、グラフィックス パイプラインを備えている場合にのみ GPU と呼ぶことができます。

gpgqu を呼び出すことができるのは、GPU 上の汎用コンピューティングのみです。

ここに画像の説明を挿入
(この依存関係と順序に注意してください)

演算能力だけでグラフィック機能がないのに gqi を呼び出すのは詐欺であり、グラフィック機能のないグラフィック プロセッサとは相容れないものではないでしょうか。

ここに画像の説明を挿入

しかも、純粋な計算の場合でも。一部の固定パイプライン ユニットは、一般的な計算の補足としても十分に活用できます。たとえば、ラスタライザーは効率的な差分器として使用できます。一部のデータを線形に広げます。

出力マージャーでのアルファ ブレンディングは、効率的なデータ アキュムレーターとしても使用できます。

これらは、一般的なコンピューティングのパフォーマンスをさらに向上させることができます。

これまで、論理レベルで、GPU とは何か、また現在の GPU には何が含まれているべきかを見てきましたしかし、このモジュールに従って分割すると、GPU ハードウェアを直接実装するには 2 つの大きな問題があります。

  • 最初のシェーダーは非常に多くの種類があるため、プログラムがその一部のみを使用すると負荷が偏ります。他のコンピューティング パワーが浪費されていませんか?

  • 2 番目のパイプラインはすでに非常に複雑で、限られたコスト内でハードウェアに配置する方法です。

ここに画像の説明を挿入

幸いなことに、どちらの問題も同じ方法で解決できます。今号では、GPU の論理モジュールを完成させ、現在のニーズに基づいて確立しました。GPUの構成はあるべきです。

次号では、ハードウェア レベルでの GPU の構成を詳しく見ていきます。

コンテンツの出典: bilibili-Gong Da's Grocery Store

おすすめ

転載: blog.csdn.net/weixin_45264425/article/details/130475511