GPUがCPUよりも数値計算でパフォーマンスが高いのはなぜですか?そして、分岐でさらに悪いですか?誰かが私にそれの詳細な説明を与えることができますか?
2 に答える
正確に何を探しているのかわからない。それがなぜ他の方法ではなくこの方法でそれを行うのかを一般的に理解するためであると仮定します。この記事はあなたの質問への合理的な理解を提供します(素人の言葉で):
https://en.bitcoin.it/wiki/Why_a_GPU_mines_faster_than_a_CPU
要するに:
CPUコアはクロックあたり4つの32ビット命令(128ビットSSE命令を使用)またはAVX(256ビット)を介して8を実行できますが、Radeon HD 5970のようなGPUはクロックあたり3200の32ビット命令を実行できます(その3200ALUまたはシェーダー)。これは、クロックあたり800倍(AVXの場合は400倍)の命令数の差です。2011年の時点で、最速のCPUは最大6、8、または12コアで、周波数クロックはやや高くなっています(Radeon HD5970の725MHzに対して2000〜3000 MHz)が、1つのHD5970はそれでも5倍以上高速です。 2.3GHzの4つの12コアCPU(これにより、HD5970の350ドルではなく、約4700ドルも戻されます)。
GPUは、特定のタスク、つまり、多数の計算を必要とする3Dグラフィックスをレンダリングするために設計されています。したがって、ほとんどの最新のブラウザのように、特定のアプリケーションは「数値計算」をGPUにオフロードします。一方、分岐機能の場合、CPUの方が「オーバーロード」機能が優れているため、タスクはCPUで保持されます(今のところ、後で何をするかは誰にもわかりません)。
GPUの各SMは、SIMDの各レーンでワープの異なるスレッドを実行するSIMDプロセッサです。アプリケーションがより計算に縛られ(数回のメモリアクセス)、GPUのピークFLOPSを達成するブランチアプリケーションがなくなると。これは、分岐時に、GPUが分岐の一方の側をマスクし、もう一方の側を最初に実行するという事実によるものです。両方のパスが連続して実行され、一部のSIMDレーンが非アクティブのままになるため、パフォーマンスが低下します。
パフォーマンスが実際にどのように低下するかを示すために、前述のリファレンスで公開されているFungの論文からの有用な図を含めました。
図(a)は、ワープ内で発生したGPUの典型的な分岐分岐を示しています(このサンプルでは4スレッド)。次のカーネルコードがあるとします。
A: // some computation
if(X){
B: // some computation
if(Y){
C: // some computation
}
else{
D: // some computation
}
E: // some computation
}else{
F: // some computation
}
G: // some computation
AのスレッドはBとFに分岐します。(b)に示すように、一部のSIMDレーンは、パフォーマンスを低下させる時間の経過とともに無効になります。図(c)から(e)は、ハードウェアがどのように分岐パスをシリアルに実行し、分岐を管理するかを示しています。詳細については、この有用な論文を参照してください。これは素晴らしい出発点です。
行列乗算やN体シミュレーションなどのコンピューティングバウンドアプリケーションは、GPUに適切にマッピングされ、非常に高いパフォーマンスを返します。これは、SIMDレーンを十分に占有し、ストリーミングモデルに従い、メモリアクセスが少ないためです。