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

HPC Do It Yourself Club

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

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

E5-2600シリーズはNUMA、NUMAで性能を出すには

その3: interleaveで性能を出す

 今回は、姫野ベンチを使い、OpenMPでの並列動作を16コアで実行します。
 まずスレッド数を16にします。
$ export OMP_NUM_THREADS=16
 使用するメモリの指定はせずに、omp_himenoを実行します。
$ ./omp_himeno 
 配列のサイズは最大のXLとします。
 ここで、numactl -Hでハードウェアの状態を見てみます。
$ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 32744 MB
node 0 free: 31553 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 32768 MB
node 1 free: 17317 MB
node distances:
node 0 1 
0: 10 21 
1: 21 10 
 ノード0のメモリは使われておらず、ノード1のメモリが使われていることが分かります。ノード1のコアが先にメモリを使い始めたため、メモリは全てノード1に確保されています。
 実行結果はMFLOPS: 11370.62となりました。

 次に、numactlでinterleaveを使い、メモリをノード0とノード1から半々ずつ使用するよう指定します。
$ numactl -i all ./omp_himeno
 numactl -Hでハードウェアの状態を見てみます。
[hpc@hpc01 omp]$ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 32744 MB
node 0 free: 24333 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 32768 MB
node 1 free: 24538 MB
node distances:
node 0 1 
0: 10 21 
1: 21 10 
 ノード0とノード1、両方のメモリが使用されていることが分かります。
 このとき、ノード0のCPUが使用するメモリは、半分をノード0から、残りの半分をノード1からとっています。ノード1のCPUも同様に、両方のノードから半分ずつメモリを使っています。どのCPUも、使用するメモリのうち半分はローカルメモリ、残り半分はリモートメモリ、となっています。ノード0のCPUは全てノード0のメモリを使い、ノード1のCPUは全てノード1のメモリを使う、というように、自CPU側のノードからだけメモリを使うよう別けられているわけではありません。
 実行結果はMFLOPS: 22608.07となりました。何も指定せずに片方のノードのメモリだけを使用した場合に比べ、かなり速い結果となっています。なぜこのような差が生じているのでしょうか。

 OpenMPのプログラムは、16コアで実行しているとき、16の部分的な計算を何度か繰り返しています。このとき、16の計算が全て終わらないと次の計算に進むことができません。
 メモリを片方のノードからだけ使用している場合を考えます。ノード0のメモリだけを使用しているとき、ローカルメモリを使うノード0のCPUは計算が早く終わるのに対し、ノード1のCPUはリモートメモリを使うため計算が遅くなります。計算の次の段階に進むためには部分的な計算が全て終わらないといけないため、ここでノード0のCPUはノード1のCPUが計算を終えるのを待つ必要があります。そのためこの場合の計算速度は、ノード1のCPUの計算速度となります。つまり、全体の計算速度は、一番遅いCPUの計算速度で決まるのです。
 interleaveで2つのノードから半々ずつメモリを使用している場合は、どちらのノードのCPUもリモートメモリとローカルメモリを半々ずつ使っているため、各CPUの計算速度はより平均化されます。片方のノードのメモリだけ使用している場合と比べると、最も速いCPUの計算速度はより遅くなるものの、最も遅いCPUの計算速度はより速くなります。全体の計算速度は一番遅いCPUの計算速度で決まるため、interleaveで半々ずつメモリを使用した方が、計算は速くなるのです。
 MFLOPS: 11370.62とMFLOPS: 22608.07という実行結果の差は、このようにして生じています。


(次回に続く)


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

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