5

我发现了一些非常相似的问题,这些问题帮助我找到了一个似乎可以工作的脚本,但是我仍然不确定我是否完全理解为什么,因此这个问题..

我的问题(示例):在 3 个节点上,我想在每个节点上运行 12 个任务(总共 36 个任务)。此外,每个任务都使用 OpenMP,并且应该使用 2 个 CPU。在我的例子中,一个节点有 24 个 CPU 和 64GB 内存。我的脚本是:

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

for i in {1..36}; do
    srun -N 1 -n 1 ./program input${i} >& out${i} &
done

wait

这似乎按我的要求工作,在一个节点上连续运行任务,直到该节点上的所有 CPU 都在使用中,然后继续在下一个节点上运行进一步的任务,直到再次使用所有 CPU,等等。

我的问题.. 我不确定这是否真的是它的作用(?),因为我没有完全理解 srun 关于 -n 的手册页,而且我之前没有使用过 srun。主要是我的困惑来自“-n”:在 -n 的手册页中,它说“默认是每个节点一个任务,..”,所以我预计如果我使用“srun -n 1”,那么只有一个任务是在每个节点上运行,似乎并非如此。此外,当我尝试例如“srun -n 2 ./program”时,它似乎只是将完全相同的程序作为两个不同的任务运行两次,而无法使用不同的输入文件..我想不出为什么会这样有用?

4

2 回答 2

6

您的设置是正确的,只是您必须使用--exclusive srun 选项(在这种情况下,它的含义与 for 不同sbatch)。

至于您对 有用性的评论srun,可以根据环境变量$SLURM_TASK_ID或 MPI 程序的排名来更改程序的行为。您的困惑源于您的程序不是并行编写的(除了 2 个 OMP 线程之外),srun而是用于启动并行程序,大部分时间基于MPI

于 2017-08-25T17:50:22.047 回答
2

另一种方法是一次运行所有任务。由于输入和输出文件取决于等级,因此需要一个包装器

你的 SLURM 脚本是

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

srun -n 36 ./program.sh

你的包装program.sh将是

#!/bin/sh

exec ./program input${SLURM_PROCID} > out${SLURM_PROCID} 2>&1 
于 2017-08-26T14:25:57.960 回答