Slurm 问题:Array Job VS srun in a sbatch

Slurm Question: Array Job VS srun in a sbatch

Slurm 上的以下两种并行化方案有什么区别?

方案一

运行 sbatch script.sh

#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello

这会召唤 8 个 运行 echo hello

的工作

方案二 我已经使用数组作业完成了类似的事情。

#!/bin/bash

#SBATCH --job-name=arrayJob
#SBATCH --output=arrayJob_%A_%a.out
#SBATCH --error=arrayJob_%A_%a.err
#SBATCH --array=1-8
#SBATCH --time=01:00:00
#SBATCH --ntasks=1

# Print this sub-job's task ID
echo hello

这两种方案有什么区别吗?他们似乎都完成了同样的事情。

方案 1 是一个单一的作业(有 8 个任务),而方案 2 是 8 个不同的作业(每个作业有一个任务)。在第一种情况下,所有任务将被同时调度,而在第二种情况下,8 个任务将彼此独立调度。

有了作业数组(方案2),如果一次有8个CPU可用,它们会同时启动,但如果一开始只有4个CPU可用,则有4个任务运行,其他 4 个待定。当最初的 4 个完成后,其他 4 个开始。它通常用于 embarrassingly parallel 个作业,其中进程不需要通信或同步,例如将同一程序应用于文件列表。

相比之下,对于单个作业(方案一),Slurm 会同时启动 8 个任务,因此需要 8 个 CPUS 同时可用。这通常仅用于进程需要相互通信的并行作业,例如使用 Message Passing Interface 库。