У меня 12 процессоров, 1 сокет, 6 ядер на сокет, 2 потока на ядро — как эта информация соответствует распараллеливанию с MPI и OpenMP?

#c #parallel-processing #mpi #openmp #hpc

#c #параллельной обработке #mpi #openmp #hpc

Вопрос:

Мне нужно реализовать некоторые функции параллельных вычислений для некоторого кода c , требующего больших вычислительных затрат. Я читал, что комбинация MPI и OpenMP может использоваться для достижения того, что мне нужно — MPI может использоваться для распределения задач между процессорами, а OpenMP используется для распределения задач между потоками на отдельных процессорах.

Я набрал lscpu (см. Ниже), чтобы проверить данные о процессоре моего офисного ПК, но я не уверен, как это интерпретировать. Ключевыми моментами являются следующие:

  • 12 процессорам
  • 1 сокету
  • 6 ядер на сокет
  • 2 потока на ядро

Итак, как мне интерпретировать это с точки зрения возможностей для распараллеливания? В частности, как MPI и OpenMP соответствуют элементам в этом списке? Используется ли MPI для распределения по 12 процессорам, а затем OpenMP по 2 потокам? Но тогда как насчет ядер и сокетов?

 Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              12
On-line CPU(s) list: 0-11
Thread(s) per core:  2
Core(s) per socket:  6
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
Stepping:            10
CPU MHz:             4409.872
CPU max MHz:         4700,0000
CPU min MHz:         800,0000
BogoMIPS:            7392.00
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            12288K
NUMA node0 CPU(s):   0-11
  

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

1. Почему вы хотите использовать комбинацию open-MP и MPI? Это не самая простая вещь, и ваша производительность будет медленнее, чем если бы вы просто использовали openmp.

2. 6 ядер с 2 потоками на ядро? Итак, у вас включена гиперпоточность? OpenMP, вероятно, будет использовать до 12 потоков для параллельных циклов и тому подобное, если не указано иное. Вы бы использовали MPI для разделения работы между различными процессами , а не потоками одного процесса.

3. Предпочтительным местом для большинства приложений является 1 задача MPI на сокет (например, домен NUMA) и 1 поток OpenMP на ядро, и обе среды выполнения MPI и OpenMP связывают все. Гиперпоточность обычно не помогает (когда это не вредит). Конечно, каждое приложение отличается, и вы должны попробовать несколько комбинаций, чтобы найти оптимальную для каждого приложения.

4. @AlainMerigot На данный момент я просто работаю на своем офисном ПК, но в конечном итоге этот код придется запускать в кластере и максимально распараллеливать.

Ответ №1:

MPI используется для кластеров из нескольких компьютеров (узлов общей памяти). Обычно вы запускаете один ранг MPI (процесс) для каждого узла общей памяти и OpenMP в узле общей памяти. Если вы ориентируетесь на один офисный компьютер, MPI не является первым выбором для модели программирования. Скорее всего, вам следует использовать исключительно OpenMP.

Теперь есть несколько веских причин для запуска более одного процесса MPI на узел, т. Е. По причинам NUMA или потому, что вы не пользуетесь общей памятью.

В общем, если вы новичок, сначала сосредоточьтесь на одной параллельной парадигме и ознакомьтесь с ней.

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

1. Процессор с одним сокетом недостаточно NUMA для MPI, чтобы вступили в силу такие соображения, как упомянутый Зулан.

2. @tim18 Я не хотел запутывать общую рекомендацию придерживаться OpenMP, но подчеркиваю, что всегда есть исключения. Например, с кластеризацией кластера на кристалле / под-NUMA можно утверждать о гибридном параллелизме даже с одним сокетом.

Ответ №2:

«как MPI и OpenMP соответствуют элементам в этом списке» — Я бы сказал, что для MPI этот список не имеет значения, в то время как OpenMP будет способен к 12-кратному распараллеливанию максимум. Но дело в том, что OpenMP волшебным образом не увеличивает скорость вашего кода, запуская его параллельно. Существующим приложениям может потребоваться полная реконструкция, чтобы воспользоваться преимуществами нескольких потоков. Итак, правильной отправной точкой было бы выяснить, какое из узких мест производительности проще всего сделать параллельным и переработать их одно за другим. OpenMP может помочь, а может и не помочь.

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

1. Существуют инструменты (такие как Intel Advisor software.intel.com/en-us/advisor который является бесплатным …), который может помочь вам распараллелить код. Если вы намерены делать то, что предлагает VTT, это может очень помочь. (FWIW Я работаю на Intel …)

2. Я ушел из Intel. Средства повышения производительности Intel (Advisor и др.) по-прежнему требуют от вас соблюдения некоторых проблем, упомянутых в ответах выше, таких как установка OMP_PLACES=cores OMP_NUM_THREADS = 6 для описанного вами процессора. Без закрепления потоков советник вряд ли даст согласованные результаты. Большинство MPI имеют встроенные средства, но вам не помешает сначала получить контроль над OpenMP.

3. Кстати, хотя советник работает как с gcc (не со всеми функциями), так и с icc в Linux, вам понадобится компилятор Intel ICL, чтобы использовать его в Windows.