並列化システムでのパスワード

各サーバの間では、NIS(Network Information Service)による利用者管理を行っている。ログイン名とパスワードは全サーバで共通。 パスワードは初期パスワードが設定されているので「yppasswd」コマンドで速やかに変更。 シェルの変更する場合はypchshコマンドを利用。

並列化処理とは

並列処理とは、 並行して同時に実行可能な処理を複数のCPUを用いて実行することである。 並列処理を行なっていないプログラムを逐次処理プログラムと呼び、 逐次処理プログラムを並列処理プリグラムに書き換えることを並列化という。

並列化の目的

並列化する目的は、 逐次処理プログラムの実行時間を短縮することである。

並列化の種類

並列計算機には以下の三つのメモリモデル(アーキテクチャ)がある:

共有メモリモデル
複数のプロセッサがメモリバス・スイッチ経由で主記憶に接続された共有メモリモデル(SMP)
分散メモリモデル
プロセッサと主記憶から構成されたシステムが複数接続され、 プロセッサは他のプロセッサの主記憶の読み書きができない分散メモリモデル
分散共有モデル
プロセッサは他のプロセッサの主記憶を読み書きできる分散共有メモリモデル

MPIとOpenMP

分散メモリモデルの並列計算機に於ける並列プログラミングライブラリとしては、 MPI(Message Passing Interface)やPVM(Parallel Virtual Machine)が広く使われている。

また、共有メモリモデルの並列計算機に於いては、OpenMPが主流である。 コンパイラのオプションで、自動並列化も可能である。自動並列化はSMPである。(OpenMPはプログラムに明示的に組み込む必要がある。)。

PCクラスタとは、PCをネットワークにより複数台接続し、 分散処理・並列処理を行なうシステムである。

クラスタには高性能計算を目的としたものを HPC(High Perfprmance Computing)クラスタと呼ぶ。

HPCは通常あるノードから別のノードのメモリに直接アクセスできない、 分散メモリモデルとなる。その為、並列計算を行う為には、先にあげたMPI,PVMを使うことになる。 以上述べたことだけで、クラスター間では共有メモリモデルであるOpenMPが使用できないことが分かる。

分散共有モデル

MPI+OpenMP

複数のCPUを持つ、複数のノードがある場合の並列化(分散共有モデル)の最も一般的な方法は、

  • 同一ノード内ではOpenMPを使い並列化
  • 異なるノード間ではMPIを使い並列化

という手法がよく使われる。

一般にFull MPI版よりもOpenMP+MPIの方が速い。

Omni OpenMP

RWCP Omni OpenMPコンパイラはSCore Cluster Syetem SoftwareのAPIレベルで分散共有モデルであるSCASHに対応しておる。 その為、SCore + Omniコンパイラーであれば、 安価なクラスタタイプの並列計算機上でもOpenMPでプログラムを組むことができる。 もっとも、最高速を実現するにはMPIを使う必要がある。

Intel Cluster OpenMP

Cluster OpenMP(Intel C/C++コンパイラとは別ライセンス)を(-cluster-openmp)利用することでOpenMP の並列化をアーキテクチャー・ベースのクラスターで簡単に実行できる。

Cluster OpenMPの利点
簡単かつ低コストのクラスター・コンピューティング開発を可能にする移植性と柔軟性

  • 逐次処理コードや OpenMP コードのクラスターへの移植が簡単。
  • シリアル、マルチコア、クラスター対応の各アプリケーションで同じコードを使用できる。
  • ソースコードの変更がほとんどいらないため、デバックが簡単。
  • 高額なシンメトリック・マルチプロセシング (SMP) 対応のハードウェアを購入しなくても、数カ所変更しただけの OpenMP コードを複数のプロセッサーで実行できる。
  • 習得と実装が簡単かつ迅速な MPI に代わる方法を提供。

分子動力学によるベンチマーク結果。 一般に言えることではないが、この例が示す結果:

  • 同じ並列度の場合はパフォーマンスは1ノード内での通常のOpenMPの方が良い。(Cluster OpenMPの場合は、通信がボトルネックとなってしまう。)
  • 通常のOpenMPコードをそのまま利用できることもあればできないこともあり、後者の場合は移植作業が必要となり、可搬性にやや難あり。
  • コードの難易度、可搬性、パフォーマンスなどを総合的に勘案して、現時点ではクラスタ環境下であえてCluster OpenMPを使用する利点はあまりないと考えられる。但し、将来的に可搬性が高まれば(通常のOpenMPコードがそのまま利用できれば)利点が増えると考えられる。

ベンチマーク[結合変換]

  • 結合変換前
    mflops.png
    一次キャッシュに対して最適化がなされていない。 二次キャッシュがあふれてパフォーマンスが落ちている。


  • 結合変換後
    mflops_un.png
    一次キャッシュのあふれが見える。

設定

  1. k=9, N_NU=10のHealpix_Mapを用意。
  2. Healpix_Mapを配列に代入 or Healpix_Mapで直接。
    1. 周波数ごとに: x[N_NU][npix]
    2. 一括: x[N_NU*npix]
    3. Healpix_Map: ring_map[N_NU][npix]
  3. 各ピクセル値の自乗和を出力。
    1. OpenMP
  4. そのときのFLOPSを計算。2,3にかかった時間を計算(Healpix_Map -> 配列にかかる時間も含む)。

結果

MAGI, Intel(R) Xeon(TM) CPU 2.80GHz

time[sec]MFLOPS
配列、周波数ごと0.4800000000610.8209708738
配列、周波数ごと、OpenMP0.5000000000771.5936603774
配列、一括1.0400000000604.9476923077
配列、一括、結合変換(32)0.9800000000629.1456000000
配列、一括、OpenMP1.1400000000786.4320000000
Healpix_Map、周波数ごと0.0400000000604.9476923077
Healpix_Map、周波数ごと、OpenMP0.0200000000778.9421714286
Healpix_Map、周波数ごと、結合変換(2)0.0300000000732.9851650485
Healpix_Map、周波数ごと、結合変換(2)、OpenMP0.0200000000622.9164356436

godzilla, Intel(R) Xeon(R) CPU 5160 @ 3.00GHz

time[sec]MFLOPS
配列、周波数ごと0.3100000000823.1811588785
配列、周波数ごと、OpenMP0.2800000000423.4633846154
配列、一括0.3900000000830.9470188679
配列、一括、結合変換(32)0.3700000000794.0672621359
配列、一括、OpenMP0.4700000000386.3174736842
Healpix_Map、周波数ごと0.0000000000817.8892800000
Healpix_Map、周波数ごと、OpenMP0.0300000000427.5746796117
Healpix_Map、周波数ごと、結合変換(2)0.0300000000916.2314563107
Healpix_Map、周波数ごと、結合変換(2)、OpenMP0.1100000000453.4382702703

ベンチマーク[球面調和展開、map2alm]

mapデータからからalmを計算=球面調和関数展開する計算時間を測定。 計算時間は理想的にはPixel数Nの3/2乗に比例するはず:

map2alm_benchmarkk.png

参考

npix.png

ベンチマーク[MCMCサンプリング]

環境

東北大学天文PC Cluster

コンパイルオプション

manual(PDF)
以下の最適化オプションを指定:(Healpix library and own program)

-O3最適化(強)
-Ob2インライン展開(強)
-ip関数にまたがる最適化
-parallel自動並列化
-openmpOpenMP
-mcpu=pentium4Pentium4, Xeon最適化
-xTXeon最適化 fileintel9.1.txt , 参考

方法1

  • Healpix C++ library
    • OpenMP only(Fortran90ではMPIに対応している)
      • 4 CPUs
    • anafast_cxx (default)
      • nlmax=2048
      • iter_order=10

結果(上記オプション)

# LSBATCH: User input
#!/bin/sh

#BSUB -q normal
#BSUB -J test_chinone
#BSUB -o test_n4_span_hosts1.log
#BSUB -n 4
#BSUB -R "span[hosts=1]"

export OMP_NUM_THREADS=4
BINPATH=/home/chinone/make/Healpix/Healpix_2.01_2005Nov05/Healpix_2.01/src/cxx/linux_icc/bin/
PARAPATH=/home/chinone/workspace/WMAP/workspace/test/test_for_bench

cd $PARAPATH
time $BINPATH/anafast_cxx anafast.par
   CPU time   :    354.64 sec.
   Max Memory :        89 MB
   Max Swap   :       221 MB

   Max Processes  :         4
   Max Threads    :         4
real 1m30.532s
user 5m53.454s
sys  0m1.173s

結果(デフォルト)

# LSBATCH: User input
#!/bin/sh

#BSUB -q normal
#BSUB -J test_chinone
#BSUB -o ./20071116/test_normal_o_n4.log
#BSUB -n 4

export OMP_NUM_THREADS=24
BINPATH=/home/chinone/make/Healpix/Healpix_2.01_2005Nov05/Healpix_2.01/src/cxx/linux_icc/bin/
PARAPATH=/home/chinone/workspace/WMAP/workspace/test/test_for_bench

cd $PARAPATH
time $BINPATH/anafast_cxx anafast.par
   CPU time   :    355.61 sec.
   Max Memory :        93 MB
   Max Swap   :       318 MB
   Max Processes  :         4
   Max Threads    :         4
real 1m31.560s
user 5m54.239s
sys  0m1.359s

方法2

  • CMB sampler using Metropolis-Hastings method
    • Healpix
      • k=6, Nside = 64, Npix = 49152, theta_pix = 55.0 amin
  • 方法1と同じ最適化(自前のプログラムにOpenMPは含まない)

結果

chain1 cpu (local workstation eistimate)4 cpus (local workstation)4 cpus ( PC cluster)
160s15s
1010m2.5m42.5s filelog
1001h 40m25m7m 41s filelog
100017h4h 10m80m38.484s=1h 20m filelog
100007d1d 18h797m9.261s=13h 18m filelog
10000070d17d 9h


benchmark_chain_k6.png


方法3

cmb_foreground_sampler using Metropolis-Hastings method

  • k=6
  • CMB+Foreground(single power-low)
  • 4 bands
  • Healpix自身の最適化と、cmb_foreground_sampler.cc自身の最適化(OpenMP; #pragma omp parallel)
  • (CMBに関して)グループの数を「方法2」に比べて二倍にし、一度に更新するピクセルの数を1/2にした。
  • ⇒おそらく方法2の2x2/(新たな並列化の効率)〜2,3倍の時間がかかる。

結果

chain1 cpu (local workstation eistimate)4 cpus (local workstation)4 cpus ( PC cluster)
1172s43s15s
10436s = 7m 16s145s = 2m 25s
1001440s = 24m
100014413s = 240m 13s = 4 h

添付ファイル: filemap2alm_benchmarkk.png 752件 [詳細] filep_map2alm.png 513件 [詳細] filemflops_un.png 733件 [詳細] filemflops.png 783件 [詳細]