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

HPC Do It Yourself Club

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

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

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

その2: CPUの割り当てを変更して性能を出す

 NUMA関連の記事の中で、ノードとCPUという単語が頻出しますが、クラスター関連で使われている意味と異なりますので、ここで整理しておきます。ノードとはCPUのパッケージあるいはソケットのことです。今回の記事で使われているコンピュータ(E5-2687W)の場合、2ソケットですので、ノード0とノード1があります。CPUとはいわゆるコアのことで、このコンピュータの場合8コア/ソケットですので、CPU0〜CPU7がノード0に属し、CPU8〜CPU15がノード1に属します。
 今回は、OpenMPで並列動作させるとどうなるかを姫野ベンチで試します。並列動作の中でも最もシンプルな2スレッドで実行します。
 ifortで姫野ベンチをコンパイルします。
$ ifort -O3 -xHost -ipo -openmp himenoBMTxp_omp.f90 -o omp_himeno
 2スレッド並列にするために、環境変数OMP_NUM_THREADSを2に設定します。
$ export OMP_NUM_THREADS=2
コンパイルしてできた、omp_himenoを実行します。
$ ./omp_himeno
 配列のサイズは最大のXLとします。
 ここで、topというコマンドを使って実行の状態を見てみます。

 CPU0とCPU8、2つのcoreが使われていることがわかります。CPU0~CPU7がノード0、CPU8~CPU15がノード1です。つまり、計算は違うノードで実行されてます。何も指定しない場合、このように使用するCPUは別々のノードに割り当てられます。
 さらに、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: 31484 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 32768 MB
node 1 free: 17328 MB
node distances:
node 0 1 
0: 10 21 
1: 21 10 
 ノード0のメモリは使われておらず、ノード1のメモリが使われていることが分かります。1つのプロセスで使われるメモリはひとかたまりになっており、バラバラにすることができません。ノード1かノード0、どちらか片方のメモリを使うことになります。どちらのノードのメモリが使われるかは、最初にアクセスされた側のメモリが使用されます。
 実行結果はMFLOPS: 8264.127となりました。
 何も指定せずに計算を実行したこの場合、ノード1のCPUは直結されたメモリ(ローカルメモリ)を計算に使用しているものの、ノード0のCPUは直結されていないメモリ(リモートメモリ)を計算に使用していることになります。そのため、最高速度での計算はできません。
 次に、使用するCPUを片方のノードにまとめ、メモリも同じ側のノードから使用するようにして、計算してみます。numactlで、使用するノードを0、メモリを0に指定し、実行します。
$ numactl -N 0 -m 0 ./omp_himeno

 結果はMFLOPS: 9810.713となりました。ローカルメモリだけを使って計算すると、結果はこれだけ速くなるのです。
 ちなみに、このとき使用するCPUを片方のノードにまとめるよう指定すれば、使用されるメモリも自動的に同じ側になるため(最初にアクセスされたメモリが使われるため)、メモリは指定しなくても結果は同じになります。
$ numactl -N 0 ./omp_himeno
とだけ指定して実行しても、結果は同様になります。
 では逆に、使用するCPUを片方のノードにまとめ、メモリを反対側のノードから使用するように指定し、計算してみます。numactlで、使用するノードを0、メモリを1に指定し、実行します。
$ numactl -N 0 -m 1 ./omp_himeno
 結果はMFLOPS: 5322.811となりました。リモートメモリだけを使って計算すると、結果はこれだけ遅くなります。
 以上のように、並列動作をさせるとき、何も指定をしないと最高速度での計算はできません。numactlを使い、使用するCPUを片方のノードにまとめる必要があります。
 しかし、8スレッドを超えた並列の場合はCPUを1ノードにまとめることができません。どうしたらいいのでしょうか?次回それを検証してみましょう。


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

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