パスワードを忘れた? アカウント作成
459650 journal

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で組む場合の制約を考えると、個人的には現時点であまり有用性はないかな。
終了。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2008年09月23日 15時13分 (#1424750)
    その程度の依存性は勝手に排除してくれるんじゃないですか?
    どんな最適化オプションでコンパイルしたのか全く書かれていませんけど。
    • 例えば、
      a += b ;
      a += b ;
      というコードがあったとして、どのように最適化されるというのですか?
      依存性と最適化は関係ありませんよ。
      (ループや演算そのものが削除されたりすることはあるかもしれませんが、依存性のあるコードはどんなに最適化されてもa+=bが並列に実行されることはありません)

      親コメント
      • 例えば、次のようなコード;

        DWORD dwBegin = GetTickCount( ) ;
        int a = 0, b = 0, c = 0 ;
        int a1 = 1, b1 = 1, c1 = 1 ;
        for ( int i = 0; i < 100000000; i ++ )
        {
        a += a1 ;
        // b += b1 ;
        // c += c1 ;
        }
        DWORD dwEnd = GetTickCount( ) ;
        printf( "%d [ms]\n", dwEnd - dwBegin ) ;

        コメントアウトしている部分を消していったとき、どんな値が表示されるか実際に試してみるといいと思います。
        (ただし、ループの部分が最適化で消えてしまわないようにして)

        演算量が倍になっても1割程度しか速度は遅くならないはずです。
        (しかし、3倍になるとコードの状態によってはかなり遅くなるかも。これは演算命令だけではなく、mov命令も含めて同時に3つまでしか発行できないためでしょう。アセンブラでループの中を書くとよりはっきりします)

        親コメント
typodupeerror

開いた括弧は必ず閉じる -- あるプログラマー

読み込み中...