ジョブ管理ソフト UGE の利用方法
2. シンプルな並列ジョブの投入方法
UGE上で並列ジョブを実行する場合、そのプロセスを複数ノードにまたがるスロットに割り当てる必要があります。ホストごとのプロセス数の指定など、様々なポリシーで要求されるスロットに対して、UGEがそれを確保する仕組みとしてPE(Parallel Environment)があります。利用できるPE は、「qconf -spl」コマンドで確認できます。「qconf -sp pe_name」とすると、PE の詳細が確認できます。MPI の実装ごとに異なるPE が作成される場合があるので注意が必要です。ここでは、mpi というPEが以下のような定義であったとします。
# qconf -sp mpi
pe_name mpi
slots 999999
used_slots 0
bound_slots 0
user_lists NONE
xuser_lists NONE
start_proc_args $sge_root/mpi/startmpi.sh $pe_hostfile
stop_proc_args $sge_root/mpi/stopmpi.sh
allocation_rule $fill_up
control_slaves TRUE
job_is_first_task FALSE
urgency_slots min
accounting_summary TRUE
daemon_forks_slaves TRUE
master_forks_slaves FALSE
注目するのは、allocation_rule です。以下のような値を取ります。
$fill_up
できるだけ多くのスロットが1 台のサーバー上で確保されるようにスロットを割り当てます。複数のサーバーを使用する場合もそれぞれのサーバーで最大限のスロットが確保されます。
$roundrobin
ジョブ実行の条件に適うサーバーのそれぞれについて、順番に1 スロットずつランクが割り当てられます。
$ pe_slots
必ず1 台のサーバー上で指定されたスロットが確保されます。OpenMP を利用したジョブに使用されます。
<整数値>
ジョブ実行の条件に適うサーバーのそれぞれについて、<整数値>で指定したスロットが必ず確保されます。Hybrid-MPI の実行に適しています。
ジョブスクリプトの例 - MPIジョブ
#!/bin/bash
#$ -cwd # カレントワークディレクトリの指定
#$ -q all.q # キューの指定
#$ -pe mpi 64 # PE の指定
mpirun -np $NSLOTS hostname #プログラムの実行
# 「$NSLOTS」は、pe で指定したスロット数が指定されます。
UGE では、多くのMPI でTight Integration という仕組みが実装され、mpirun コマンドにmachinefile を指定しなくても、ジョブを複数のスロットへ割り振ることができます。
ジョブスクリプトの例 - OpenMPジョブ
#!/bin/bash
#$ -cwd # カレントワークディレクトリの指定
#$ -q all.q # キューの指定
#$ -pe smp 8 # PE の指定
export OMP_NUM_THREADS=$NSLOTS
./program #プログラムの実行
UGE では、PE のスロットを指定するだけでは、プログラムが並列実行することになりません。OpenMP ジョブでは、OMP_NUM_THREADS 環境変数などを適切に設定する必要があります。