KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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を省略しても問題ありませんが、内部的に複数コア使う処理なら適切に指定したほうがリソースの競合や割り当て不足を避けられます。