パラレルジョブ
CPU コアを複数同時に使用し、長時間実行するプログラムを少数実行する場合は、並列ジョブ(parallel job)として実行してください(多数実行する場合は並列ジョブのアレイジョブを使ってください。)。投入コマンドはsbatchコマンドを利用します。
SlurmにはAGEでのPE(Parallel Environment)に対応する機能はありません。ほぼ同等のコアのわり付け方をすると考えられるオプションの指定の仕方についてご紹介します。
参考情報
- Support for MultiCore/Multi-Thread Architecture(開発元の詳細ドキュメント)
- CPU Management User and Administrator Guide
パラレルジョブの種類(概要)
AGEのPEで用意されている環境に沿って、Slurmで、それに対応するコアの割り付け方をほぼ実現する為のSlurmでのオプション群を示します。
AGEで用意していたPE環境名 | PE環境の意味 | 同様の資源確保をするために指定するSlurmオプション群(例) |
---|---|---|
def_slot | 同一計算ノード上にNTASK個のCPUコアを確保する(NTASKが計算ノード上のCPUコアを超えている場合はジョブは開始されない | -N 1-1 --n NTASK |
mpi | 複数の計算ノードに渡ってNTASK個のCPUコアを用意する。その際に計算ノードはより分散して計算ノードを使用するようにしてラウンドロビンでタスクを割り当てる | [-N NODES] -n NTASK --spread-job |
mpi-fillup | 複数の計算ノードにわたって NTASK 個の CPU コアを確保する。その際に計算ノードの台数がなるべく少なくなるようコアが確保される。 | [-N NODES] -n NTASK |
pe_n | 複数の計算ノードにわたって NTASK_1個の CPU コアを確保する。その際に計算ノード1台あたりNTASK_2個のCPUコアを割り当てる | [-N NODES] -n NTASK_1 --ntasks-per-node=NTASK_2 |
AGEのPEの場合と異なり、上記のNTASK数で範囲指定はできません。上記のNODESについては範囲指定が可能で、-N MINNODES-MAXNODES
と最小ノード数と最大ノード数を範囲指定することが可能です。
Slurmの場合は、-N
で指定するノード数と --ntasks-per-node
で指定するノード単位で割り当てるタスク数を調整することで並列ジョブを実行することが一般的です。この際に、ノード数とノード単位のタスク数の積が全体のタスク数(並列数)になる点に注意してください。
並列ジョブに対して、メモリ要求量を指定する際の注意事項
並列ジョブに対して--mem
(1ノードあたりでそのジョブに割り当てるメモリ量)、--mem-per-cpu
(1CPUコアあたりでそのジョブに割り当てるメモリ量)を指定する場合、指定したノード数、またはCPUコア数と指定したメモリ量が掛け合わされた容量のメモリをシステムに要求してジョブが投入されますので、その点に留意してください。
パラレルジョブの種類(詳細)
CPUとメモリ確保の様子
sbatch、srunコマンド実行時にオプションで明示的にメモリ量を指定しない場合、システム側の設定により、CPUコアあたり8GBのメモリが割り当てられます。(計算機の種類、キューの種類によって異なります。)
例えば、下記のように指定した場合、並列ジョブが使用するメモリ総量として 計算ノード1台上に16×8=128GB を指定したことになります。 その点について注意した上で指定する要求メモリ量を決定してください。
-N 1-1 -n 16 --mem-per-cpu 8G
並列ジョブ(1)(def_slotに対応) 同一の計算ノードに指定したコア数を充填して確保する実行方法
一台の計算ノード上でNTASK個のコアを取得してジョブを投入する方法は以下のようになります。この際、--mem-per-cpu
オプションを指定して、1CPUコアあたりのメモリ量を指定すると、CPUコア数とタスク数の積のメモリ量が計算ノード上で確保されるのでご注意ください。
#!/bin/bash
#SBATCH -N 1-1
#SBATCH -n 2
#SBATCH --mem-per-cpu=20G
#SBATCH -t 0-00:10:00
#SABATCH -J an_example
make -j 2
上図の例では、メモリは1タスクあたり20GB、20GB×2コア=40GBが一台の計算機の中に確保されます。