スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)

opi-clst MPIで円周率計算を高速化

 2016-11-23
MPI環境を立ち上げたので、まずはその効果を確認してみよう。
 

MPIデモンストレーション用プログラム 円周率計算

並列計算のデモとしてはHelloworld的な存在である円周率の計算を実行して計算時間を確認してみます。
とりあえずgoogleで検索して割とすぐ見つかった下記のコードをお借りします。

http://web.mst.edu/~ercal/387/MPI/cpi.c




実行ファイルの準備

例によって、実行ファイルは計算ノード全てで同じpathにしないといけないので、どこか適当な作業ディレクトリを作ってそこで作業します。
[MASTER]% mkdir -p /mnt/USB01/tmp/mpi
[MASTER]% cd /mnt/USB01/tmp/mpi
[MASTER]% wget http://web.mst.edu/~ercal/387/MPI/cpi.c -O mpi_pi.c

[MASTER]% mpicc ./mpi_pi.c -o ./mpi_pi
これを全ての計算ノードで実行する。

for文でぶん回せば楽ちんですね。
[MASTER]% for HOGE in `seq -w 14 -1 1`
do
ssh clst${HOGE} mkdir -p /mnt/USB01/tmp/mpi \; cd /mnt/USB01/tmp/mpi \; \
wget http://web.mst.edu/~ercal/387/MPI/cpi.c -O mpi_pi.c \; mpicc ./mpi_pi.c -o ./mpi_pi
done


mpirunで実行すると並列実行されます
[MASTER]% mpiexec -f hostfile -np 13 /mnt/USB01/tmp/mpi/mpi_pi
...snip...
pi is approximately 3.1415926535898482, Error is 0.0000000000000551
wall clock time = 4.371851


このままだと数秒で処理が終わってしまってクラスタの並列効果が見えにくいので、1ノードで実行してだいたい10分くらいになるような計算量に調整します。
Cソースの n = 100000; とある変数をちょいっと変更してやると計算量が変わります。
とりあえず n = 10000000000; にしました。



MPI 並列計算 効果確認

  • 円周率計算デモのプログラムを用いて計算時間を比較する
  • MASTERを除いた計算ノード14台で処理を行う(MASTERはハードウェアが異なるため台数効果確認からは除外する)
  • MPI_Bcast直前~MPI_Reduce直後のMPI_Wtimeで測定された時間の差分を計算時間とする

[MASTER]% for HOGE in `seq -w 14 -1 1`
do
mpiexec -f ./hostlist_IP -np ${HOGE} /mnt/USB01/tmp/mpi/mpi_pi 2>&1 | tee -a ./mpi_pi_log_node${HOGE}
done
:
(snip)

[MASTER]% grep time mpi_pi_log_node* | sort -r
mpi_pi_log_node14:wall clock time = 29.307824
mpi_pi_log_node13:wall clock time = 31.545531
mpi_pi_log_node12:wall clock time = 34.157496
mpi_pi_log_node11:wall clock time = 37.367875
mpi_pi_log_node10:wall clock time = 41.016539
mpi_pi_log_node09:wall clock time = 45.643006
mpi_pi_log_node08:wall clock time = 51.347294
mpi_pi_log_node07:wall clock time = 58.556430
mpi_pi_log_node06:wall clock time = 68.271863
mpi_pi_log_node05:wall clock time = 81.912306
mpi_pi_log_node04:wall clock time = 102.416189
mpi_pi_log_node03:wall clock time = 136.541068
mpi_pi_log_node02:wall clock time = 204.738532
mpi_pi_log_node01:wall clock time = 409.431887

結果をグラフにするとこんな感じ↓
time-node-14.png


1台だと409秒、2台だと半分の204秒、4台だとさらに半分の102秒、8台だとさらにさらに半分の51秒という綺麗なデータが得られました。 おそらく16台で実行すると26秒程度になると思われます。

とは言え計算時間が短くなればなるほど、ネットワーク等のオーバーヘッドや並列できない部分の処理時間の占める割合が増えてくるためどこかの値で処理時間の短縮はサチるはずです。

1台では409.431887秒かかっていた処理が、14台並列にすることによって29.307824秒で済む程度に高速化された。これは約13.97倍速い。並列数である14倍に満たないのは並列化にともなうオーバーヘッドによるものと思われます。


MPI 並列計算 効果確認 (4core)

OrangePi PCが搭載しているAllwinner H3は4コアのSoCなので理論上では、時間的ペナルティを殆ど(?)受けることなく最大4つの処理までは並列実行することができます。つまり、14node * 4core = 56並列実行までは高速化が望める、はずです。

並列数を最大200まで増やしてみて、計算時間をプロットしてみる。
[MASTER]% for HOGE in `seq -w 200 -1 1`
do
mpiexec -f ./hostlist_IP -np ${HOGE} /mnt/USB01/tmp/mpi/mpi_pi 2>&1 | tee -a ./mpi_pi_log_node${HOGE}
done

time-node-200.png


期待通り、56並列実行(4core * 14node)の時に最も処理時間が短くなりました。

57並列以上はCPUのコア数以上に処理を割り付けらることになり、CPUのコンテキストスイッチによるペナルティが発生していると思われます。値が安定していないのはその時その時のCPUのスケジューリングによって影響を受けるからかな?

1台では409.432633秒かかっていた処理が、56並列実行することによって7.357488秒で済む程度に高速化された。約55.64倍速い。並列数である56倍に満たないのは並列化に伴うオーバーヘッドによるものと思われる。




というわけで、OrangePi PCを14台クラスタ構成にして56並列実行することで、処理が約55倍速くなりました(^^)

円周率の計算は、並列計算のデモとして有名なので非常に効果があります。
実際には並列計算が可能な処理と、そうでない処理が混在する事になるので、単純に並列数に比例して高速化されるというのはなかなか難しいです。実装の巧妙さに依存しますね。

 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/271-a351d38b
≪ トップページへこのページの先頭へ  ≫
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。