我发现了一些非常相似的问题,这些问题帮助我找到了一个似乎有效的脚本,但是我仍然不确定我是否完全理解为什么,因此这个问题......
我的问题(示例):在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"它似乎只运行完全相同的程序两次作为两个不同的任务,无法使用不同的输入文件..我不能想到为什么这将是有用的?
答案 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