Я использую решатель физики, который был написан для использования гибридного распараллеливания OpenMP / MPI. Менеджер работы в нашем кластере - SLURM. Все идет как положено, когда я работаю в режиме чистого MPI. Однако, когда я пытаюсь использовать гибридное распараллеливание, происходят странные вещи:
1) Сначала я попробовал следующий блок SLURM:
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=16
(подсказка: 16 - это количество физических ядер на процессоры в кластере)
Однако, что происходит, так это то, что моделирование выполняется на 4 узлах, и там я вижу 4 используемых ядра каждое (в htop). Более того, решатель говорит мне, что он запущен на 16 ядрах, что я не очень понимаю. Я думаю, это должно быть 8 * 16 = 128.
2) Поскольку вышеприведенное не увенчалось успехом, я добавил в свой скрипт SLURM следующее l oop:
if [ -n "$SLURM_CPUS_PER_TASK" ]; then
omp_threads=$SLURM_CPUS_PER_TASK
else
omp_threads=1
fi
export OMP_NUM_THREADS=$omp_threads
Что происходит в том, что решатель говорит мне теперь, что он запущен на 128 ядрах. Но при использовании htop на соответствующих узлах становится очевидным, что эти потоки OpenMP используют одни и те же ядра, поэтому решатель работает очень медленно. Разработчик кода сказал мне, что он никогда не использовал добавленную мной l oop, так что в этом может быть что-то не так, но я не понимаю, почему потоки OpenMP используют те же ядра. Тем не менее, в htop, потоки, кажется, там. Другая странная вещь состоит в том, что htop показывает мне 4 активных ядра на кластер ... Я бы ожидал либо 2 (для 2 задач MPI на узел), либо, скорее всего, если бы go, как планировалось, 32 (2 задачи MPI, работающие 16 Каждый из OMP-потоков).
Однажды мы уже столкнулись с проблемой, так как разработчик использует компилятор Intel Fortran, а я использую компилятор GNU fortran (mpif90 соответственно mpifort).
Кто-нибудь знает, как я может ли мои потоки OpenMP использовать все доступные ядра вместо нескольких?
Некоторая информация о системе / коде:
Linux distro: OpenSUSE Leap 15.0
Компилятор: mpif90
код: FORTRAN90