« Cellの最大演算性能 | トップページ | Cell SDK 3.0のアップデート »

Core2 Quadの最大演算性能

連休に自宅PCのCPUをCore2 Quad Q9450に更新しました。今回はCellプログラミングネタではありませんが、Core2 Quadの演算性能測定結果を掲載します。

測定方法はCellの最大演算性能で、Pentium4の性能測定に使用したGoto BLASによる行列積の計算です。

Goto BLASのビルド

BLAS(Basic Linear Algebra Subprograms)とは、シミュレーションなどで使用する行列演算やベクトル演算のライブラリー集です。Fedora 7にはBLAS・ATLAS、Cell SDK 3.0にはLAPACKというパッケージが提供されています。Goto BLASは独自の最適化を行っており、CPU性能の限界が引き出せることで有名なため、Goto BLASを性能測定用に使用しました。

Goto BLASはその名の通り、テキサス大学 Texas Advanced Computing Center (TACC)の後藤和茂さんによって開発されたパッケージで、TACCのWebサイトからソースコードがダウンロードできます(アカウント登録が必要)。

以下の手順で、Goto BLASのビルドを行います。 ビルドの方法はこちらを参考にさせていただきました。

  • ソースをダウンロードしたら適当なディレクトリに展開します
    (例えば; /usr/src/GotoBLAS)
  • quickbuild.32bitを実行
  • libgoto_penrynp-r1.26.a、libgoto_penrynp-r1.26.soがソースディレクトリに生成されます(ファイル名のpenrynpの部分はコンパイルを行うCPU種別によって変化します)
  • libgoto_xxx.a, libgoto_xxx.soを/usr/libにコピー(ユーザープログラムとリンクする際にデフォルトのライブラリパスが使用できるようにするため)
  • /usr/libに移動してlibgoto.a, libgoto.soにシンボリックリンクを作成
      # ln -s libgoto_penrynp-r1.26.a libgoto.a
      # ln -s libgoto_penrynp-r1.26.so libgoto.so

CBLASのビルド

BLASは元々FORTRAN用に作成されているため、Cから呼び出すこと(リンクすること)ができません。CからBLASを利用するためのInterfaceがCBLASになります。CBLASのソースを、BLAS Technical Forumの「Reference implementation for the C interface to the Legacy BLAS」からダウンロードして、以下の手順でビルドします。

  • 事前にFORTRANコンパイラをインストールする必要があります。今回は、gfortran(GNU Fortran)を使用しました
  • ソースを適当なディレクトリに展開(例えば; /usr/src/CBLAS)
  • ソースディレクトリに移動して以下のリンクを作成
    # ln -s Makefile.LINUX Makefile.in
  • Makefine.LINUXの以下を編集
      BLLIB = /usr/lib/libgoto.a   --- GotoBLASのパスを指定
      CBDIR = /usr/src/CBLAS   -- CBLASのソースディレクトリ
      FC = gfortran  -- FORTRANコンパイラの指定
  • make alllib
    make allを指定すると、ライブラリの生成に加えて、テストプログラムのビルドを行うのですが、こちらは途中でエラー終了してしまいました。libgotoをリンクするところでエラーになっているのですが、Goto BLASをマルチスレッド版でビルドしているのに対して、テストプログラムがシングルスレッドのためエラーになっているように見えます。そのため、make alllibでライブラリが生成できればよしとします。
  • ./lib/LINUX/cblas_LINUX.a を/usr/libにコピー
  • /usr/libに移動して、# ln -s cblas_LINUX.a libcblas.a にてシンボリックリンクを作成
  • /usr/src/CBLAS/src/cblas.hを/usr/includeにコピー

行列積計算

Cellの最大演算性能でPentium4の性能測定に使用したプログラムを実行します(ソースファイルをダウンロード )。Goto BLASを使用する際のポイントを以下に示します。

  • マルチコアCPUを使用した場合、Goto BLASが自動的にコア数分のスレッドを生成します。並列処理を加味した計算データーの分割を考えなくてもよいため、非常に楽ちんです
  • スレッド数を制限したい場合は、環境変数 GOTO_NUM_THREADS=1 等を設定します(数字は最大スレッド数)
  • プログラムにcblas.hをインクルードし、プロトタイプ宣言に従ってBLASライブラリを呼び出します。行列積を求める関数名はcblas_sgemmです。
  • リンクの際は、ライブラリとしてcbras, goto, pthreadを指定します (リンカオプションに-lcblas -lgoto -lpthreadを指定)
  • マルチスレッド版のGoto BLASを使用する場合、pthreadの指定が必要です

計算結果

単精度浮動小数点4096 x 4096要素の行列積を5回繰り返した際の性能値は以下となりました。CPUはCore2 Quad Q9450(3GHzで動作)です。

コア数(スレッド数)GFLOPS
1 22.50
2 44.75
3 64.66
4 88.50
  • コアあたりの演算性能は22 GLOPSとなり、コア数(スレッド数)に比例してリニアに性能が伸びました
  • コア数を増やした際に、メモリアクセス競合によって性能が低下するようなことはありませんでした。行列積は計算量に対してメモリアクセスが比較的少なく、複数のコアが同時にメモリアクセスを行った際に、片方のコアで計算がストールするシーンがないものと思われます
  • Pentium 4(3.4GHz)で同様の計算を行った際の性能値が11.22GFLOPSでしたので、Core 2でコアあたりの性能は2倍に向上しました
  • CellはSPUあたり23.21GFLOPS、6 SPU時139.36GFLOPSの性能が出せるため、この手のピーク性能競争では、SPUコア数が多い分Cellが優位を保っています

PS

コア数を変化させた際の性能特性を計りたいために、まだまだ高価なCore 2 Quad Q9450を購入してしまいました(これまで買ったCPUでもっとも高価、、)。安くなったQ6600のと比較では最後まで悩んだのですが、そこは新しいもの好きの血が騒ぎ、結局は9450となりました、、

MB(P5K-E)、CPU FAN(サントラスト薙刀)はPentium4時代に買ったものを継続使用しているのですが、4コアフル稼働時でもファンの回転速度がP4フル稼働時より低くなることから、性能に加えて、発熱の点でも改善された印象があります。(ただ、温度センサーの動作がP4, Core2では異なるため厳密な比較はできませんが)。FANの騒音は低負荷時・負荷時とも確実に下がっており、この点は非常にうれしいです。

日常の利用シーンではP4に対して8倍(2倍x4コア)の性能向上を実感できることはないのですが、騒音低減、いざというときの予備性能(?)で、自己満足度は100%です。

« Cellの最大演算性能 | トップページ | Cell SDK 3.0のアップデート »

Cellプログラミング」カテゴリの記事

コメント

自分もQ9450最近買いましたが、同じくすごい
性能に驚いています。
ちなみにRadeon3870などは、500Gflopsの演算
性能があると聞くのですが、CUDAみたいに
演算させられるのですかね?
500GといったらCellを大幅に上回っている
ように思います。

通行人さん。コメントありがとうございました。
CUDAのことは知りませんでした。GPUで汎用計算ができるのですね。私のビデオカードは8600GTでCUDA対応の様ですので、試したくなってきました。

PS3ユーザーなら恐らくおなじみのFolding@Homeでは、ATIのGPUを使って演算ができます。Client statistics (http://fah-web.stanford.edu/cgi-bin/main.py?qtype=osstats)を見ると、clientあたりのFLOPS値はGPUの方が上に見えます。

http://www.intel.co.jp/jp/support/processors/sb/CS-023143.htm
このインテルの公称値とかけ離れてるのですが、これはどういう事なのですか?

コメントありがとうございます。

性能測定はCore2 Quadの3GHz(クロックアップ)で行っているため、9650(48GFOPS)相当と考えると、確かにリンクいただいたIntelの公称値に対して2倍近い値になりますね。

行列積は以下の計算で求めることができます。
for (i = 0; i < msize; i++) {
 for (j = 0; j < msize; j++) {
  tmp = 0.0;
  for (k = 0; k < msize; k++) {
   tmp += a[i*msize + k] * b[k*msize + j]; 式①
   }
 c[i*msize + j] = tmp;
 }
}

式①が実行される回数はmsize ^ 3となりますが、式①の中で要素の掛け算と足しこみを行うため、演算回数は2 * msize ^3と言えます(msize = MxM行列のM)。

GFLOPS値はCell版のプログラム(Cell SDK付属)を流用しており、上記の計算量を元に、以下の式で求めています:
((2*msize-1) * (msize*msize) * iterations) / (1E9 * exec_time)

最初の2*がないと性能値が半分になりますので、インテルの公称値と合いますね。式①(積和計算ですので2回の演算)はSSEの演算器としては1命令で実行できるため、命令の実行回数という意味で2*を抜けば公称値に近くなるのですが、インテルの公称値がどのような計算根拠なのか分からないのでなんとも言えません。。

別エントリで示したCellプロセッサとの性能比較という意味ではベースが同じになりますので、Cellが139GFLOPSという性能測定結果と対比すると、Core2 Quad 3GHzで88GFLOPS相当になるとご理解下さい。

この記事へのコメントは終了しました。

« Cellの最大演算性能 | トップページ | Cell SDK 3.0のアップデート »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ