SLURM每个节点提交多个任务?

时间:2017-08-25 14:13:00

标签: job-scheduling hpc slurm sbatch

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

我的问题(示例):在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等。

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

2 个答案:

答案 0 :(得分:4)

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

关于srun有用性的评论,可以根据环境变量$SLURM_TASK_ID或MPI程序的排名来改变程序的行为。您的混淆源于这样一个事实:您的程序不是并行编写的(从2个OMP线程开始),而srun用于启动并行程序,大部分时间基于MPI

答案 1 :(得分: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