Подтвердить что ты не робот

MPI vs openMP для общей памяти

Допустим, есть компьютер с 4 процессорами, каждый из которых имеет 2 ядра, а значит, всего 8 ядер. С моим ограниченным пониманием я думаю, что в этом случае все процессоры используют одну и ту же память. Теперь лучше ли использовать openMP напрямую или использовать MPI, чтобы сделать его общим, чтобы код мог работать как с распределенными, так и с общими настройками. Кроме того, если я использую MPI для общей настройки, производительность снизится по сравнению с openMP?

4b9b3361

Ответ 1

В большинстве платформ с распределенной памятью в настоящее время, состоящих из узлов SMP или NUMA, просто не имеет смысла не использовать OpenMP. OpenMP и MPI могут отлично работать вместе; OpenMP передает ядра на каждый node, а MPI связывается между узлами. Это называется гибридным программированием. Он считался экзотическим 10 лет назад, но теперь он становится основным в High Performance Computing.

Что касается самого вопроса, правильный ответ, учитывая предоставленную информацию, всегда был одним и тем же: IT DEPENDS.

Ответ 2

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

Пример 1

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

В этом случае вы, вероятно, захотите использовать MPI и запустить один процесс MPI на каждом node, тем самым максимально используя доступную память, ограничивая связь с минимальным минимумом.

Пример 2

У вас обычно есть небольшие наборы данных и вы только хотите ускорить свое приложение, которое является чрезмерно тяжелым. Кроме того, вы не хотите тратить много времени на размышления о параллелизации, но больше своих алгоритмов в целом.

В этом случае OpenMP - ваш первый выбор. Вам нужно только добавить несколько инструкций здесь и там (например, перед вашими циклами, которые вы хотите ускорить), и если ваша программа не слишком сложна, OpenMP сделает все остальное для вас автоматически.

Пример 3

Ты хочешь все. Вам нужно больше памяти, т.е. Больше вычислительных узлов, но вы также хотите как можно быстрее ускорить вычисления, т.е. Работать с несколькими ядрами на node.

Теперь ваше оборудование входит в игру. Из моего личного опыта, если у вас есть только несколько ядер на node (4-8), штраф за производительность, созданный из общих накладных расходов на использование OpenMP (т.е. запуск потоков OpenMP и т.д.), Больше, чем накладные расходы процессора - внутренняя коммуникация MPI (т.е. отправка сообщений MPI между процессами, которые фактически обмениваются памятью и не нуждаются в MPI для связи).
Однако, если вы работаете с машиной с большим количеством ядер на node (16+), становится необходимо использовать гибридный подход, то есть параллелизировать MPI и OpenMP одновременно. В этом случае для полного использования ваших вычислительных ресурсов потребуется гибридная распараллеливание, но ее также сложно скомпоновать и поддерживать.

Резюме
Если у вас есть проблема, которая достаточно мала, чтобы работать только на одном node, используйте OpenMP. Если вы знаете, что вам нужно больше, чем один node (и, следовательно, определенно нужен MPI), но вы предпочитаете читаемость кода/усилие по производительности, используйте только MPI. Если использование MPI только не дает вам ускорения, которое вы хотели бы/требовать, вам нужно сделать все это и перейти на гибрид.

К вашему второму вопросу (в случае, если это не стало ясно):
Если вы настроены таким образом, что вам совсем не нужен MPI (потому что вы всегда будете работать только на одном node), используйте OpenMP, поскольку он будет быстрее. Но если вы знаете, что вам нужен MPI в любом случае, я бы начал с этого и позже добавлю OpenMP позже, когда вы знаете, что исчерпали все разумные варианты оптимизации для MPI.

Ответ 3

Для использования на одном компьютере с общей памятью я бы рекомендовал OpenMP. Это упростит некоторые аспекты проблемы, а может быть быстрее.

Если вы планируете перейти на машину с распределенной памятью, используйте MPI. Это избавит вас от решения одной и той же проблемы дважды.

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

Ответ 4

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

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

Говоря в кеше, на недавних процессорах существует очень различная топология кеша и всегда: IT DEPENDS...