web-dev-qa-db-ja.com

GPUまたはCPUで行列を計算する必要がありますか?

CPUまたはGPUで行列を計算する方がよいですか?

次の行列があるとしますP * V * M、最終的な行列をGPU(GLSL)に送信できるようにCPUでそれらを計算する必要がありますか、またはGLSLが最終的な行列を計算できるようにこれらの3つの行列を個別にGPUに送信する必要がありますか?

つまり、この場合、GLSLはすべての頂点のMVPマトリックスを計算する必要があるため、CPUで事前計算する方がおそらく高速です。

しかし、GLSLがMVP行列を計算する必要があるのは一度だけであるとしましょう。GPUは、CPUよりも高速に最終的な行列を計算しますか?

41
Maik Klein

一般的なルール:uniformの形式でシェーダーに渡すことができる場合、CPUでalwaysが事前計算されます。例外なく。シェーダー側の計算は、頂点とフラグメント間で異なる値に対してのみ意味があります。頂点のバッチ全体で一定であるものはすべて、CPUで最も効率的に処理されます。

GPUは魔法のような「すべてをより速く実行できる」マシンではありません。非常に大きなデータセットであっても、CPUがGPUを簡単に上回ることができる特定のタスクがあります。したがって、非常に単純なガイドラインは次のとおりです。GPUが処理するためにオーバーヘッド全体でGPUが必要とするよりも多くのCPU時間を計算に費やすことなくCPUに移動できる場合は、CPUで実行します。単一の行列の計算は、これらのタスクの1つです。

63
datenwolf

OpenGLのほとんどの状況と同様に、状況によって異なります。

ほとんどの場合、単一の計算はGPUよりもCPUで高速に実行できます。 GPUの利点は、多数の計算を並行して実行できることです。

一方、ボトルネックの場所にも依存します。 CPUが他の多くの作業を行っているが、シェーダーがまだ最も能力の低いターゲットシステムでボトルネックになっていない場合、行列の乗算を頂点シェーダーに移動することで、パフォーマンスの向上を簡単に確認できます。

一般に、頂点シェーダーやCPUで実行できるフラグメントシェーダーでの作業は回避する必要がありますが、それ以外は状況によって異なります。パフォーマンスの問題が発生していない限り、最も簡単な方法で実行します。パフォーマンスの問題が発生している場合は、両方の方法でパフォーマンスをプロファイルし、パフォーマンスをプロファイルしてどちらが適切に機能するかを確認します。

15
bcrist