使用 SLURM 请求少于一个节点

计算科学 高性能计算
2021-12-04 09:27:50

我很好奇是否可以使用 SLURM 请求少于一个节点。

例如,如果我使用命令,

#!/bin/bash
#SBATCH --job-name="name"
#SBATCH --output="name.%j.%N.out"
#SBATCH --ntasks 1
#SBATCH --time=00:30:00

SLURM 会自动为我保留整个节点,还是会尝试让我只使用一个处理器?这可以让我的小作业更快地在集群上运行吗?

如果我使用命令

#!/bin/bash
#SBATCH --job-name="name"
#SBATCH --output="name.%j.%N.out"
#SBATCH --ntasks 13
#SBATCH --time=00:30:00

但是每个节点只有 12 个核心,那么 SL​​URM 会做什么呢?

谢谢

1个回答

tl;博士

  • 对于多处理(MPI,消息传递)使用ntasks.
  • 对于多线程(OpenMP、pthreads),使用cpus-per-task.
  • 对于混合代码,您需要两个选项,并且可能还想调整ntasks-per-node.

链接到sbatch手册


这有点复杂。这取决于您的程序是否需要任务或内核。例如,基于 MPI 的程序将启动多次并通过消息传递进行通信,而基于 OpenMP 的程序将仅启动一次,然后将启动多个线程,这些线程通过共享内存进行通信。

在消息传递的情况下,只要它们可以通信(Infiniband、以太网等),任务在哪个节点上启动并不重要。在共享内存的情况下,任务在同一个节点上运行很重要(事实上,这是必需的)。

SLURMntasks选项指定您的程序将启动多少个任务,这些任务可以是 MPI 程序的独立实例的线程。但是,SLURM 假设当您说ntasks的任务是通过消息传递进行通信时,如果您的机器有 12 个内核但您请求了 13 个任务,它会愉快地在一个节点上启动 12 个任务,在另一个节点上启动 1 个任务。ntasks-per-core(我不认为这种行为是有保证的。SLURM 还可以将所有 13 个任务扔到一个具有 12 个 CPU 的节点上,并让 CPU 调度任务。您可以使用和获得更细粒度的控制ntasks-per-node。)

如果您有一个多线程程序,那么您想使用它cpus-per-task并将其设置ntasks为 1(或不指定,因为它默认为 1)。这样,如果您请求 13 个 CPU,但可用的最大值为 12 个,您的作业将被拒绝。