我想运行 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
这是默认的,但编写它并没有什么坏处。如果这仍然不起作用,我们可以尝试使用作业数组。