Существуют ли общие рекомендации по эффективному использованию гибридного распараллеливания с OpenMP и MPI? - PullRequest
1 голос
/ 22 января 2020

Я планирую запустить большой симулятор на суперкомпьютере. Каждый отдельный узел предлагает 48 физических ядер с числом физических ядер на процессор, равным 24. Я не уверен, как эффективно распределить мой случай в потоки MPI и OpenMP. Например, я мог бы распараллелить его так, чтобы получить 512 потоков MPI. Теперь я могу сложить до 24 потоков OpenMP поверх этого, но, насколько я понимаю, каждый дополнительный поток OpenMP будет увеличивать общее количество требуемых узлов, например, с использованием номенклатуры SLURM:

ntasks=512 - ntasks-per-node=48 - cpus-per-task=1 -> ~10 nodes required
ntasks=512 - ntasks-per-node=24 - cpus-per-task=2 -> ~21 nodes required
...
ntasks=512 - ntasks-per-node=2 - cpus-per-task=24 -> 256 nodes required

Использование 512 заданий соответствуют руководству, которое я знаю для использования распараллеливания только MPI. Однако я мог бы также использовать гораздо меньше потоков MPI, например 128:

ntasks=128 - ntasks-per-node=48 - cpus-per-task=1 -> ~2.7 nodes required
ntasks=128 - ntasks-per-node=24 - cpus-per-task=2 -> ~5.3 nodes required
...
ntasks=128 - ntasks-per-node=2 - cpus-per-task=24 -> 64 nodes required

Очевидно, что первый блок задач будет работать быстрее, но, поскольку у меня нет бесконечного доступа к узлам, мне нужно найти эффективный решение для распараллеливания. Например, допустим, я могу использовать только 10 узлов и, следовательно, 480 физических ядер. Насколько я понимаю, одним из возможных крайних вариантов было бы сделать следующее:

ntasks=20 - ntasks-per-node=2 - cpus-per-task=24 -> 48 nodes required

Экстремальным аналогом было бы:

ntasks=480 - ntasks-per-node=48 - cpus-per-task=1 -> 48 nodes required

Я немного не уверен, как найти хороший баланс между ними, чтобы запустить мое моделирование максимально эффективно / быстро. Есть ли какие-либо рекомендации по гибридному распараллеливанию?

...