複数の CPU コアを使用するジョブは、使用する CPU コアの数を宣言して qsub します。利用者は、 qsub するジョブ (の中のプログラム) が使用する CPU の数を把握・制御し、その実行に十分なスロット数を AGE に宣言・要求しなければなりません。 1 スロットあたり 1 CPU コア、既定 2.1GB のメモリがあります。
計算ノードの搭載 CPU コア数とスロット数の関係
SHIROKANE の計算ノードのそれぞれには AGE のキュー に対応するキューインスタンスの役割があり、役割を果たすためにリソースを確保しジョブを実行するスロットを持ちます。
ある計算ノードにどのキューに対応するスロットがあるかは 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 の数をまかなえるスロット数を要求せずに、複数の CPU コアを使うジョブを実行した場合、計算ノードが過負荷となります。
要求するスロット数の指定方法
ジョブが要求するスロット数は 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
) は 1 スロットあたりの要求値です。 def_slot
によりスロット数を複数に指定すると、ジョブ全体が要求するメモリサイズは s_vmem
による要求値に def_slot
によるスロット数を乗じたものになります。s_vmem
にはジョブ全体が要求するメモリサイズをスロット数で割った値を指定してください。
def_slot | s_vmem | ジョブのメモリ要求 |
---|---|---|
なし (-pe def_slot 1 と同じ) | なし | 2.1GB |
-pe def_slot 2 | なし | 2*2.1GB |
なし (-pe def_slot 1 と同じ) | -l s_vmem=8G | 8GB |
-pe def_slot 4 | -l s_vmem=8G | 4*8GB |
-pe def_slot 16 | -l s_vmem=64G | 1024GB →計算ノード Thin では、搭載メモリ量を超えるため、実行できない |
1 スロットあたり 8 G バイトを要求し、4 スロットを使用する (= 4 CPU コアを使用する) 場合は以下のようになります。 (ジョブは 32 G バイト要求する)
$ qsub -l s_vmem=8G -pe def_slot 4 []
またはジョブスクリプト中の記述にて
... #$ -l s_vmem=8G #$ -pe def_slot 4 ...