让OpenMp的每个线程在由mpirun启动时使用一个内核

让OpenMp的每个线程在由mpirun启动时使用一个内核,mpi,openmp,openmpi,Mpi,Openmp,Openmpi,我用OpenMP运行MPI,我发现用这个命令,即使 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 -

我用OpenMP运行MPI,我发现用这个命令,即使 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集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

如果您不想从Open MPI进行任何绑定,只需
mpirun--bind to none…
As@GillesGouaillardet含蓄地指出,这是一个应该在MPI启动级别修复的问题。让OpenMP忽略在该级别施加的限制只会在以后您决定最好在每个套接字中使用OpenMP(例如)一个MPI进程时给您(或其他人)带来痛苦。所以你需要在那个级别修复它,而不是在OpenMP级别强制它…@GillesGouaillardet@jimcownie谢谢你,我尝试了这个
mpirun--host e01-62,e01-64-n2-绑定到无grep CPU_allowed_list/proc/self/status CPU_allowed_list:0 CPU_allowed_list:0
但似乎不起作用您运行的是哪个版本的开放MPI?@GillesGouaillardet它应该是4.0.2,因为我加载了
模块加载gcc/8.3.0 openmpi/4.0.2 pmix