=====================================
PAPIによるFLOPS値計測用サンプルコード
=====================================

このディレクトリに入っているファイルは以下の通りです。

README:
このファイル

flops_sgl.cpp, test_utils_sgl.hpp:
シングルコア計算用のソースコード

flops_omp.cpp, test_utils_omp.hpp:
OpenMPによるスレッド計算用のソースコード

mkcode_sgl.rb, mkcode_omp.rb:
コード生成スクリプト

<<----------------------------------------------->>

==============
コンパイル方法
==============

SIMD を有効にするオプションをつけてコンパイルをして下さい。
GNUコンパイラの場合は、
g++ -O3 -mavx flops_sgl.cpp -lpapi
g++ -O3 -fopenmp -mavx flops_omp.cpp -lpapi
で十分です。

<<----------------------------------------------->>

========
実行方法
========

<<シングルコア計算>>
実行ファイルの後ろに計算の回数を指定して実行して下さい。
例えば、

  ./a.out 10000000

最近のCPUであれば1秒かからず実行が済むと思います。

<<スレッド計算>>
シングルコア計算の時と同様に、実行ファイルの後ろに計算の回数を
指定して実行して下さい。
例えば、

  export OMP_NUM_THREADS=4
  ./a.out 100000000

実行後、
・倍精度浮動小数点数演算の回数
・実行時間
・GFLOPS値
が表示されます。

<<----------------------------------------------->>

============================
コード生成スクリプトについて
============================

Ruby で書かれたコード生成用スクリプトを同梱してあります。
実行方法は、

  ruby mkcode_sgl.rb nvar nrep

もしくは

  ruby mkcode_omp.rb nvar nrep

で、nvar, nrep にはそれぞれ配列aの次元、一つのfor文の中で
繰り返す演算の回数が入ります。
例えば、私が用意したコードを生成する場合、

  ruby mkcode_omp.rb 16 8

となります。
nvar や nrep を変えたときのGFLOPS値の変化とその理由を
考えてみて下さい。
