6/13 の授業中に, 実行結果に関してわからなくなった点について補足です.
以下のような出力
[t77006@obcx02 02mm]$ ./exe/mm_simd.exe
A = 16 x 128 (8192 bytes)
B = 128 x 32 (16384 bytes)
C = 16 x 32 (2048 bytes)
repeat C += A * B 1 times
131072 flops, total 26624 bytes
cpu cycles: 30429
instructions: 25694
branch instructions: 4254
ref cycles: 27292
time: 0.000
4.803 flops/clock = 0.150 vfmadds/clock
4.307 flops/cpu clock = 0.135 vfmadds/cpu clock
12.127313 GFLOPS
OK: max relative error = 0.000000
で
4.803 flops/clock = 0.150 vfmadds/clock
4.307 flops/cpu clock = 0.135 vfmadds/cpu clock
という2つのclock がありますが,
- 1コア(OpenMPなし. SIMDとILP)での性能を追求するに当たっては, 後者を使って 2 vfmadds/cpu clock が目指す max の性能になります. なおこのとき前者はもう少し高い値を示していると思います
- 複数コアを使った(OpenMPありの)場合はこれをコア数倍したものがmaxの性能なのですが, 授業中に発覚したとおり, 前者の値 (xxx vfmadds/cpu clock)は複数コアを使った場合に(こちらのミスにより)おかしな数字になりますので, 後者(xxx vfmadds/clock)を使ってください. 両者はプロセッサの持つ消費電力調整機能(動いているコア数などによって動作周波数を変える)により, 特に動作しているコア数が少ないときに異なります(前者が速い値を示す)が, ほとんどすべてのコアを使った場合はほとんど変わりません.
よって多数のコアを使った場合, こちらで(2 x コア数) vfmadds/clockがmax (目標)です.
- 前者を, 複数コアでも正しくなるようにできるか調査しますがすぐにできると期待しないで, 進めてください.
原理的に, OpenMPのスレッド(OMP_NUM_THREADS)を56を越えて増やしても早くなることはないと思って良いので, 112 vfmadds/clockに近い数字が出ればすごい, ということ
(112 vfmadds/clock = 112 * 32 flops/clock = 112 * 32 * 2.7 GFLOPS = 9.6TFLOPS)