我发现了一些非常相似的问题,这些问题帮助我得到了一个似乎有效的脚本,但我仍然不确定我是否完全理解为什么,因此这个问题..
我的问题(示例):在 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”似乎只是将完全相同的程序运行两次作为两个不同的任务,无法使用不同的输入文件..我想不出为什么这会有用?
您的设置是正确的,只是您必须使用--exclusive
srun 选项(在这种情况下与sbatch
).
至于你关于有用性的评论srun
,可以根据环境变量改变程序的行为$SLURM_TASK_ID
,或 MPI 程序的排名。您的困惑源于这样一个事实:您的程序没有编写为并行的(除了 2 个 OMP 线程),而srun
旨在启动并行程序,大多数时候基于MPI https://en.wikipedia.org/wiki/Message_Passing_Interface.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)