L.Entisの日記: GPUのパワー 4
日記 by
L.Entis
ソフトウェアレイトレの絡みで、将来的にはGPGPU化のネタもあるわけだけど、ではGPU化することにどの程度の有用性があるのか検討してみるテスト。
適当に検索して出てきたこのページの結果を使うことにしてみます。
ここでのテストはほぼCPU(GPU)内だけでの単純な演算性能を示しています。(図float加減算、図float加減算(詳細))
ただし、このテストに関して、CPU側(Core2)の性能については1つ注意しておかなければならないのは、単一CPU内での並列実行が全く考慮されていないということ。
このテストで使われているコードでは、データ依存性があるため1回のループで1回しか演算できませんが、依存性がなければ実際には3つくらいは同時に演算できます。
更に、SIMDを使えば4倍になります。結果、CPU単体で12倍程度性能となります。
まあ現実にはそこまで行くコードを書くのは困難でしょうが、ここのテストはほとんど理想値が出るテストなので、単純に12倍して計算することにしてみます。
Core2Duo 3GHz 1thread = 4.183 / 12 = 0.3485833…
GeForce8800GT 112block 32thread = 0.08623
で、レイトレでは多コア前提なので、4つコアがある場合と想定してみると、
Core2Quad 3GHz 1thread*4 = 4.183 / 12 / 4 = 0.087145833…
GeForce8800GT 112block 32thread と大して変わりません。
まあ、上位GPU使えばもっと値は出るのでしょうけど、GPGPUで組む場合の制約を考えると、個人的には現時点であまり有用性はないかな。
終了。
適当に検索して出てきたこのページの結果を使うことにしてみます。
ここでのテストはほぼCPU(GPU)内だけでの単純な演算性能を示しています。(図float加減算、図float加減算(詳細))
ただし、このテストに関して、CPU側(Core2)の性能については1つ注意しておかなければならないのは、単一CPU内での並列実行が全く考慮されていないということ。
このテストで使われているコードでは、データ依存性があるため1回のループで1回しか演算できませんが、依存性がなければ実際には3つくらいは同時に演算できます。
更に、SIMDを使えば4倍になります。結果、CPU単体で12倍程度性能となります。
まあ現実にはそこまで行くコードを書くのは困難でしょうが、ここのテストはほとんど理想値が出るテストなので、単純に12倍して計算することにしてみます。
Core2Duo 3GHz 1thread = 4.183 / 12 = 0.3485833…
GeForce8800GT 112block 32thread = 0.08623
で、レイトレでは多コア前提なので、4つコアがある場合と想定してみると、
Core2Quad 3GHz 1thread*4 = 4.183 / 12 / 4 = 0.087145833…
GeForce8800GT 112block 32thread と大して変わりません。
まあ、上位GPU使えばもっと値は出るのでしょうけど、GPGPUで組む場合の制約を考えると、個人的には現時点であまり有用性はないかな。
終了。
今どきのコンパイラなら (スコア:0)
どんな最適化オプションでコンパイルしたのか全く書かれていませんけど。
Re:今どきのコンパイラなら (スコア:1)
a += b ;
a += b ;
というコードがあったとして、どのように最適化されるというのですか?
依存性と最適化は関係ありませんよ。
(ループや演算そのものが削除されたりすることはあるかもしれませんが、依存性のあるコードはどんなに最適化されてもa+=bが並列に実行されることはありません)
Re:今どきのコンパイラなら (スコア:1)
コメントアウトしている部分を消していったとき、どんな値が表示されるか実際に試してみるといいと思います。
(ただし、ループの部分が最適化で消えてしまわないようにして)
演算量が倍になっても1割程度しか速度は遅くならないはずです。
(しかし、3倍になるとコードの状態によってはかなり遅くなるかも。これは演算命令だけではなく、mov命令も含めて同時に3つまでしか発行できないためでしょう。アセンブラでループの中を書くとよりはっきりします)
Re:今どきのコンパイラなら (スコア:1)
誤解のないように修正。
コメントアウト(行頭の'//')を外していったら、という意図です。