目次 (4.4.ジョブ投入スクリプトの作成)
4.4. ジョブ投入スクリプトの作成
4.4.1. 処理方法の指定
4.4.2. sbatchオプション
4.4.3. 環境変数
4.4.4. 逐次ジョブを実行する場合
4.4.5. スレッド並列ジョブを実行する場合
4.4.6. MPIプログラム(openMPI)を実行する場合
4.4.7. MPIプログラム(Intel MPI)を実行する場合
4.4.8. MPIプログラム(mpich2)を実行する場合
4.4. ジョブ投入スクリプトの作成
ジョブ投入のためのジョブ投入スクリプトを作成します。
4.4.1. 処理方法の指定
ジョブ投入スクリプトの中で“#SBATCH”で始まる行にsbatch オプションを記述すると、処理方法を指定することができます。
4.4.2. sbatch オプション
主なsbatch オプションを次に示します。
表 4.4.2 sbatch オプション
ジョブ投入スクリプトのディレクティブ | #SBATCH |
---|---|
キュー(パーティション)指定 | -p [queue] |
実行ノード数(並列数の指定) | -N [minnodes[-maxnodes]], --nodes=[minnodes[-maxnodes]] |
CPU 数の指定(プロセス数の指定) | -n [number], --ntasks=[number] |
実行時間の上限指定(wall time) |
-t [minutes], --time=[minutes] |
出力ファイル指定 | -o [filename], --output=[filename] |
エラー出力指定 | -e [filename], --error=[filename] |
出力・エラー出力の総合出力 | (-e 指定無しで-o を使用) |
イベント通知 |
--mail-type=[type] ※type はBEGIN, END, FAIL, REQUEUE, ALL のいずれか |
メールアドレス指定 | --mail-user=[address] |
ジョブ再投入 | --requeue または --no-requeue(未指定時は--no-requeue) |
実行ディレクトリ指定 | --workdir=[dir_name] |
メモリサイズ指定 | --mem=[mem][M|G|T] OR --mem-per-cpu=[mem][M|G|T] |
タスク当たりのCPU 数指定 | --tasks-per-node=[count] |
CPU 当たりのタスク数指定 | --cpus-per-task=[count] |
依存ジョブ |
--dependency=[type:job_id]
type には次の依存タイプを指定できます。 |
ジョブのプロジェクト化 | --wckey=[name] |
ジョブ実行ホストの詳細 | --nodelist=[nodes] AND/OR --exclude=[nodes] |
アレイジョブ | --array=[array_spec] |
開始時間指定 | --begin=YYYY-MM-DD[THH:MM[:SS]] |
4.4.3. 環境変数
sbatch コマンド実行時、ジョブ実行時に環境変数が設定されます。設定される主な環境変数を示します。
表 4.4.3 環境変数
環境変数 | 内容 |
---|---|
SLURM_JOB_CPUS_PER_NODE |
ジョブ実行に使用されるホストとプロセス数のリスト |
SLURM_JOB_ID | ジョブID |
SLURM_JOB_NAME | fjsub –N やsbatch -J で指定したジョブ名。ジョブ名を指定していない場合は、実際に指定されたコマンド列が格納されます。 |
SLURM_JOB_NODELIST | ジョブが実行されるホスト名のリスト |
SLURM_NTASKS | sbatch –n(または ––ntasks)で指定したプロセス数 |
SLURM_SUBMIT_DIR | ジョブ が投入されたカレントディレクトリ |
4.4.4. 逐次ジョブを実行する場合
逐次(並列計算を行わない方式)で実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash #SBATCH -p d024h ・・・・・・・・・・ (1) #SBATCH -n 1 ・・・・・・・・・・ (2) #SBATCH -J test_serial ・・・・・・・・・・ (3) #SBATCH -o stdout.%J ・・・・・・・・・・ (4) #SBATCH -e stderr.%J ・・・・・・・・・・ (5) ./a.out ・・・・・・・・・・ (6) |
(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは-ntasks=<number>)を指定します。
逐次ジョブの場合、プロセス数は1 となりますので、指定値は“-n 1”を指定します。
(3) ジョブ名を指定します。
(4) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(5) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(6) プログラム(a.out)を実行します。
4.4.5. スレッド並列ジョブを実行する場合
スレッド並列(単体ノードで並列計算を行う方式)でジョブを実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash #SBATCH -p d024h ・・・・・・・・・・ (1) #SBATCH -n 20 ・・・・・・・・・・ (2) #SBATCH -N 1 ・・・・・・・・・・ (3) #SBATCH -J test_openmp ・・・・・・・・・・ (4) #SBATCH -o stdout.%J ・・・・・・・・・・ (5) #SBATCH -e stderr.%J ・・・・・・・・・・ (6) export OMP_NUM_THREADS=${SLURM_NTASKS} ・・・・・・・・・・ (7) ./a.out ・・・・・・・・・・ (8) RETCODE=$? exit ${RETCODE} ・・・・・・・・・・ (9) |
(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは-ntasks=<number>)を指定します。
上記の例では、20 プロセスで実行するために-n 20 を指定しています。
(3) 20 プロセスを1 ノード上で確保する必要があるため、“-N 1”を指定します。これにより、1 ノード上で20 プロセスを確保できるノードにジョブが割り当てられます。
(4) ジョブ名を指定します。
(5) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(6) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(7) 環境変数 OMP_NUM_THREADS にスレッド数を指定します。
(8) プログラム(a.out)を実行します。
(9) プログラムの戻り値をSLURM に戻します。
4.4.6. MPI プログラム(openMPI)を実行する場合
プロセス並列(複数のノードで並列計算を行う方式)のジョブをOpenMPI で実行する時に作成するジョブ投入スクリプトの例を示します。
下記スクリプトでは、Dシステムにて2ノード(1ノードあたり2プロセス)のジョブが生成されます。
#!/bin/bash #SBATCH -p d024h ・・・・・・・・・・ (1) #SBATCH -n 40 ・・・・・・・・・・ (2) #SBATCH -J test_openmpi ・・・・・・・・・・ (3) #SBATCH -o stdout.%J.log ・・・・・・・・・・ (4) #SBATCH -e stderr.%J.log ・・・・・・・・・・ (5) module load gnu/openmpi165 ・・・・・・・・・・ (6) NODEFILE=`generate_pbs_nodefile` ・・・・・・・・・・ (7) mpirun -hostfile=${NODEFILE} -np ${SLURM_NTASKS} ./a.out ・・・・・・・・・・ (8) RETCODE=$? exit ${RETCODE} ・・・・・・・・・・ (9) |
(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは-ntasks=<number>)を指定します。
(3) ジョブ名を指定します。
(4) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(5) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(6) MPI 環境変数をセットします。
(7) mpirun に渡すノードリストを生成
(8) プログラム(a.out)を実行します。
(9) プログラムの戻り値をSLURM に戻します。
上記(6)については、次の実行方法があります。
標準GNU コンパイラー (GNU 4.4.7) |
OpenMPI | module load gnu/openmpi165 |
MPICH2 | module load gnu/mpich2141p1 | |
IntelMPI | module load impi411 | |
GNU4.8.2 コンパイラー | OpenMPI |
module load PrgEnv-gnu482 module load gnu/openmpi165 |
MPICH2 |
module load PrgEnv-gnu482 module load gnu/mpich2141p1 |
|
IntelMPI |
module load PrgEnv-gnu482 module load impi411 |
|
Intel コンパイラー | OpenMPI |
module load PrgEnv-intel module load intel/openmpi165 |
MPICH2 |
module load PrgEnv-intel module load intel/mpich2141p1 |
|
IntelMPI |
module load PrgEnv-intel module load impi411 |
|
PGI コンパイラー | OpenMPI |
module load PrgEnv-pgi module load pgi/openmpi165 |
MPICH2 |
module load PrgEnv-pgi module load pgi/mpich2141p1 |
4.4.7. MPI プログラム(Intel MPI)を実行する場合
プロセス並列(複数のノードで並列計算を行う方式)のジョブをIntelMPI で実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash #SBATCH -p d024h #SBATCH -n 40 #SBATCH -J test_intelmpi #SBATCH -o stdout.%J.log #SBATCH -e stderr.%J.log module load PrgEnv-intel module load impi411 NODEFILE=`generate_pbs_nodefile` mpirun -hostfile ${NODEFILE} -np ${SLURM_NTASKS} ./a.out |
(注) インテルコンパイラで作成された実行ファイルを実行する場合、ジョブ投入スクリプト内に
module load PrgEnv-intel module load impi411 |
の行を記載する必要があります。
4.4.8. MPI プログラム(mpich2)を実行する場合
プロセス並列(複数のノードで並列計算を行う方式)のジョブをPGI コンパイラで作成したMPI プログラム(mpich2)で実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash #SBATCH -p d024h #SBATCH -n 40 #SBATCH -J test_pgi #SBATCH -o stdout.%J.log #SBATCH -e stderr.%J.log module load PrgEnv-pgi module load pgi/mpich2141p1 NODEFILE=`generate_pbs_nodefile` mpirun -hostfile ${NODEFILE} -np ${SLURM_NTASKS} ./a.out |
(注) PGI コンパイラが用意するmpich2 環境を利用し、PGI コンパイラで作成された実行ファイルを実行する場合、ジョブ投入スクリプト内に
module load PrgEnv-pgi module load pgi/mpich2141p1 |
の行を記載する必要があります。