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

StackOverflow https://stackoverflow.com/questions/185444

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

  

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top