11. MPIクラスターを作ろう! - 姫野ベンチを動かす
前回からのつづきです。
10. MPIクラスターを作ろう! - NFSクライアント設定 - 電子計算記
NFSストレージサーバーが用意できたので、MPIクラスター環境として最低限動作するところまで構築できたので、実際にあるベンチマークソフトウェアを使ってクラスターの性能を測定してみましょう。
1つ目はHPC想定のベンチマークとしては定番の姫野ベンチをやります。
姫野ベンチマーク | 理化学研究所情報基盤センター(所内および所外向け)
姫野ベンチが何かはリンク先を見てもらうとして、姫野ベンチの良いところの1つにCやFortran、MPIやOpenMPなど様々な実装が公式にあることです。
というわけで、早速MPI版をダウンロードしコンパイルしてMPI実行してみましょう。
今回は C + MPI, static allocate version を利用します。
C言語で書かれて、MPIで並列化されているコードになりますが、static allocateの部分は、計算サイズと並列化する分割のやり方を事前に指定しコンパイルする使い方となります。
まずは、これまでインストールしていなくビルドに必要なパッケージを入れます。(compute-1のみで大丈夫です)
姫野ベンチがlzh形式で圧縮されているのでその展開用に使うツールと、ビルドに使うコマンドです。
root@compute-1:~# apt install lhasa -y root@compute-1:~# apt install make -y
ではまずは姫野ベンチをダウンロードし展開しましょう。zipを展開したらlzhが出てくるので注意です。(アップ時のミスかな??)展開先はNFSストレージ上です。
mpiuser@compute-1:~$ wget http://accc.riken.jp/wp-content/uploads/2015/07/cc_himenobmtxp_mpi.zip mpiuser@compute-1:~$ unzip cc_himenobmtxp_mpi.zip mpiuser@compute-1:~$ lha xw=/nfs/himeno cc_himenobmtxp_mpi.lzh /nfs/himeno/himenoBMTxps.c - Melted : oo /nfs/himeno/Makefile.sample - Melted : o /nfs/himeno/param.h - Melted : o /nfs/himeno/paramset.sh - Melted : o mpiuser@compute-1:~$ cd /nfs/himeno/ mpiuser@compute-1:/nfs/himeno$ ls -lh total 28K -rw------- 1 mpiuser mpiuser 13K Sep 29 2005 himenoBMTxps.c -rw------- 1 mpiuser mpiuser 251 Feb 21 2002 Makefile.sample -rw------- 1 mpiuser mpiuser 202 Feb 21 2002 param.h -rw------- 1 mpiuser mpiuser 2.1K Feb 21 2002 paramset.sh
まずはMakefileですが、今回はサンプルのものをそのまま使えます。
mpiuser@compute-1:/nfs/himeno$ cp Makefile.sample Makefile
次にmakeする前にパラメータを設定します。設定ツールとしてparamset.shが用意されています。
使い方は、最初に計算サイズ(XS, S, M, L, XL, XXL)を指定し、3次元分の分割数を指定します。
ここでは、計算サイズをM、2並列で分割する例です。パラメータ設定後にmakeします。
mpiuser@compute-1:/nfs/himeno$ chmod +x ./paramset.sh mpiuser@compute-1:/nfs/himeno$ ./paramset.sh M 1 1 2 mpiuser@compute-1:/nfs/himeno$ make
実行はこれまでどおりですが、プロセス数(-np)はパラメータ設定と一致させる必要が有ります。
今回(./paramset.sh M 1 1 2)だと1*1*2=2で-np 2となります。
例えば-np4 の場合は、1*2*2=4になります。(./paramset.sh M 1 2 2)
mpiuser@compute-1:/nfs/himeno$ mpirun -np 2 --hostfile ~/my_hosts /nfs/himeno/bmt Sequential version array size mimax = 129 mjmax = 129 mkmax = 257 Parallel version array size mimax = 129 mjmax = 129 mkmax = 131 imax = 128 jmax = 128 kmax =129 I-decomp = 1 J-decomp = 1 K-decomp =2 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 5504.816162 time(s): 0.074719 1.667103e-03 Now, start the actual measurement process. The loop will be excuted in 2409 times This will take about one minute. Wait for a while cpu : 600.021093 sec. Loop executed for 2409 times Gosa : 4.109818e-04 MFLOPS measured : 550.457770 Score based on Pentium III 600MHz : 6.644831
最終的な結果は、MFLOPS measuredの値になりますので、今回は 550.457770 MFLOPS ということになります。
もし、姫野ベンチを別の環境で動かしたことがある人なら、やけに実行完了まで時間がかかったと感じると思います。
これは姫野ベンチの実装と、IDCFクラウドのLight.S1の動作に関係しています。
姫野ベンチでは、最初に3回計算し、その結果をもとに十分な計算回数かつ適度な処理時間(1分×プロセス数)になるよう回数が決められ最終的な計測が行われます。
一方で、IDCFクラウドのLight.S1はスペック上は800MHzとなっていますが、これはクロックキャッピングによるもので、ずっと負荷がかかると800MHzまでしか出ないですが、瞬間的であれば800MHzよりバーストして物理CPUスペック分性能が出ます。
そのため、物理CPU分の性能で計算回数を決めてしまい、実際の計算がはじまると本来の800MHzで計算するので何倍も余計に時間がかかってしまい、ノード数が増えるとその分さらに時間がかかってしまいます。
上記の2プロセスの場合、10分ほどかかりました(本来なら2分くらいになる)。また、4プロセスにすると100分以上かかりました。
しかも以下のとおり結果は、2プロセス(2ノード)より4プロセス(4ノード)の方が遅くなっています。
mpiuser@compute-1:/nfs/himeno$ mpirun -np 4 --hostfile ~/my_hosts /nfs/himeno/bmt Sequential version array size mimax = 129 mjmax = 129 mkmax = 257 Parallel version array size mimax = 129 mjmax = 67 mkmax = 131 imax = 128 jmax = 65 kmax =129 I-decomp = 1 J-decomp = 2 K-decomp =2 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 11850.404321 time(s): 0.034709 1.702009e-03 Now, start the actual measurement process. The loop will be excuted in 5185 times This will take about one minute. Wait for a while cpu : 6080.535240 sec. Loop executed for 5185 times Gosa : 1.423682e-04 MFLOPS measured : 116.912427 Score based on Pentium III 600MHz : 1.411304
次回は、このあたり詳しくみていきましょう。計測時間がながくなることが問題なのか、そもそもクロックキャッピングが悪さするのか。