メインコンテンツまでスキップ

パラレルジョブ

CPU コアを複数同時に使用し、長時間実行するプログラムを少数実行する場合は、並列ジョブ(parallel job)として実行してください。(多数実行する場合は並列ジョブのアレイジョブを使ってください。)

並列ジョブ機能を利用するには(バッチジョブの項で説明したオプションに加えて)-pe オプションを用いて parallel environment を指定します。

パラレルジョブの種類 (概要)

遺伝研スパコンで用意されている parallel environment の種類を以下に示します。

parallel environment意味
def_slot N同一計算ノード上に N 個の CPU コアを確保する。(N が計算ノード上の CPU コア数を超えている場合はジョブが始まらない。)
mpi N複数の計算ノードにわたって N 個の CPU コアを確保する。その際に計算ノードは round-robin 方式で選択される。結果としてなるべく多数の計算ノードに散った形でコアが確保される。
mpi-fillup N複数の計算ノードにわたって N 個の CPU コアを確保する。その際に計算ノードの台数がなるべく少なくなるようコアが確保される。

pe_n N

定義されている parallel environment は以下の通り。

pe_4, pe_8, pe_16, pe_32, pe_64,

pe_5, pe_10, pe_20

複数の計算ノードにわたって N 個のコアを確保する。その際各計算ノード上に n=4,8,16, … コアを確保する。

コア数は数値を一つ指定するほか、範囲の指定もできます。

  • qsub -pe mpi-fillup 100 -S /bin/bash job_script.sh
  • qsub -pe def_slot 20-100 -S /bin/bash job_script.sh
  • qsub -pe mpi 20- -S /bin/bash job_script.sh

並列ジョブに対して、メモリ要求量を指定する際の注意事項

並列ジョブに対して-l s_vmem-l mem_req を指定する場合、並列環境で指定した並列数と指定したメモリ量が掛け合わされた容量のメモリをシステム に要求してジョブが投入されます。

例えば、下記のように指定した場合、並列ジョブが使用するメモリ総量として 16×8=128GB を指定したことになります。 その点について注意した上で指定する要求メモリ量を決定してください。

-pe def_slot 16 -l s_vmem=8G -l mem_req=8G
-pe mpi-fillup 16 -l s_vmem=8G -l mem_req=8G

パラレルジョブの種類 (詳細)

CPU とメモリの確保の様子

先程までの例は、1個の CPU コアと、それに対応するメモリを指定する場合です。

qsub コマンド実行時にメモリ量を指定しない場合(デフォルト値)、例えば、Thin ノード Type1a の場合は、CPU コア 1 個あたり 8GB のメモリが割り当てられます。 (計算機の種類、キューの種類によって異なります。)

def_slotは、必ず一台の計算機にリソースを取ろうとします。下図の例だと、メモリは 1CPU コア当たり 20GB、合計 20GB x 2 コア = 40GB が一台の計算機の中に確保されます。

mpiは、複数台の計算機に、なるべく均一にリソースを確保しようとします。下図の例だと、例えば、mpi 2と書くと、メモリは 1CPU コア当たり 20GB、各計算機に 1 コア x20GB = 20GB ずつ、合計 20GB x 2 台 = 40GB 確保されます。

mpi-fillupは、複数台の計算機の中で、なるべく 1 台の計算機にリソースを詰めて確保しようとします。入りきらない場合は、別の計算機にリソースを確保しようとします。これが、def_slotとの違いです。下図の例だと、1台につきメモリ容量 64GB の計算機が 2 台ある場合、例えば、mpi-fillup 4と書くと、メモリは 1CPU コア当たり 20GB、2 台の計算機のうち、どちらか一方の計算機に 3 コア×20GB = 60GB、もう 1 台に 1 コア × 20GB = 20GB、合計 20GB × 4 コア = 80GB 確保されます。

pe_Nは、例えばpe_4 2と書くと 2 台の計算機に 4 コアずつリソースを取ります。メモリの取られ方は下図の通りだと1CPU コア当たり 8GB、各計算機に 4 コア x8GB = 32GB ずつ、合計 32GB x 2 台 = 64GB 取られます。

並列ジョブでどの計算ノードが確保されたかを知る方法

$ qstat
job-ID prior name user state submit/start at queue jclass slots ja-task-ID
------------------------------------------------------------------------------------------------------
13862312 0.25410 QLOGIN you r 09/25/2021 23:34:49 login.q@at138 1
13862486 0.25194 QLOGIN you r 09/26/2021 10:15:28 login.q@at139 1
13862667 0.25084 QLOGIN you r 09/26/2021 15:40:40 login.q@at137 1
13862992 0.25039 an_example you r 09/26/2021 18:54:09 epyc.q@at143 2
13862987 0.25020 an_example you r 09/26/2021 19:44:58 epyc.q@at154 1
13862989 0.25040 an_example you qw 09/26/2021 18:50:50 2

$ qstat -j 13862992 | grep exec_host_list
exec_host_list 1: at143:2

確保された計算ノードがどれであるかはqstat -j <ジョブ番号>で表示されるexec_host_listの行から分かります。