Пусть каждый поток OpenMP использует одно ядро при запуске mpirun

#mpi #openmp #openmpi

#mpi #openmp #openmpi

Вопрос:

Я запускаю MPI с OpenMP, я обнаружил, что с помощью этой команды, даже если OpenMP запустил поток с определенным мной номером, все они привязаны к одному ядру процессора.

 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

  

Ответ №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

  

Комментарии:

1. если вы не хотите никакой привязки из Open MPI, просто mpirun --bind-to none ...

2. Как @GillesGouaillardet неявно указывает, что это проблема, которая должна быть исправлена на уровне запуска MPI. Игнорирование OpenMP ограничений, налагаемых на этом уровне, только причинит вам (или кому-то еще) боль позже, когда вы решите, что лучше иметь один процесс MPI на сокет с OpenMP внутри сокета (например). Поэтому вам нужно исправить это на этом уровне, а не форсировать его на уровне OpenMP…

3. @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 , но, похоже, это не сработало

4. какую версию Open MPI вы используете?

5. @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