電子計算記

個人的な検証を

16. MPIクラスターを作ろう! - HPLのパラメータを検討

前回からのつづきです。
15. MPIクラスターを作ろう! - HPLを動かしてみる - 電子計算記

前回実行したテストでは、4.915e-02GFLOPSつまり0.05GFLOPSであり、S1を1ノードだとしてもだいぶ遅い結果です。
ここからスコアをあげていくにはパラメータのチューニングが必要になってきます。

具体的には、HPL.datの中を編集し実行しを繰り返し、最大スコアを探していく必要があります。
このパラメータの意味や使い方は公式のチューニングのページにあります。

HPL Tuning

どんな値がよいかは、公式のFAQのページにあります。

HPL Frequently Asked Questions

ただ、読んでもよくわからないので、試していくしかないので、時間かかりますがどんどん動かしていきます。
ここではスコアへの影響が大きい最低限やるべきパラメータ、N、NB、P、Qについて見ていきます。

N

Nは問題のサイズで一番スコアに影響します。基本的には、使用可能なメモリ容量に依存し、大きいほど高いスコアが出ます。そして計算時間も長くなっていきます。
FAQには1GBで10000とありますので、1000から順に上げてスコアを見ていきます。

HPL.datのN=10000の例です。ここでは、NB=64、P=1、Q=4に固定し、Light.S1を4ノードで実行しました。

HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out      output file name (if any)
6            device out (6=stdout,7=stderr,file)
1            # of problems sizes (N)
10000        Ns
1            # of NBs
64           NBs
0            PMAP process mapping (0=Row-,1=Column-major)
1            # of process grids (P x Q)
1            Ps
4            Qs
16.0         threshold
3            # of panel fact
0 1 2        PFACTs (0=left, 1=Crout, 2=Right)
2            # of recursive stopping criterium
2 4          NBMINs (>= 1)
1            # of panels in recursion
2            NDIVs
3            # of recursive panel fact.
0 1 2        RFACTs (0=left, 1=Crout, 2=Right)
1            # of broadcast
0            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1            # of lookahead depth
0            DEPTHs (>=0)
2            SWAP (0=bin-exch,1=long,2=mix)
64           swapping threshold
0            L1 in (0=transposed,1=no-transposed) form
0            U  in (0=transposed,1=no-transposed) form
1            Equilibration (0=no,1=yes)
8            memory alignment in double (> 0)

実行は特に変わったことはありません。

mpiuser@compute-1:/nfs/hpl-2.2/bin/Linux_PII_CBLAS_gm$ mpirun -np 4 --hostfile ~/my_hosts ./xhpl 

結果です。1回の実行で18テストの結果がでますが、その中の1番高いスコアを用いました。

f:id:fujish:20180129002340p:plain

N=20000だとメモリ不足で実行できませんでした。
Nを大きくしていけば、スコアも大きくなるはずですが、なぜかN=1000とか2000の方がスコアが良い結果に。
N=1000のときは数秒で実行完了しますが、N=19000のときは5時間以上かかります。
そのため、これまでもあったようにクロックキャッピングの影響と考えられます。

というわけで、クロックキャッピングの影響が少ないHighCPU.M4を4ノードで同じく実行していみます。slots=1として4ノードで4プロセスを動かします。

f:id:fujish:20180129003200p:plain

結果は順当に上がり、Nは大きければ大きいほど良いようです。
ちなみにN=45000はメモリ不足なり、N=40000のときは3時間弱計算にかかりました。

ここまでの最良のスコアとしては
Light.S1は N=19000 のとき 4.77e+00 GFLOPS
HighCPU.M4は N=40000 のとき 8.14e+01 GFLOPS
となりました。

NB

NBはブロックサイズです。この値は、大きすぎてもだめ、小さすぎてもだめです。
FAQによると32から256の間が良さそうとのことで、NBの値を変えて動かしてみます。
Nは上記より、S1はN=19000、M4はN=40000としています。

では、Light.S1の結果から。

f:id:fujish:20180129004735p:plain

NB=256が一番良かったですが、NB=512はメモリ不足で実行できませんでした。

次に、HighCPU.M4の結果。

f:id:fujish:20180129004833p:plain

NB=256が一番良かったです。

ということで、ここまでの最良のスコアは、
Light.S1は N=19000, NB=256 のとき 8.72E+00 GFLOPS
HighCPU.M4は N=40000, NB=256 のとき 1.03e+02 GFLOPS
となりました。

PとQ

最後に、PとQですが、これはプロセスグリッドの数です。なのでmpirunするときのnpの値に揃える必要があります。
今回は4ノードなので、1*4、2*2、4*1の3パターンが考えられます。
FAQによると、1*4, 1*8, 2*4とQの方を大きく平坦にするのが良いそうです。

Light.S1の結果です。

f:id:fujish:20180129005743p:plain

HighCPU.M4の結果です。

f:id:fujish:20180129005825p:plain

いずれもP*Q=1*4が一番良かったです。

最終的な結果としては変わらず、-np 4で4ノード実行したときは
Light.S1は N=19000, NB=256 のとき 8.72E+00 GFLOPS
HighCPU.M4は N=40000, NB=256 のとき 1.03e+02 GFLOPS
となりました。

※HighCPU,M4(2vCPU)のときの-np 4で4ノード実行のときはslots=1として各ノード1プロセスづつしか動かしてません

以上で、HPLの回は終わりにしようと思います。パラメータのチューニングだけでなく、BLASのパッケージ選択など、本気でやるとキリがないですね。TOP500のスコアをとるのは相当大変なんですね。
次で、最後のコマですが、最後も定番のSTREAMにしようかなと思ってます。

fujish.hateblo.jp