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としては、
- 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)
- Then launch simulation with relative node list option (-host) or machinefile option (-machinefile)
- 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