Конфигурация системы:
Workstation with two Xeon E5-2620 V4 CPUs. Cent OS 7.3.
Openmpi-3.0.1, ifort 2015, gcc 4.8.6, intel MKL.
Я запускаю гибридную программу MPI / OpenMP на рабочей станции. Я хочу использовать 1 процесс MPI с 8 потоками OpenMP. Однако количество потоков OpenMP, используемых в параллельной области, всегда равно 1. На другой машине с процессором Intel 9900K количество потоков OpenMP всегда равно 2. Для обеих машин я напечатал OMP_NUM_THREADS
, вызвав omp_get_max_threads. OMP_NUM_THREADS
равно 8, так как я уже установил "export OMP_NUM_THREADS=8
". Это действительно беспокоит.
Покопавшись около суток, я понял, что это связано с параметром Openmpi "-bind-to
". Если используется «-bind-to none» или «-bind-to numa
», программа работает нормально, поскольку загрузка ЦП для каждого процесса MPI составляет 800%, и в параллельной области достигается ускорение в 8 раз. Если я использую значение по умолчанию, которое «-bind-to core
». Количество потоков OpenMP не всегда то, что я ожидал. Поэтому на рабочей станции с Xeon 2640 мы отключили гиперпоточность, поэтому реальные используемые потоки openmp
всегда равны 1. Для ПК с Intel i7-9900K гиперпоточность включена, поэтому число используемых потоков OMP равно 2.
Более того, если я не использую параметры "-bind-to none/numa
", omp_get_num_procs возвращает 1. Если используется "-bind-to none
", omp_get_num_procs возвращает число процессоров (ядер ЦП) при использовании "-bind-to numa
", omp_get_num_procs возвращает номер процессорных ядер в одном процессоре.
Я публикую здесь свой опыт, который может помочь другим людям с подобной проблемой.