いわて駐在研究日誌2。

NEVER STAND BEHIND ME

Dakotaの並列計算機能について(その5)

Dakotaの並列計算機能について整理してみる。

計算機環境で整理すると、

1)マルチコアワークステーション1ノード向け

  • dakotaのinstanceは1つだけ起動(シリアル)
  • 例えばasynchrnous evaluation_concurrency 4 (4つ同時にeval.)を指定する。
  • 1個1個のevaluation(simulation)は、シリアルorパラレル可能ただし、パラレル計算はノード内のコア間に限定される
  • 16coreのノードであれば、asynchrnous evaluation_concurrency 4 で個々のevaluation を4並列とするとcoreをすべて使用して計算することになる。

2)マルチノードクラスタ向け(ただし各ノードは1~4coreと小規模な場合)

  • dakotaをmpirun -np 4 -host node0,node1,node2,node3 dakota hoge.inのように並列起動する
  • ただし、dakotaはMPI supportでビルドされていることが必要
  • evaluationはシリアル計算のみ可能(パラレル計算とするとmpiプロセスのバッティングが起こる)

3)マルチノードクラスタ向け(ただし各ノードは8core~とそれなりにまともなHPCの場合)

3-1)バッチファイルシステムが使用できる場合

  • dakotaを起動
  • dakotaからバッチファイルシステムにevaluationのキューを順次投入
  • 個々のevaluationはシリアルでもパラレルでも可能
  • ....ということで、あまり通常のバッチファイルシステムの使い方に変更はない。

3-2)バッチファイルシステムが使用できない(しない)場合

 

  • dakotaを起動
  • dakotaからevaluationする場合に、どのノードに投入するか決定する(このNode Placement Methodにはいくつかの方法がある)。
  • 個々のevaluationはシリアルでもパラレル(mpirun)でも可能だが、ノード跨ぎのパラレル計算はできない。
  • work_directory "runs/run"
    directory_tag
    directory_save で個々のevaluationフォルダは残す。

Node Placement Methodとしては、

  1. Compute list of relative nodes based on
    • Number of nodes in allocation
    • Number of MPI tasks per node
    • Number of MPI tasks per simulation run
    • evaluation number (obtain from e.g. file_tag)
  2. Then launch simulation with relative node list option (-host) or machinefile option (-machinefile)
  3. Use local_evaluation_scheduling static in an input file

とのことで、以前の記事のような感じで計算できる。  

ざっくりと再掲しておくと、

[snip]

APPLIC_PROCS=2  # 1 evaluationあたりのCore数


# Current Eval. Number
num=$(pwd | awk -F. '{print $NF}') # workdir名からEval.番号を取得

CONCURRENCY=4   # Dakotaのconcurrency(inputファイル中で指定した値)
PPN=16          # ノード当たりのcore数

# 剰余演算でjob番号と、OFで利用するcore数などからホスト番号を計算
applic_nodes=$( ( (APPLIC_PROCS+PPN-1) / PPN ) )
relative_node=$( ( (num - 1) % CONCURRENCY*APPLIC_PROCS / PPN ) )

### relativeノードが使える場合(MPIのバージョンによる)
node_list="+n${relative_node}"
for node_increment in $(seq 1 $( (applic_nodes - 1) ) ); do
  node_list="$node_list,+n$( (relative_node + node_increment) )"
done

### relativeノードが使えない場合は以下のように、relative番号から実際のホストを対応づける
if   [ $relative_node -eq 0 ]; then  
   node_list="ensis10"
elif [ $relative_node -eq 1 ]; then  
   node_list="ensis12"
elif [ $relative_node -eq 2 ]; then   
   node_list="ensis13"
else
   node_list="ensis14"
fi

###  evaluationの実行
mpirun -np $APPLIC_PROCS -host $node_list my_simulation