slurmにおいて、sbatchで、ntasks-per-nodes と cpu-per-taskの違いを教えてください
| 登録日 | :2025/10/06 04:52 |
|---|---|
| カテゴリ | :SLURM |
Slurmのsrunやsbatchにおける --ntasks-per-node と --cpus-per-task の違いを説明します。
基本概念
ntasks(タスク): Slurm上で管理される独立したプロセス実行単位(MPIランクやほぼ1つのプロセスに対応)
node: 実際の計算機(物理/仮想などの「台数」)
cpu(コア): 計算ノード内の論理CPUコア(物理またはハイパースレッドコア)
各オプションの意味
オプション 意味
--ntasks-per-node ノード1台あたり立ち上げる「タスク(プロセス)」数
--cpus-per-task 1つのタスク(プロセス)が使う「CPUコア数(スレッド数)」
役割と使い分け
--ntasks-per-node=N
各ノードでN個のタスク(プロセス:例 MPIランク)が同時に動く
ノードをまたがる並列計算用(MPI等)
--cpus-per-task=M
各タスク(プロセス)が同時に利用できるコア数をMとする
例:OpenMPやPythonマルチスレッドなど、1プロセス内で複数のスレッドを利用するとき指定
組み合わせ例
マルチプロセス並列(MPIなど)
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4 # 各ノード4プロセス、合計8プロセス(MPIランク8)
#SBATCH --cpus-per-task=1 # 各プロセス1コア
マルチスレッド並列(OpenMPなど)
#SBATCH --nodes=1
#SBATCH --ntasks=1 # 1プロセスだけ起動
#SBATCH --cpus-per-task=8 # そのプロセスが8コア(8スレッド)使う
イメージ
ノード タスク数 タスク1つあたりCPUコア数 実行されるプロセス/スレッド構成
1台 ntasks-per-node=4 cpus-per-task=2 合計: 4プロセス × 2スレッド=8コア
まとめ
ntasks-per-node=「プロセス数」(ノードごと)
cpus-per-task=「スレッド数(またはLAPACK/NumPyなどが内部で使う並列数も含む)」(1プロセスごと)
両者を組み合わせると、「ノードごと何個のプロセス(例:MPIランク等)を立ち上げ、その1プロセスごとに何個のスレッドやコアを割り当てるか」を細かく制御できます。
必要に応じてSLURM_CPUS_PER_TASKなどの環境変数を使って、プログラムへコア数指定を渡すのが一般的です。Slurmにおける「--ntasks-per-node」と「--cpus-per-task」の違いは以下のようになります。
--ntasks-per-node
各ノードごとに起動する“プロセス数(タスク数)”を決めます。
例:--ntasks-per-node=4なら、各ノードで4つのプロセスを同時並行で動かす。
--cpus-per-task
1つのタスク(プロセス)が占有できるCPUコアの数です(スレッド数、あるいは並列度)。
例:--cpus-per-task=2なら、1つのタスクが2コアを使ってマルチスレッド計算します。
両者の違い
ntasks-per-nodeは「ノードあたり“いくつ”タスク(プロセス)を起動するか」、
cpus-per-taskは「1タスクが“いくつ”のCPUコアを使うか」です。
例
物理ノードに16コアあるとき、
--ntasks-per-node=4 --cpus-per-task=4 とすると、
各ノードごとに4プロセスを立ち上げ、その1つ1つが4コアずつ使う(4プロセス×4コア=16コア/ノード全体)
--ntasks-per-node=8 --cpus-per-task=2 なら、8プロセス×2コア=16コア/ノード全体。
用途
「MPIのようなプロセス並列」ならntasksを増やし、cpus-per-taskは1のことが多いです。
「OpenMPやNumPy, Python並列for文のような内部マルチスレッド処理」ならntasks=1, cpus-per-task>1(複数コアを1プロセスで使う)となります。
どちらをどう指定するかは、使うプログラム(MPI/マルチスレッド型/その混合)によって異なります。
わからない場合、実際のワークロードやコマンドの説明書きに合わせて決めてください。
Appendix
--cpus-per-taskのデフォルト値について
Slurmの--cpus-per-taskオプションは、デフォルトでは1に設定されています。
つまり明示的に指定しなければ、各タスク(プロセス)あたり1つのCPUコアが割り当てられることになります。
補足ポイント
--cpus-per-taskは1タスクが使うCPUコア数を指定するオプションです。
省略時は1コア固定で、必要に応じて複数コアを使う処理(マルチスレッド等)の場合だけ指定します。
公式マニュアルや解説からの引用例
--cpus-per-task は各タスクに必要なCPUコア数を指定するオプションで、デフォルトは1です。
まとめ
--cpus-per-taskを指定しない場合は1CPUコアが割り当てられる。
マルチスレッド対応アプリの場合や1タスクで複数コア使う場合に増やす指定を使う。
このため、--cpus-per-taskを省略しても問題ありませんが、内部的に複数コア使う処理なら適切に指定したほうがリソースの競合や割り当て不足を避けられます。