万人のためのハイパフォーマンスコンピューティング

HPC Do It Yourself Club

      HOMEE5-2600v3製品情報お役立ち情報購入案内お問い合わせ会社案内
      ムービーダウンロードドキュメント最新トピックスおもしろLinkHPCノウハウ

4 Node FDR Infiniband Cluster性能評価
OpenMPIとOpenMPのHybrid実行でのMustオプション
OpenMPIで別ノードの環境変数をセットするには

InfiniBand QDR vs. Gb Ethernet

その2:姫野ベンチで性能比較

(最新のドライバーでの性能比較はコチラ

(FDR Infinibandでの性能評価はコチラ

  InfiniBandを使ったときにデータ転送がどれだけ速くなるかは、2つ前の記事に書いたとおり、Gigabit Ethernetの約28倍だった。では実際のプログラムを動かしたとき、計算はどれだけ速くなるのだろうか。今回は姫野ベンチを使って、InfiniBandとGigabit Ethernetの速度を比較してみる。コンピュータはHPCDIY-SWS87-8GB8を2台、それぞれにInfiniBand QDRカードを挿入しスイッチを使わずにケーブルのみでp2p接続してある。Gigabit Ethernetもeth0同士を接続してある。OSはCentOS6.2、InfiniBandドライバーはMellanox社製MLNX_OFED_LINUX-1.5.3-3.1.0-rhel6.2-x86_64.tgzを、MPIはOpen MPI: Version 1.6.2を使った。OpenMPIはインテル Composer XE 2013 Linux 版でビルドした。

 このクラスターを使い、MPIのプログラムで実行速度測定する。このとき、結果にはrankが大きく関わってくる。コンピュータが2台なので、16コア×2,32並列で動かす。つまり32のMPIプログラムが同時に動くことになる。Rankとは、同時に動くMPIプログラムを区別するために、全てのプログラムに割り振られる通し番号のことだ。プログラムは32個なので、0〜31の番号がそれぞれに割り振られる。このrankを見れば、32のプログラムのうちのどれなのかが分かる。
 姫野ベンチは、空間を部分空間に分割し、それぞれのプログラムが当てられた部分空間を計算する。その計算する場所はrankによって決まる。決め方は、プログラムを作る人が指定することができる。通常、rankの0と1は隣り合った部分空間、といった分け方をする。姫野ベンチでもそうなっている。
 3次元空間の分割には3方向の切り口が考えられるが、姫野ベンチでは実行時にどの方向を何分割のように指定することがでる。今回は分かりやすくするため、大根を輪切りにするように、空間を1方向だけの並行の面で切っていく分割方法を指定する。
 32コアで計算するので、空間はrank0〜31の32の部分に分かれ、切り口は31枚になる。通信は、rank0とrank1の境界、rank1とrank2の境界、といった具合に切り口で行われる。同じコンピュータの内部同士の通信は高速だが、異なるコンピュータ間で通信が行われた場合時間がかかる。rankをどう配置するかによって、異なるコンピュータ間の通信量が増減する。最小になるように配置しなければ、高速化は望めない。
 rankを自由に配置する方法については、こちらを参考にされたい。

 リファレンスにするため、1台のコンピュータで16コアを使い速度を計測しておく。
[hpc@hpc01 mpi]$ mpirun -np 16 mpi_himeno 
For example:
Grid-size= 
XS (64x32x32)
S (128x64x64)
M (256x128x128)
L (512x256x256)
XL (1024x512x512)
Grid-size = 
xl

For example: 
DDM pattern= 
1 1 2
i-direction partitioning : 1
j-direction partitioning : 1
k-direction partitioning : 2
DDM pattern = 
1 16 1

Sequential version array size
mimax= 1025 mjmax= 513 mkmax= 513
Parallel version array size
mimax= 1025 mjmax= 34 mkmax= 513
imax= 1024 jmax= 33 kmax= 512
I-decomp= 1 J-decomp= 16 K-decomp= 1

Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 34904.0212348005 time(s): 0.776812076568604 
4.4807483E-04
Now, start the actual measurement process.
The loop will be excuted in 231 times.
This will take about one minute.
Wait for a while.
Loop executed for 231 times
Gosa : 4.1262177E-04
MFLOPS: 34599.3741912206 time(s): 60.3411960601807 
Score based on Pentium III 600MHz : 417.6651 

Grid-sizeをxlにして分割パターンを1 16 1として、得られた結果は約34.6GFLOPSになった。

 次に、Gigabit Ethernetで姫野ベンチを実行してみる。マシン名はそれぞれhpc01とhpc02だ。InfiniBandでなくGibabit Ethernetを使うため、mpirunのオプションに-mca btl tcp,self,smを指定する。
[hpc@hpc01 mpi]$ mpirun -np 32 -H hpc01,hpc02 -mca btl tcp,self,sm mpi_himeno 
For example:
Grid-size= 
XS (64x32x32)
S (128x64x64)
M (256x128x128)
L (512x256x256)
XL (1024x512x512)
Grid-size = 
xl

For example: 
DDM pattern= 
1 1 2
i-direction partitioning : 1
j-direction partitioning : 1
k-direction partitioning : 2
DDM pattern = 
1 32 1

Sequential version array size
mimax= 1025 mjmax= 513 mkmax= 513
Parallel version array size
mimax= 1025 mjmax= 18 mkmax= 513
imax= 1024 jmax= 17 kmax= 512
I-decomp= 1 J-decomp= 32 K-decomp= 1

Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 13074.6925337660 time(s): 2.07376694679260 
4.4580380E-04
Now, start the actual measurement process.
The loop will be excuted in 86 times.
This will take about one minute.
Wait for a while.
Loop executed for 86 times
Gosa : 4.2668747E-04
MFLOPS: 13309.9580785933 time(s): 58.3971889019012 
Score based on Pentium III 600MHz : 160.6707 

 結果は、約13.3GFLOPSとなり、1台で16コアよりも遅い。これはどうしてだろうか。
 このとき、rankの指定は何も行っていない。rankがどうなっているかというと、rank0がhpc01、rank1がhpc02、rank3がhpc01、rank4がhpc02…といった具合に、交互に割り振られている。つまり偶数のrankがhpc01に、奇数のrankがhpc02に集まっている(こちらの記事参考)。
 通信は、rank0とrank1の間、rank1とrank2の間、というように偶数と奇数の間で行われる。となるとこの場合、31ある全ての通信がネットワークを通じて行われていることになる。これはでは最悪の効率だ。

 次に、同じGigabit Ethernetで、rank0からrank15をhpc01に、rank16からrank32をhpc02に、といった具合にまとめて計算を行ってみよう(方法の解説はこちら)。このとき別のコンピュータとネットワークを通じて行われる通信は、rank15とrank16の間の1ヶ所だけになる。
[hpc@hpc01 mpi]$ mpirun -np 32 -H hpc01,hpc02 -num-sockets 2 -npersocket 8 -mca btl tcp,self,sm mpi_himeno 
For example:
Grid-size= 
XS (64x32x32)
S (128x64x64)
M (256x128x128)
L (512x256x256)
XL (1024x512x512)
Grid-size = 
xl

For example: 
DDM pattern= 
1 1 2
i-direction partitioning : 1
j-direction partitioning : 1
k-direction partitioning : 2
DDM pattern = 
1 32 1

Sequential version array size
mimax= 1025 mjmax= 513 mkmax= 513
Parallel version array size
mimax= 1025 mjmax= 18 mkmax= 513
imax= 1024 jmax= 17 kmax= 512
I-decomp= 1 J-decomp= 32 K-decomp= 1

Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 59091.9377585665 time(s): 0.458842039108276 
4.4580380E-04
Now, start the actual measurement process.
The loop will be excuted in 392 times.
This will take about one minute.
Wait for a while.
Loop executed for 392 times
Gosa : 3.9798711E-04
MFLOPS: 61315.3619323830 time(s): 57.7812521457672 
Score based on Pentium III 600MHz : 740.1661 

 結果は、約61.3GFLOPSと前の結果に比べて圧倒的に高速だ。
 rankが交互に割り振られていたときと比べ、ネットワークを通じて通信するデータ量が31分の1となったからだ。Gigabit Ethernetを使ってもRankを適切に配置すれば、1台に比べて2台では約1.77倍高速になった。まあまあの結果ではないかと思うが、もっと速くしたい場合にInfiniBandが登場する。

 InfiniBandを使って姫野ベンチを実行してみる。上記と同様、rank0からrank15をhpc01に、rank16からrank32をhpc02にまとめて計算する。InfiniBandで通信が行われるのはrank15とrank16の間の1ヶ所だけだ。
[hpc@hpc01 mpi]$ mpirun -np 32 -H hpc01,hpc02 -num-sockets 2 -npersocket 8 mpi_himeno 
For example:
Grid-size= 
XS (64x32x32)
S (128x64x64)
M (256x128x128)
L (512x256x256)
XL (1024x512x512)
Grid-size = 
xl

For example: 
DDM pattern= 
1 1 2
i-direction partitioning : 1
j-direction partitioning : 1
k-direction partitioning : 2
DDM pattern = 
1 32 1

Sequential version array size
mimax= 1025 mjmax= 513 mkmax= 513
Parallel version array size
mimax= 1025 mjmax= 18 mkmax= 513
imax= 1024 jmax= 17 kmax= 512
I-decomp= 1 J-decomp= 32 K-decomp= 1

Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 69413.0625086929 time(s): 0.390616178512573 
4.4580374E-04
Now, start the actual measurement process.
The loop will be excuted in 460 times.
This will take about one minute.
Wait for a while.
Loop executed for 460 times
Gosa : 3.9435242E-04
MFLOPS: 69165.0496788744 time(s): 60.1092510223389 
Score based on Pentium III 600MHz : 834.9234 

 結果は、約69.1GFLOPSとなった。1台に比べて2台では1.99倍高速になった。Gigabit Ethernetの1.77倍と比較して、大きな速度向上と言えるだろう。InfiniBand製品はこちらで購入できる。

(次回に続く)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Copyright (C) HPCシステムズ株式会社. All Rights Reserved.