FAQ

Q2.12. バルクジョブで使用ノード数を抑えつつ、多数のタスクを実行したい。

A.2.12.

使用ノード数を抑えつつ、多数のタスクを実行したい場合は、以下のスクリプト例を参考に同時に実行するsrunの数をコントロールしてください。

このサンプルでは、1ノードを使いそれぞれ1CPUコアの計算を3000回を繰り返します。

 


#SBATCH -p XXX #パーティションを指定
#SBATCH --nodes=1
#SBATCH --ntasks=128
#SBATCH --cpus-per-task=1
 
TOTAL_TASKS=3000 # 繰り返し実行するタスク(プロセス)総数
EXE="myapp -a -b -c" # アプリを実行するためのコマンド
SRUN_OPTS="-N 1 -n 1 -c 1 --mem-per-cpu=1840 --exclusive"
 
CONCURRENT_TASKS=$SLURM_NTASKS # 同時実行数
WAIT_TIME=10 # srun 終了をチェックする間隔(秒)
 
count=0
task_id=()
while [ $TOTAL_TASKS -gt $count ]; do
        for ((i=0;i<$CONCURRENT_TASKS;i++)); do
                pid=${task_id[i]:=dammy}
                if [ ! -d /proc/$pid ]; then
                        # srun を実行して PID を保存します
                        srun $SRUN_OPTS $EXE & task_id[$i]=$!
                        count=$((++count))
                        [ $TOTAL_TASKS -eq $count ] && break
                fi
        done
 
        if ps | grep -q srun; then
                sleep $WAIT_TIME
        fi
done
 
wait # すべてのタスク終了を待ちます