複数の CPU コアを使用するジョブは、使用する CPU コアの数を宣言して qsub してください。
計算ノードの搭載 CPU コア数とスロット数の関係
SHIROKANE の計算ノードのそれぞれには UGE のキュー に対応するキューインスタンスの役割があり、役割を果たすためにリソースを確保しジョブを実行するスロットを持ちます。
ある計算ノードにどのキューに対応するスロットがあるかは qstat コマンドに -f オプションを付けることで表示できます。例えば計算ノード Thin の sc400 には以下のように mjobs.q が割り当てられています。
$ qstat -f | grep sc400 mjobs.q@sc400i BP 0/14/24 0.35 lx-amd64
出力結果の 3 列目の数字 (この例の場合は 0/14/24) は resv/used/tot. に説明があります。この例の sc400 の場合、「mjobs.q に対応する 24 スロットを持ち、そのうち 14 スロットで現在ジョブを実行している」ことが分かります。
計算ノードが持つスロット数は、その計算ノードが搭載している CPU コア数と一致しています。 1 スロットを使って実行されるジョブは最大で 1 CPU コアを計算に使うことを期待しています。qsub コマンドのデフォルトでは、 1 ジョブは 1 スロットを確保します。複数の CPU コアを使うジョブは、使用する CPU コアと同じスロットの数を宣言、確保し実行しなければなりません。複数の CPU コアを使うジョブとは、マルチスレッドジョブや子プロセスを生成するジョブの内、それら複数のスレッドやプロセスがアクティブに動くジョブです。
- スロット数を指定せずに、複数の CPU コアを使うジョブを実行した場合、計算ノードが過負荷となります。例えば 4 つの子プロセスを生成するジョブを 1 台の計算ノードで実行した場合、計算ノード内では 96 個 (CPU コア数の 4 倍) の子プロセスが稼働し、単純理論上は計算に 4 倍の時間を要する事になります。
要求するスロット数の指定方法
ジョブが要求するスロット数は qsub コマンド の -pe
オプションの def_slot
パラレルエンヴァイロメントで指定します。def_slot
を指定しない場合、要求するスロット数は 1 です。
$ qsub -pe def_slot <> []
または
... #$ -pe def_slot <> ...
例えば 4 スロットを使用する (= 4 CPU コアを使用する) 場合は以下のように 4 スロットを要求し、 qsub コマンドを実行します。
$ qsub -pe def_slot 4 []
または
... #$ -pe def_slot 4 ...
このようにしてスロット数を指定したジョブの要求スロット数は、 qstat コマンド の表示の slots カラムに見ることができます。
def_slot 指定時の要求メモリ量の指定について
ジョブのメモリの要求値 (s_vmem
, mem_req
) は 1 スロットあたりの要求値です。 def_slot
を指定すると、ジョブのメモリサイズ (s_vmem,_mem_req) が利用するスロット数が乗ぜられます。s_vmem
, mem_req
にはジョブ全体が要求するメモリサイズをスロット数で割った値を指定してください。
def_slot | s_vmem, mem_req | ジョブのメモリ要求 |
---|---|---|
なし (-pe def_slot 1 と同じ) | なし | 3.7GB |
-pe def_slot 2 | なし | 2*3.7GB |
なし (-pe def_slot 1 と同じ) | -l s_vmem=8G | 8GB |
-pe def_slot 4 | -l s_vmem=8G | 4*8GB |
-pe def_slot 8 | -l s_vmem=32G | 256GB →計算ノード Thin では搭載メモリ量を超えてしまい、実行できない |
1 スロットあたり 8 G バイトを要求し、4 スロットを使用する (= 4 CPU コアを使用する) 場合は以下のようになります。 (ジョブは 32 G バイト要求する)
$ qsub -l s_vmem=8G -pe def_slot 4 []