让 OpenMp 的每个线程使用一个核心,当由 mpirun 启动时

Let each thread of OpenMp use one core, when launched by mpirun

我是 运行 MPI with OpenMP,我发现使用这个命令,即使 OpenMP启动了我定义的线程数,它们都坚持一个CPU核心。

export OMP_NUM_THREADS=8
export OMP_PLACES=cores
export OMP_PROC_BIND=true
mpirun --host n1,n2,n3,n4 -np 4 a.out # the threads all stick to one core at each node 

 mpirun --host n1,n2,n3,n4 -np 4 grep Cpus_allowed_list /proc/self/status
Cpus_allowed_list:      0
Cpus_allowed_list:      0
Cpus_allowed_list:      0
Cpus_allowed_list:      0

通过更多搜索,我发现这个 --cpu-set 0-15 将允许 OpenMp 线程绑定到我集群中的所有 16 个内核。

mpirun --host n1,n2,n3,n4 -np 4 --cpu-set  0-15 grep Cpus_allowed_list /proc/self/status
Cpus_allowed_list:      0-15
Cpus_allowed_list:      0-15
Cpus_allowed_list:      0-15
Cpus_allowed_list:      0-15

后来,我找到了这个解决方案,它在我的集群上运行良好:

#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16

echo "Nodelist: $SLURM_JOB_NODELIST"
echo "CoerPerTask: $SLURM_CPUS_PER_TASK"

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
mpirun --map-by node:PE=$SLURM_CPUS_PER_TASK ./main 14000