SLURM:如何在作业脚本中提交多个 OpenMP 并行代码

SLURM:如何在作业脚本中提交多个 OpenMP 并行代码

我想运行 4 个 python 代码,每个代码使用 2 个处理器。 (并行化是在 MKL 内部完成的。)

#!/bin/bash
#SBATCH -N 1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=2

export OMP_NUM_THREADS=2

srun -n 2 python doSVD 1 &
srun -n 2 python doSVD 2 &
srun -n 2 python doSVD 3 &
srun -n 2 python doSVD 4 &

wait

当我尝试此操作时,每个代码都会运行两个副本,而不是使用 2 个核心的单个代码。生成 4 个代码(每个代码使用 2 个处理器)的正确方法是什么?

以下作品。但它会一个接一个地运行每个代码。

#!/bin/bash
#SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=2

export OMP_NUM_THREADS=2

srun python doSVD 1 
srun python doSVD 2 
srun python doSVD 3 
srun python doSVD 4 

wait

答案1

这个答案有点晚了,但这仍然可以为其他人服务:

我认为这里的问题是您要求使用 --ntasks-per-node=4 执行 4 个任务,并要求每个 python 进程运行 2 个任务(srun -n 2)。相反,您希望每个 python 进程都是运行 2 个线程的 1 个任务。

你应该尝试:

#!/bin/bash
#SBATCH -N 1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=2

export OMP_NUM_THREADS=2

srun -n 1 -c 2 python doSVD 1 &
srun -n 1 -c 2 python doSVD 2 &
srun -n 1 -c 2 python doSVD 3 &
srun -n 1 -c 2 python doSVD 4 &

wait

我认为-n 1这是默认的,但编写它并没有什么坏处。如果这仍然不起作用,我们可以尝试使用作业数组。

相关内容