Slurm:选择sbatch Slurm中的CPU和线程数

Tan*_*ash 8 parallel-processing multithreading hpc mpi slurm

sbatch手册页中使用的术语可能有点令人困惑.因此,我想确保我正确设置选项.假设我有一个任务在一个有N个线程的节点上运行.我是否正确地假设我会使用--nodes = 1和--ntasks = N?我习惯于考虑使用例如pthreads在单个进程中创建N个线程.他们称之为"核心"或"每个任务的cpus"的结果是什么?CPU和线程在我的脑海里并不是一回事.

Tun*_*ung 13

取决于您使用的并行性:分布式或共享内存

sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]
Run Code Online (Sandbox Code Playgroud)

从这个问题:如果每个节点有24个核心,这些命令之间有什么区别吗?

sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]
Run Code Online (Sandbox Code Playgroud)

回答:

是的,这两份提交文件之间存在差异.你是正确的,通常--ntasks=#--ntasks-per-node=#--cpus-per-task=#是多线程的,但让我们看看你的命令:

对于您的第一个示例,ntasks将分配具有24个任务的作业.在这种情况下,这些任务只有1个CPU,但可以分布在多个节点上.因此,您可以在多个节点上获得总共24个CPU.

对于第二个示例,mpi将为该任务分配一个具有1个任务和24个CPU的作业.因此,您将在单个节点上获得总共24个CPU.

换句话说,任务不能跨多个节点分割.因此,使用cpus-per-task将确保它被分配到同一节点,同时使用sbatch --ntasks 24 […]can并且可以将其分配给多个节点.


另一个很好的问答:假设您需要16个核心.以下是一些用例

  • 您使用mpi而不关心这些核心的分布位置: sbatch --ntasks 1 --cpus-per-task 24 [...]
  • 您想要启动16个独立进程(无通信): --cpus-per-task
  • 您希望这些核心分布在不同的节点上:--ntasks--ntasks=16
  • 您希望这些核心分布在不同的节点上,而不会受到其他作业的干扰: --ntasks=16
  • 您希望16个进程分布在8个节点上,以便每个节点有两个进程: --ntasks=16 and --ntasks-per-node=1
  • 您希望16个进程保持在同一节点上: --ntasks=16 and --nodes=16
  • 你想要一个可以使用16个内核进行多线程处理的进程: --ntasks=16 --nodes=16 --exclusive
  • 你想要4个进程,每个进程可以使用4个核心进行多线程处理: --ntasks=16 --ntasks-per-node=2

  • 感谢您的回复,但是在您的示例“sbatch --ntasks 24 [...]”中,如果我选择“--nodes=1”怎么办?在这种情况下,是否与您的第二个示例“sbatch --ntasks 1 --cpus-per-task 24 [...]”相同,它将在单个节点上总共获得 24 个 CPU? (2认同)
  • 对于您的问题:您将需要 `--nodes=1 --ntasks=1 --cpus-per-task=N`,其中 N 是(OpenMP)并行线程的数量。请参阅此处的示例 /sf/answers/3545830781/ (2认同)