コンテンツに飛ぶ | ナビゲーションに飛ぶ

パーソナルツール
セクション
現在位置: ホーム PAPIでFLOPSを測定する

PAPIでFLOPSを測定する

PAPI(Performance Application Programming Interface)で計算機のFLOPSを測定します

物性研にいたころにほぼ同じことを書いたのだが、あれから時間も経ったし、
物性研のウェブページに置いたPAPIのサンプルプログラムのダウンロードが
できなくなっているので、改めてメモを書き残しておこう。

PAPI(Performance Application Programming Interface)とは、計算機が実際に行った処理の回数などを
勘定して、自分が書いたプログラムの性能などを教えてくれる便利なAPIである。 今日はIntel Core i7
3820を使ってFLOPSを測ろうと思ったのだが、 AVXを使ってもちゃんと測定してくれるのだろうか
という不安があった。調べてみると一応大丈夫なようである。

昔書いたプログラムを引っぱり出してきて、SSE2のところをAVX用に 書き直した。計算の内容は、
意味の無い掛け算と足し算の繰り返しなのだが、計算がシンプルであるがために計算機の理論性能が
ほぼそのまま見えるようになっている。

まず理論性能を計算してみると、Core i7 3820の動作周波数は3.6GHzで、1回に2つのインストラクション
(乗算器と加算器がひとつずつ)が可能で、AVXで一度に256bitの演算(浮動小数点数8つ分)ができるから、

$\mbox{理論性能値} = 3.6(\mbox{GHz})\times2(\mbox{inst.})\times8(\mbox{AVX}) = 57.6 \, \mbox{GFLOPS}$

となる。実際に測ってみると 56.9 GFLOPSが出ていて、だいたい理論性能通りとなった。
__m256d型の変数の数とループ展開で1ループの長さを変えて何度か測定したのだが、ループ展開の方は
測定結果にほぼ全く影響しなかった。この数年でコンパイラが賢くなったということだろうか。一方、
__m256d型の変数の数は、16を越えるところで大きく性能が劣化した。これはymmレジスタが16個なので
当たり前の結果。

OpenMPでも同様の振る舞いが見えた。4コアの石なので理論性能は 230.4 GFLOPSで、実測値は227 GFLOPS
程度であった。サンプルプログラムを下に置いておくので、よろしければどうぞ。


test_papi.tgz


以下追記(2013年7月8日)
上のメモを書いた後に、SSE2用に書いたプログラムをSandy-Bridgeで走らせても性能が出るのか気になったので、
昔書いたプログラムをそのまま走らせてみた。得られた結果は、28.4 GFLOPSで、理論性能のほぼ半分。つまり、
コンパイラの方で、__m128d型の変数を__m256d型に読み直すとかはしてくれず、SSE2用のプログラムはAVX用に
書き直した方がよいという結果を得た。