【问题标题】:Let each thread of OpenMp use one core, when launched by mpirun让 OpenMp 的每个线程使用一个核心,当被 mpirun 启动时
【发布时间】:2021-01-11 11:46:33
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: mpi openmp openmpi


    【解决方案1】:

    通过更多搜索,我发现 --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
    
    

    【讨论】:

    • 如果你不想要任何来自 Open MPI 的绑定,只需 mpirun --bind-to none ...
    • @GillesGouaillardet 含蓄地指出这是一个应该在 MPI 启动级别解决的问题。让 OpenMP 忽略在该级别施加的限制只会让您(或其他人)在以后决定最好在每个套接字中使用一个 MPI 进程(例如,在套接字中使用 OpenMP)时感到痛苦。所以你需要在那个级别修复它,而不是在 OpenMP 级别强制它......
    • @GillesGouaillardet @jimcownie 谢谢你,我试过这个mpirun --host e01-62,e01-64 -n 2 --bind-to none grep Cpus_allowed_list /proc/self/status Cpus_allowed_list: 0 Cpus_allowed_list: 0 但它似乎没有用
    • 您运行的是哪个版本的 Open MPI?
    • @GillesGouaillardet 它应该是 4.0.2,因为我加载了module load gcc/8.3.0 openmpi/4.0.2 pmix
    【解决方案2】:

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

    #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
    

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2011-01-07
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多