Почему MPI считается сложнее, чем разделяемая память, а Эрланга - легче, когда они оба передают сообщения? - PullRequest
31 голосов
/ 09 октября 2008

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

И наоборот, в сообществе высокопроизводительных вычислений доминирующей моделью параллельного программирования был MPI, который также реализует модель передачи сообщений. Но в мире HPC эту модель передачи сообщений обычно считают очень сложной для программирования, и люди утверждают, что модели с общей памятью, такие как OpenMP или UPC, легче программировать.

Кто-нибудь знает, почему существует такая разница в восприятии передачи сообщений и общей памяти в мире ИТ и HPC? Это из-за какой-то принципиальной разницы в том, как Erlang и MPI реализуют передачу сообщений, что делает передачу сообщений в стиле Erlang намного проще, чем MPI? Или есть какая-то другая причина?

Ответы [ 7 ]

37 голосов
/ 02 ноября 2008

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

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

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

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

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

12 голосов
/ 09 октября 2008

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

Во-первых, поскольку передача сообщений в Erlang - это первоклассная языковая функция, синтаксический сахар облегчает ее восприятие.

Кроме того, все библиотеки Erlang построены на передаче сообщений Erlang. Эта структура поддержки помогает вам повысить производительность земли с параллельной обработкой. Взгляните на компоненты OTP , такие как gen_server, gen_fsm, gen_event. Это очень простые в использовании структуры, которые могут помочь вашей программе стать параллельной.

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

9 голосов
/ 07 декабря 2011

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

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

Эта модель похожа на то, для чего большинство людей используют PThreads. Он подходит для таких приложений, как веб-серверы, где каждый запрос может обрабатываться различным потоком, в то время как приложения HPC выполняют почти одинаковые действия с огромными объемами данных, которые также необходимо обмениваться между работниками.

8 голосов
/ 01 ноября 2008

Я думаю, что это как-то связано с мышлением, когда вы программируете с помощью MPI и когда вы программируете с помощью Erlang. Например, MPI не встроен в язык, тогда как Erlang имеет встроенную поддержку для передачи сообщений. Другая возможная причина - разрыв между простой отправкой / получением сообщений и разбиением решений на параллельные единицы исполнения.

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

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

Обсуждение может продолжаться, но распространенное мнение состоит в том, что если конструкция для передачи сообщений фактически встроена в используемый вами язык программирования и парадигму, обычно это лучшее средство выражения решения по сравнению с чем-то еще, что «привязан» или существует как дополнение к языку (в форме библиотеки или расширения).

4 голосов
/ 27 декабря 2010

Кто-нибудь знает, почему существует такая разница в восприятии передачи сообщений и общей памяти в мире ИТ и HPC? Это из-за какой-то принципиальной разницы в том, как Erlang и MPI реализуют передачу сообщений, что делает передачу сообщений в стиле Erlang намного проще, чем MPI? Или есть какая-то другая причина?

Причина - просто параллелизм против параллелизма. Erlang разводят для параллельного программирования. HPC - это все о параллельном программировании. Это взаимосвязанные, но разные цели.

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

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

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

0 голосов
/ 19 июня 2012

Эта статья действительно объясняет это хорошо, Erlang лучше всего подходит, когда мы посылаем небольшие куски данных, а MPI намного лучше справляется с более сложными задачами. Также модель Erlang легко понять: -)

Erlang против MPI - окончательные результаты и исходный код

0 голосов
/ 09 октября 2008

Относительно MPI против OpenMP / UPC: MPI заставляет вас разбивать проблему на мелкие кусочки и брать на себя ответственность за перемещение данных. С OpenMP / UPC, «все данные есть», вам просто нужно разыменовать указатель. Преимущество MPI состоит в том, что 32-512 ЦП кластеров намного дешевле, чем 32-512 ЦП одиночных машин. Кроме того, при использовании MPI затраты являются предоплатными при разработке алгоритма. OpenMP / UPC может скрыть задержки, которые вы получите во время выполнения, если ваша система использует NUMA (и все большие системы используют) - ваша программа не будет масштабироваться, и потребуется время, чтобы выяснить, почему.

...