HPC集群:选择SLURM批处理中的CPU和线程数

时间:2018-07-02 15:45:31

标签: multithreading parallel-processing mpi hpc slurm

sbatch手册页中使用的术语可能有些混乱。因此,我想确保我设置的选项正确。假设我有一个任务要在具有N个线程的单个节点上运行。我是否正确地假设我会使用--nodes=1--ntasks=N

我习惯于考虑使用例如pthread在单个进程中创建N个线程。是它们所谓的“核心”或“每个任务的CPU使用率”的结果吗?在我看来,CPU和线程不是一回事。

1 个答案:

答案 0 :(得分:11)

Depending on the parallelism you are using: distributed or shared memory

  

--ntasks=#:“任务”的数量(与分布式并行性一起使用)。

     

--ntasks-per-node=#:每个节点的“任务”数(与分布式并行性一起使用)。

     

--cpus-per-task=#:分配给每个任务的CPU数量(与共享内存并行性一起使用)。


From this question:如果每个节点都有24个核心,这些命令之间有什么区别吗?

sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]

答案

是的,这两个提交之间存在差异。您是正确的,通常 ntasks用于mpi,而cpus-per-task用于多线程,但是让我们看一下您的命令:

对于您的第一个示例,sbatch --ntasks 24 […]将分配一个包含24个任务的作业。在这种情况下,这些任务只有1个CPU,但可以拆分为多个节点。这样一来,您在多个节点上总共可获得24个CPU。

对于第二个示例,sbatch --ntasks 1 --cpus-per-task 24 [...]将分配一个任务,其中包含1个任务和24个CPU。这样,您将在一个节点上总共获得24个CPU。

换句话说,任务不能拆分为多个节点。 因此,使用--cpus-per-task可以确保将其分配给同一节点,而使用--ntasks可以并且可以将其分配给多个节点。


Another good Q&A:假设您需要16个内核。这是一些用例

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