CPUとGPUの幾何学的変換


9

私は、多くの3Dプログラムが通常、ベクトル/行列の計算やCPUでの幾何学的変換を行うことに気づきました。これらの計算をGPUの頂点シェーダーに移動することで利点を見つけた人はいますか?

回答:


3

一般的に言えば、メッシュ変換はGPUで行われます。変換マトリックスをGPUに送信すると、シェーダーはそれをメッシュのすべての頂点に適用します。

GPUを使用してマトリックス自体を計算することは別の問題であり、最終的な変換マトリックスを決定するために必要なフレームごとに変化する非常に多くの保存された値があるため、GPUでは実際には遅くなります。CPUとのこのデータの送信-GPUが遅い。また、CPUでは計算が1回行われますが、GPUでは頂点ごとに計算されます。


「GPUでは実際に遅い」という部分について。これは非常に広範な声明です。GPUの各頂点の行列の作成について話している場合、パフォーマンスはボトルネックに依存します。GPUにALU /レジスタがバインドされている場合にのみパフォーマンスが低下しますが、これは必ずしもそうではありません。CPUでまったく同じことを行うと、これらのボトルネックシナリオでは速度が低下します。これ GPUで一般的に行われる例:頂点シェーダーは、頂点フェッチの帯域幅を節約するために、頂点接線空間マトリックスをオンザフライで構築します。繰り返しますが、ボトルネックに依存するので、YMMVです。
jpaver '27 / 08/27

私は反対投票することはできませんが、この回答は反対投票する必要があります。「GPUで実際に遅い」と言うのは非常に間違っています。
アダム

3

多くの幾何学的変換は非GPUプロセッサで実行できますが、ターゲットプラットフォームを考慮する必要があります。走行距離は、ターゲットとするプラットフォームとそのプラットフォームのボトルネックによって異なります。

1つの考慮事項は、ジオメトリを生成しているデバイスとジオメトリをレンダリングしているデバイスの間のバス帯域幅です。

典型的な最新のPCシステムでは、CPUはPCIeバス(http://en.wikipedia.org/wiki/PCI_Express)の片側にあり、GPUは反対側にあります。フレームごとに生成されたデータをCPUからGPUに(またはその逆に)転送できる唯一の方法は、このバス経由です。つまり、このバスの転送速度によって制限を受ける可能性があります。ターゲットプラットフォームに16レーンのPCIe 2.xがある場合、帯域幅は8GB / sです。実際には、転送中にプロトコルのために帯域幅の一部が消費されるため、PCIeを介した転送は100%効率的ではありません。転送のサイズによっては、パケットごとのオーバーヘッドだけで帯域幅の5〜10%を失う可能性があります。

例えば。16レーンのPCIe 2.xを実行しているPCプラットフォームの場合、GPUに供給するためにフレームごとにどのくらいのデータを生成できますか?60fpsで実行する場合、これは8GB / 60 = PCIe 2.xのフレームあたり136MBに変換されます。ドライバーの通信オーバーヘッドとPCIe転送プロトコルのオーバーヘッドを考慮して何らかの(推定)90%係数を掛けると、PCIe 2.x帯域幅に制限されることなく、フレームあたり約120Mbのデータを生成できます。

あなたが答えなければならないもう一つの質問:この120Mbのデータの生成は、ターゲットCPUで1/60秒で簡単に達成できますか?CPUで他の多くのゲームタスクを実行する必要があることを思い出して、変換されたデータを生成するための時間が足りなくなることがあります。純粋なALUスループットの観点からは、これによりCPUの使用が制限される可能性があります。CPUからsysmemへのバスに関しては、帯域幅によって制限することもできます(変化しますが、最近のCPUでは約8.5GB /秒です)。

では、どのような要因でGPUを実行することがより現実的になるのでしょうか。1つの要因は、GPUとそのローカルビデオメモリ間の帯域幅であるGPUメモリ帯域幅です。最新のミッドレンジGPUでは、このビデオメモリの帯域幅は200GB / sにもなることがあります(つまり、PCIe 2.x帯域幅の25倍です)。もう1つの要因は、GPUが超並列で、数百のALUがあり、一度に数千のスレッドを実行することでメモリアクセスのレイテンシを隠すことができることです。

これらのすべての要因が、GPUにさらに多くの作業をプッシュするという明らかな勝利に貢献できますが、ターゲットプラットフォームによってはYMMVにも影響します。


1

「メッシュ変換」とはどういう意味ですか?いくつかの行列のセットでジオメトリを変換しますか?最近のほとんどのゲームでは、GPUが単純な変換やスキニングなどを処理できるようになります。また、それらのほとんどは、頂点シェーダーを使用して行われます。一部のプラットフォームでは、シェーダーがないか、CPUでこれらのことを行うことで他の利点があります。たとえば、PS3では、SPUにスキニングと変換を処理させることで、RSXからある程度の負荷を取り除くことができます。マルチパスライティングを行っている場合は、CPUのスキニングが有利になることがあります。これは、一度行うだけで、レンダリングパスごとに描画される結果を送信する必要があるためです。ですから例外はありますが、一般的にほとんどのゲームはGPUとシェーダーでこれらのことを行っています。

それとも、一般的なベクトル演算にGPUを使用するなど、より洗練された意味ですか?最近では、CUDAなどのシステムを介してかなり一般的なCコードを実行できる汎用GPUがあります。重いベクトル演算にこれを利用することは可能であり、これを行うプログラムが世の中にあることは知っています。個人的にはまだ経験はありません。


質問を明確にするために、「メッシュ変換」を「幾何学的変換」に変更しました。私はまた来年早々に利用可能になる可能性があるopencl esを待っています。
zmdat 2010

0

GPUですべてをレンダリングすることに意味がある状況もありますが、シェーダー内で定数を設定することはできず、描画呼び出しの前にCPU側を除いて定数を設定する場所は実際にはありません。

カスタム初期化プログラムを使用してGPUでボーン変換行列などの定数を計算できたとしても、おそらくそうしたくないでしょう。GPUは並列実行には優れていますが、クロック速度ははるかに遅くなります。

子ノードは親に依存しているため、階層の変換は簡単には並列化できませんが、メッシュ内のすべての頂点の変換は、頂点が互いに計算的に独立しているためです。

一般的なルールは次のとおりです。

  • シリアル処理:CPU
  • 並列処理:GPU
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.