Как использовать гибридное распараллеливание OpenMP / OpenMPI вместе с компиляторами GNU? - PullRequest
0 голосов
/ 23 марта 2020

Я использую решатель физики, который был написан для использования гибридного распараллеливания 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

1 Ответ

0 голосов
/ 25 марта 2020

Так мало вещей, используя:

#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=16

Вы говорите, что хотите 8 задач (т. Е. Рабочий MPI) и имеете две из них на узлы, поэтому нормально, чтобы код начинался с 4 узлы.

Затем вы говорите каждому работнику MPI использовать 16 потоков OMP. Вы говорите:

Более того, решатель говорит мне, что он запущен на 16 ядрах

Вероятно, решатель смотрит на потоки OMP, поэтому для него нормально указывать 16. Я не знаю деталей вашего кода, но обычно, если вы решаете проблему с сеткой, вы разбиваете сетки на поддомены (1 на MPI) и решаете с помощью OMP на этих поддоменах. Таким образом, в вашем случае параллельно работают 8 решателей, каждое из которых использует 16 ядер.

Команда export OMP_NUM_THREADS=$omp_threads и добавленный вами блок if верны (кстати, это не так oop).

Если у вас есть 16 ядер на узлы в кластере, ваша конфигурация должна быть:

#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16

Таким образом, один MPI на узел и затем 1 OMP на ядро, вместо двух сейчас, что, вероятно, будет просто замедлите код.

Наконец, как вы получаете вывод htop, вы входите в вычислительный узел? Обычно это не так. Хорошая идея для кластеров.

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

...