Интерфейс передачи сообщений - Википедия - Message Passing Interface

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

История

Работа над интерфейсом передачи сообщений началась летом 1991 года, когда небольшая группа исследователей начала обсуждения в горном ретрите в Австрии. Результатом этого обсуждения стал семинар по стандартам передачи сообщений в среде с распределенной памятью, состоявшийся 29–30 апреля 1992 г. в г. Вильямсбург, Вирджиния.[1] Участники Williamsburg обсудили основные функции, необходимые для стандартного интерфейса передачи сообщений, и создали рабочую группу для продолжения процесса стандартизации. Джек Донгарра, Тони Эй и Дэвид У. Уокер выдвинули предварительный проект предложения «MPI1» в ноябре 1992 года. В ноябре 1992 года в Миннеаполисе состоялась встреча рабочей группы MPI, на которой было решено перевести процесс стандартизации на более формальную основу. Рабочая группа MPI собиралась каждые 6 недель в течение первых 9 месяцев 1993 года. Проект стандарта MPI был представлен на конференции Supercomputing '93 в ноябре 1993 года.[2] После периода общественного обсуждения, который привел к некоторым изменениям в MPI, версия 1.0 MPI была выпущена в июне 1994 года. Эти встречи и обсуждение по электронной почте вместе составили форум MPI, членство в котором было открыто для всех членов высокопроизводительные вычисления сообщество.

В MPI участвовало около 80 человек из 40 организаций, в основном из США и Европы. Большинство основных поставщиков параллельные компьютеры были вовлечены в MPI - вместе с исследователями из университетов, государственных лабораторий и промышленность.

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

Пытаясь создать универсальный стандарт для передачи сообщений, исследователи включили в MPI наиболее полезные функции нескольких систем, вместо того, чтобы выбирать одну систему для принятия в качестве стандарта. Они переняли функции из систем IBM, Intel, nCUBE, PVM, Express, P4 и PARMACS. Парадигма передачи сообщений привлекательна из-за широкой переносимости и может использоваться при обмене данными для мультипроцессоров с распределенной и общей памятью, сетей рабочих станций и сочетания этих элементов. Парадигма может применяться в нескольких параметрах, независимо от скорости сети или архитектуры памяти.

Частично поддержка встреч MPI поступила от DARPA и из США Национальный фонд науки в рамках гранта ASC-9310330, Соглашения о сотрудничестве Научно-технического центра NSF номер CCR-8809615, а также от Комиссии Европейского сообщества через проект Esprit P6643. В Университет Теннесси также внесла финансовый вклад в форум MPI.

Обзор

MPI - это протокол связи для программирования параллельные компьютеры. Поддерживаются как двухточечная, так и коллективная связь. MPI «представляет собой интерфейс прикладного программиста с передачей сообщений вместе с протоколом и семантическими спецификациями, определяющими, как его функции должны вести себя в любой реализации».[3] Цели MPI - высокая производительность, масштабируемость и переносимость. MPI остается доминирующей моделью, используемой в высокопроизводительные вычисления сегодня.[4]

MPI не санкционирован каким-либо крупным органом по стандартизации; тем не менее, он стал де-факто стандарт за коммуникация среди процессов, которые моделируют параллельная программа работает на распределенная память система. Реальные суперкомпьютеры с распределенной памятью, такие как компьютерные кластеры, часто запускают такие программы.

Основная модель MPI-1 не имеет Общая память концепция, а MPI-2 имеет только ограниченное распределенная разделяемая память концепция. Тем не менее, программы MPI регулярно запускаются на компьютерах с общей памятью, и оба MPICH и Открыть MPI может использовать общую память для передачи сообщений, если она доступна.[5][6] Разработка программ на основе модели MPI (вопреки явному Общая память модели) имеет преимущества перед NUMA архитектуры, поскольку MPI поощряет место в памяти. Явное программирование совместно используемой памяти было введено в MPI-3.[7][8][9]

Хотя MPI относится к уровням 5 и выше Эталонная модель OSI, реализации могут охватывать большинство уровней, с Розетки и Протокол управления передачей (TCP), используемый на транспортном уровне.

Большинство реализаций MPI состоят из определенного набора подпрограмм, вызываемых напрямую из C, C ++, Фортран (т.е. API) и любой язык, способный взаимодействовать с такими библиотеками, включая C #, Ява или же Python. Преимуществами MPI перед более старыми библиотеками передачи сообщений являются переносимость (поскольку MPI был реализован почти для каждой архитектуры распределенной памяти) и скорость (поскольку каждый выполнение в принципе оптимизирован для оборудования, на котором он работает).

MPI использует Спецификации, не зависящие от языка (LIS) для вызовов и языковых привязок. Указан первый стандарт MPI ANSI C и привязки Fortran-77 вместе с LIS. Проект был представлен на Supercomputing 1994 (ноябрь 1994 г.)[10] и доработан вскоре после этого. Около 128 функций составляют стандарт MPI-1.3, который был выпущен в качестве финального конца серии MPI-1 в 2008 году.[11]

В настоящее время стандарт имеет несколько версий: версия 1.3 (обычно сокращенно MPI-1), который подчеркивает передачу сообщений и имеет статическую среду выполнения, MPI-2.2 (MPI-2), которая включает новые функции, такие как параллельный ввод-вывод, динамическое управление процессами и операции удаленной памяти,[12] и MPI-3.1 (MPI-3), который включает расширения для коллективных операций с неблокирующими версиями и расширения для односторонних операций.[13]LIS MPI-2 определяет более 500 функций и предоставляет языковые привязки для ISO. C, ISO C ++, и Фортран 90. Также была добавлена ​​возможность взаимодействия объектов, чтобы упростить программирование передачи сообщений на разных языках. Побочным эффектом стандартизации MPI-2, завершенной в 1996 году, было уточнение стандарта MPI-1, создание MPI-1.2.

MPI-2 в основном является надмножеством MPI-1, хотя некоторые функции устарели. Программы MPI-1.3 все еще работают в реализациях MPI, соответствующих стандарту MPI-2.

MPI-3 включает новые привязки Fortran 2008, но при этом удаляет устаревшие привязки C ++, а также многие устаревшие процедуры и объекты MPI.

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

Функциональность

Интерфейс MPI предназначен для обеспечения необходимой виртуальной топологии, синхронизация, а также функциональные возможности связи между набором процессов (которые были сопоставлены с узлами / серверами / экземплярами компьютеров) независимым от языка способом, с синтаксисом, зависящим от языка (привязки), а также несколькими языковыми функциями. Программы MPI всегда работают с процессами, но программисты обычно называют процессы процессорами. Обычно для максимальной производительности каждый ЦПУ (или же основной в многоядерной машине) будет назначен только один процесс. Это назначение происходит во время выполнения через агент, запускающий программу MPI, обычно называемую mpirun или mpiexec.

Функции библиотеки MPI включают, но не ограничиваются, операции отправки / получения типа «точка-точка» с возможностью выбора между Декартово или же график -подобная топология логического процесса, обмен данными между парами процессов (операции отправки / получения), объединение частичных результатов вычислений (операции сбора и сокращения), синхронизация узлов (барьерная операция), а также получение сетевой информации, такой как количество процессов в вычислительном сеансе текущий идентификатор процессора, которому сопоставлен процесс, соседние процессы, доступные в логической топологии, и так далее. Двухточечные операции входят в синхронный, асинхронный, буферизованный и готовы формы, чтобы позволить как относительно более сильные, так и более слабые семантика для аспектов синхронизации рандеву-посылки. Многие выдающиеся[требуется разъяснение ] операции возможны в асинхронном режиме в большинстве реализаций.

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

Концепции

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

Коммуникатор

Объекты коммуникатора соединяют группы процессов в сеансе MPI. Каждый коммуникатор дает каждому включенному процессу независимый идентификатор и упорядочивает содержащиеся в нем процессы в упорядоченном виде. топология. MPI также имеет явные группы, но они в основном хороши для организации и реорганизации групп процессов до создания другого коммуникатора. MPI понимает операции внутрикоммуникаторной отдельной группы и двустороннюю межкоммуникаторную связь. В MPI-1 наиболее распространены одиночные групповые операции. Двусторонний операции чаще всего появляются в MPI-2, где они включают коллективное общение и динамическое внутрипроцессное управление.

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

Основы связи точка-точка

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

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

Коллективные основы

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

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

Производные типы данных

Многие функции MPI требуют, чтобы вы указали тип данных, которые пересылаются между процессами. Это связано с тем, что MPI направлен на поддержку гетерогенных сред, в которых типы могут быть представлены по-разному на разных узлах.[14] (например, они могут использовать разные архитектуры ЦП, которые имеют разные порядок байтов ), и в этом случае реализации MPI могут выполнять конверсия данных.[14] Поскольку язык C не позволяет передавать сам тип в качестве параметра, MPI заранее определяет константы. MPI_INT, MPI_CHAR, MPI_DOUBLE переписываться с int, char, двойной, так далее.

Вот пример на C, который передает массивы ints от всех процессов к одному. Один принимающий процесс называется "корневым" процессом, и это может быть любой назначенный процесс, но обычно это будет процесс 0. Все процессы запрашивают отправку своих массивов в корень с помощью MPI_Gather, что эквивалентно вызову каждого процесса (включая сам корень) MPI_Send и корень сделать соответствующее количество заказанных MPI_Recv призывает собрать все эти массивы в более крупный:[15]

int send_array[100];int корень = 0; / * или что угодно * /int num_procs, *recv_array;MPI_Comm_size(комм, &num_procs);recv_array = маллок(num_procs * размер(send_array));MPI_Gather(send_array, размер(send_array) / размер(*send_array), MPI_INT,           recv_array, размер(send_array) / размер(*send_array), MPI_INT,           корень, комм);

Однако вы можете вместо этого отправить данные одним блоком, а не 100 intс. Для этого определите производный тип данных «непрерывный блок»:

MPI_Datatype Новый тип;MPI_Type_contiguous(100, MPI_INT, &Новый тип);MPI_Type_commit(&Новый тип);MPI_Gather(множество, 1, Новый тип, receive_array, 1, Новый тип, корень, комм);

Для передачи класса или структуры данных, MPI_Type_create_struct создает производный тип данных MPI из MPI_predefined типы данных, такие как:

int MPI_Type_create_struct(int считать,                           int *Blocklen,                           MPI_Aint *дисп,                           MPI_Datatype *тип,                           MPI_Datatype *Новый тип)

куда:

  • считать количество блоков и определяет длину (в элементах) массивов Blocklen, дисп, и тип.
  • Blocklen содержит номера элементов в каждом блоке,
  • дисп содержит байтовые смещения каждого блока,
  • тип содержит типы элементов в каждом блоке.
  • Новый тип (вывод) содержит новый производный тип, созданный этой функцией

В дисп (displacements) массив необходим для выравнивание структуры данных, поскольку компилятор может дополнять переменные в классе или структуре данных. Самый безопасный способ найти расстояние между разными полями - получить их адреса в памяти. Это делается с помощью MPI_Get_address, который обычно совпадает с C & оператор, но это может быть неверно при работе с сегментация памяти.[16]

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

Учитывая следующие структуры данных:

структура А {    int ж;    короткая п;};структура B {    структура А а;    int pp, вице-президент;};

Вот код C для создания типа данных, производного от MPI:

статический const int Blocklen[] = {1, 1, 1, 1};статический const MPI_Aint дисп[] = {    смещение(структура B, а) + смещение(структура А, ж),    смещение(структура B, а) + смещение(структура А, п),    смещение(структура B, pp),    смещение(структура B, вице-президент)};статический MPI_Datatype тип[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};MPI_Datatype Новый тип;MPI_Type_create_struct(размер(тип) / размер(*тип), Blocklen, дисп, тип, &Новый тип);MPI_Type_commit(&Новый тип);

Концепции MPI-2

Одностороннее общение

MPI-2 определяет три односторонние коммуникационные операции, MPI_Put, MPI_Get, и MPI_Accumulate, являясь записью в удаленную память, чтением из удаленной памяти и операцией сокращения одной и той же памяти для ряда задач соответственно. Также определены три различных метода синхронизации этого обмена данными (глобальная, попарная и удаленная блокировки), поскольку спецификация не гарантирует, что эти операции выполняются до точки синхронизации.

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

Динамическое управление процессами

Ключевым аспектом является «способность процесса MPI участвовать в создании новых процессов MPI или устанавливать связь с процессами MPI, которые были запущены отдельно». Спецификация MPI-2 описывает три основных интерфейса, с помощью которых процессы MPI могут динамически устанавливать связь, MPI_Comm_spawn, MPI_Comm_accept/MPI_Comm_connect и MPI_Comm_join. В MPI_Comm_spawn интерфейс позволяет процессу MPI порождать несколько экземпляров именованного процесса MPI. Недавно созданный набор процессов MPI формирует новый MPI_COMM_WORLD интракоммуникатор, но может общаться с родителем и интеркоммуникатором, возвращаемым функцией. MPI_Comm_spawn_multiple - это альтернативный интерфейс, который позволяет создавать разные экземпляры как разные двоичные файлы с разными аргументами.[18]

Ввод / вывод

Функция параллельного ввода / вывода иногда называется MPI-IO,[19] и относится к набору функций, предназначенных для абстрагирования управления вводом-выводом в распределенных системах в MPI и обеспечения легкого доступа к файлам шаблонным способом с использованием существующих функциональных возможностей производных типов данных.

Небольшое исследование, проведенное по этой функции, указывает на то, что получить высокий прирост производительности с помощью MPI-IO может быть нетривиальной задачей. Например, реализация умножения разреженной матрицы на вектор с использованием библиотеки ввода-вывода MPI демонстрирует общее поведение с незначительным приростом производительности, но эти результаты неубедительны.[20] Так было до идеи коллективного ввода-вывода.[21] реализованный в MPI-IO, который MPI-IO начал получать широкое распространение. Коллективный ввод-вывод существенно увеличивает пропускную способность ввода-вывода приложений за счет того, что процессы коллективно преобразуют небольшие и несмежные операции ввода-вывода в большие и непрерывные, тем самым уменьшая накладные расходы на блокировку и поиск диска. Благодаря огромным преимуществам в производительности MPI-IO также стал базовым уровнем ввода-вывода для многих современных библиотек ввода-вывода, таких как HDF5 и Параллельный NetCDF. Его популярность также вызвала серию исследований по оптимизации коллективного ввода-вывода, таких как ввод-вывод с учетом макета.[22] и межфайловая агрегация.[23][24]

Официальные реализации

Многие другие разработки являются производными от MPICH, LAM и других работ, включая, помимо прочего, коммерческие реализации от HP, Intel, Microsoft, и NEC.

Хотя спецификации предписывают интерфейс C и Fortran, язык, используемый для реализации MPI, не ограничивается соответствием языку или языкам, которые он стремится поддерживать во время выполнения. Большинство реализаций объединяют C, C ++ и язык ассемблера и предназначены для программистов на C, C ++ и Fortran. Привязки доступны для многих других языков, включая Perl, Python, R, Ruby, Java и CL (видеть # Языковые привязки ).

Аппаратные реализации

Аппаратные исследования MPI фокусируются на реализации MPI непосредственно в оборудовании, например, через процессор в памяти, встраивая операции MPI в микросхему баран фишки в каждом узле. Подразумевается, что этот подход не зависит от языка, ОС или ЦП, но не может быть легко обновлен или удален.

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

Обертки компилятора

mpicc (и аналогично mpic ++, mpif90и т. д.) - это программа, которая оборачивает существующий компилятор для установки необходимых флагов командной строки при компиляции кода, использующего MPI. Как правило, он добавляет несколько флагов, которые позволяют скомпилировать код и связать его с библиотекой MPI.[25]

Языковые привязки

Привязки - это библиотеки, которые расширяют поддержку MPI на другие языки путем обертывания существующей реализации MPI, такой как MPICH или Open MPI.


Инфраструктура общего языка

Двое сумели Инфраструктура общего языка .СЕТЬ реализации - чистый Mpi.NET[26] и MPI.NET,[27] исследовательская работа в Университет Индианы под лицензией BSD -стильная лицензия. Он совместим с Мононуклеоз, и может в полной мере использовать основные сетевые структуры MPI с малой задержкой.

Ява

Несмотря на то, что Java не имеет официальной привязки MPI, несколько групп пытаются объединить их с разной степенью успеха и совместимости. Одной из первых попыток был mpiJava Брайана Карпентера,[28] по сути набор Собственный интерфейс Java (JNI) в локальную библиотеку C MPI, что приводит к гибридной реализации с ограниченной переносимостью, которая также должна быть скомпилирована для конкретной используемой библиотеки MPI.

Однако в этом исходном проекте также определен API mpiJava.[29]де-факто MPI API для Java, который внимательно следил за эквивалентными привязками C ++), которые были приняты другими последующими проектами Java MPI. Альтернативный, менее используемый API - MPJ API,[30] разработан, чтобы быть более объектно-ориентированным и ближе к Sun Microsystems 'соглашения о кодировании. Помимо API, библиотеки Java MPI могут либо зависеть от локальной библиотеки MPI, либо реализовывать функции передачи сообщений в Java, в то время как некоторым нравится P2P-MPI также предоставить пиринговый функциональность и позволяют работать на смешанной платформе.

Некоторые из наиболее сложных частей Java / MPI возникают из-за таких характеристик Java, как отсутствие явного указатели и адресное пространство линейной памяти для его объектов, что делает перенос многомерных массивов и сложных объектов неэффективным. Обходные пути обычно включают передачу по одной строке за раз и / или выполнение явного де-сериализация и Кастинг как на отправляющей, так и на принимающей стороне, имитируя массивы, подобные C или Fortran, с помощью одномерного массива и указатели на примитивные типы с помощью одноэлементных массивов, что приводит к стилям программирования, весьма далеким от соглашений Java.

Еще одна система передачи сообщений Java - MPJ Express.[31] Последние версии могут быть выполнены в кластерной и многоядерной конфигурациях. В конфигурации кластера он может выполнять параллельные приложения Java в кластерах и облаках. Здесь сокеты Java или специализированные межсоединения ввода-вывода, такие как Myrinet может поддерживать обмен сообщениями между процессами MPJ Express. Он также может использовать собственную реализацию MPI на языке C, используя собственное устройство. В многоядерной конфигурации параллельное приложение Java выполняется на многоядерных процессорах. В этом режиме процессы MPJ Express представлены потоками Java.

Язык Юлии

В Юля языковая оболочка для MPI,[32] был использован и оказался быстрее, чем для C или Fortran.[33]

MATLAB

Существует несколько академических реализаций MPI с использованием MATLAB. MATLAB имеет собственную библиотеку параллельных расширений, реализованную с использованием MPI и PVM.

OCaml

Модуль OCamlMPI[34] реализует большое количество функций MPI и активно используется в научных вычислениях. Одиннадцать тысяч строк OCaml Программа была "MPI-модифицирована" с использованием модуля, с дополнительными 500 строками кода и небольшой реструктуризацией и работала с превосходными результатами на 170 узлах в суперкомпьютере.[35]

Python

Реализации MPI Python включают: pyMPI, mpi4py,[36] пипар[37] МИМПИ,[38] и подмодуль MPI в Научный Питон. pyMPI примечателен тем, что это вариант интерпретатора python, а модуль pypar, MYMPI и ScientificPython - это модули импорта. Они поручают кодеру решать, кому принадлежит вызов MPI_Init.

Недавно[когда? ] то Библиотеки Boost C ++ приобрел Boost: MPI, который включал привязки MPI Python.[39] Это особенно помогает при смешивании C ++ и Python. По состоянию на октябрь 2016 г. Boost: привязки MPI Python по-прежнему содержат не исправленные ошибки упаковки в CentOS.[40]

р

р привязки MPI включают RMPI[41] и pbdMPI,[42] где Rmpi ​​фокусируется на менеджеры-рабочие параллелизм, в то время как pbdMPI фокусируется на СПМД параллелизм. Обе реализации полностью поддерживают Открыть MPI или же MPICH2.

Пример программы

Вот программа «Hello World» на MPI, написанная на C. В этом примере мы отправляем сообщение «hello» каждому процессору, тривиально обрабатываем его, возвращаем результаты основному процессу и распечатываем сообщения.

/*  Программа тестирования MPI "Hello World"*/#включают <assert.h>#включают <stdio.h>#включают <string.h>#включают <mpi.h>int главный(int argc, char **argv){    char бух[256];    int my_rank, num_procs;    / * Инициализируем инфраструктуру, необходимую для связи * /    MPI_Init(&argc, &argv);    / * Идентифицируем этот процесс * /    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);    / * Узнаем, сколько всего процессов активно * /    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);    / * До этого момента все программы работали одинаково.       Здесь мы проверяем рейтинг, чтобы различать роли программ * /    если (my_rank == 0) {        int other_rank;        printf("У нас есть% i процессов. п", num_procs);        / * Отправляем сообщения всем остальным процессам * /        за (other_rank = 1; other_rank < num_procs; other_rank++)        {            спринт(бух, "Здравствуйте, я!", other_rank);            MPI_Send(бух, размер(бух), MPI_CHAR, other_rank,                     0, MPI_COMM_WORLD);        }        / * Получать сообщения от всех остальных процессов * /        за (other_rank = 1; other_rank < num_procs; other_rank++)        {            MPI_Recv(бух, размер(бух), MPI_CHAR, other_rank,                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);            printf("% s п", бух);        }    } еще {        / * Получение сообщения от процесса # 0 * /        MPI_Recv(бух, размер(бух), MPI_CHAR, 0,                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);        утверждать(memcmp(бух, "Привет ", 6) == 0);        / * Отправить сообщение процессу # 0 * /        спринт(бух, «Обработка% i отчетности для дежурства»., my_rank);        MPI_Send(бух, размер(бух), MPI_CHAR, 0,                 0, MPI_COMM_WORLD);    }    / * Разрушаем коммуникационную инфраструктуру * /    MPI_Finalize();    возвращаться 0;}

При запуске с 4 процессами он должен выдать следующий результат:[43]

$ mpicc example.c && mpiexec -n 4 ./a.out У нас есть 4 процесса: процесс 1 - отчет для дежурства; процесс 2 - отчет по дежурству; процесс 3 - отчет по дежурству.

Здесь, mpiexec это команда, используемая для выполнения примера программы с 4 процессы, каждый из которых является независимым экземпляром программы во время выполнения и имеет ранги (т.е. числовые идентификаторы) 0, 1, 2 и 3. Имя mpiexec рекомендуется стандартом MPI, хотя некоторые реализации предоставляют аналогичную команду под названием mpirun. В MPI_COMM_WORLD коммуникатор, который состоит из всех процессов.

Одна программа, несколько данных (СПМД ) модель программирования тем самым упрощается, но не требуется; многие реализации MPI позволяют запускать несколько разных исполняемых файлов в одном задании MPI. У каждого процесса есть свой ранг, общее количество процессов в мире и возможность общаться между ними либо с помощью двухточечной связи (отправка / получение), либо посредством коллективного общения между группой. Для MPI достаточно предоставить программу в стиле SPMD с MPI_COMM_WORLD, свой ранг и размер мира, чтобы алгоритмы могли решать, что им делать. В более реалистичных ситуациях ввод-вывод управляется более тщательно, чем в этом примере. MPI не оговаривает, как стандартный ввод-вывод (stdin, stdout, stderr) должен работать в данной системе. Обычно он работает должным образом в процессе ранга 0, а некоторые реализации также захватывают и направляют выходные данные других процессов.

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

Принятие MPI-2

Принятие MPI-1.2 было универсальным, особенно в кластерных вычислениях, но принятие MPI-2.1 было более ограниченным. Проблемы включают:

  1. Реализации MPI-2 включают ввод-вывод и динамическое управление процессами, а размер промежуточного программного обеспечения значительно больше. Большинство сайтов, использующих системы пакетного планирования, не могут поддерживать динамическое управление процессами. Параллельный ввод / вывод MPI-2 хорошо принят.[нужна цитата ]
  2. Многие программы MPI-1.2 были разработаны до MPI-2. Изначально проблемы переносимости замедлили внедрение, хотя более широкая поддержка уменьшила это.
  3. Многие приложения MPI-1.2 используют только подмножество этого стандарта (16-25 функций) без реальной потребности в функциональности MPI-2.

Будущее

Некоторые аспекты будущего MPI кажутся убедительными; другие в меньшей степени. В MPI Forum повторно собрался в 2007 году, чтобы прояснить некоторые проблемы MPI-2 и изучить разработки для возможного MPI-3, в результате чего были выпущены версии MPI-3.0 (сентябрь 2012 года) и MPI-3.1 (июнь 2015 года).

Архитектуры меняются с увеличением внутреннего параллелизма (многоядерный ), улучшенный контроль параллелизма (многопоточность, сходство) и большее количество уровней иерархии памяти. Многопоточный программы могут легче использовать преимущества этих разработок, чем однопоточные приложения. Это уже привело к появлению отдельных дополнительных стандартов для симметричная многопроцессорная обработка, а именно OpenMP. MPI-2 определяет, как соответствующие стандарту реализации должны решать проблемы с многопоточностью, но не требует, чтобы реализации были многопоточными или даже поточно-ориентированными. MPI-3 добавляет возможность использовать параллелизм с разделяемой памятью внутри узла. Реализации MPI, такие как Adaptive MPI, Hybrid MPI, Fine-Grained MPI, MPC и другие, предлагают расширения стандарта MPI, которые решают различные проблемы в MPI.

Астрофизик Джонатан Дурси написал статью о том, что MPI устарел, указав на новые технологии, такие как Часовня, Унифицированный параллельный C, Hadoop, Искра и Flink.[44]

Смотрите также

Рекомендации

  1. ^ Уокер DW (август 1992 г.). Стандарты передачи сообщений в среде с распределенной памятью (PDF) (Отчет). Национальная лаборатория Ок-Ридж, Теннесси (США), Центр исследований в области параллельных вычислений (CRPC). п. 25. OSTI  10170156. ORNL / TM-12147. Получено 2019-08-18.
  2. ^ Форум MPI, CORPORATE (15–19 ноября 1993 г.). «MPI: интерфейс передачи сообщений». Материалы конференции ACM / IEEE 1993 года по суперкомпьютерам. Суперкомпьютеры '93. Портленд, Орегон, США: ACM. С. 878–883. Дои:10.1145/169627.169855. ISBN  0-8186-4340-4.
  3. ^ Гропп, Ласк и Скьеллум 1996, п. 3
  4. ^ Сур, Саянтан; Куп, Мэтью Дж .; Панда, Дхабалешвар К. (4 августа 2017 г.). «MPI и связь --- Высокопроизводительный и масштабируемый MPI через Infini. Группа с уменьшенным использованием памяти ». Высокопроизводительный и масштабируемый MPI через InfiniBand с уменьшенным использованием памяти: углубленный анализ производительности. ACM. п. 105. Дои:10.1145/1188455.1188565. ISBN  978-0769527000. S2CID  818662.
  5. ^ KNEM: высокопроизводительная внутриузловая коммуникация MPI «MPICH2 (начиная с выпуска 1.1.1) использует KNEM в DMA LMT для повышения производительности больших сообщений в пределах одного узла. Open MPI также включает поддержку KNEM в своем компоненте SM BTL, начиная с выпуска 1.5. Кроме того, NetPIPE включает серверную часть KNEM, начиная с версии 3.7. .2. "
  6. ^ "Вопросы и ответы: настройка характеристик времени выполнения коммуникаций MPI sm". www.open-mpi.org.
  7. ^ https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en «Стандарт MPI-3 представляет другой подход к гибридному программированию, в котором используется новая модель общей памяти MPI (SHM)»
  8. ^ Общая память и MPI 3.0 «Различные тесты могут быть запущены, чтобы определить, какой метод лучше всего подходит для конкретного приложения, будь то MPI + OpenMP или расширения MPI SHM. В довольно простом тестовом примере ускорение по сравнению с базовой версией, которая использовала двухточечную связь, было до 5X , в зависимости от сообщения ".
  9. ^ Использование разделяемой памяти MPI-3 в качестве многоядерной системы программирования (Слайды презентации в формате PDF)
  10. ^ Содержание - сентябрь 1994, 8 (3-4). Hpc.sagepub.com. Проверено 24 марта 2014.
  11. ^ Документы MPI. Mpi-forum.org. Проверено 24 марта 2014.
  12. ^ Гропп, Ласк и Скьеллум, 1999b, стр. 4–5
  13. ^ MPI: стандарт интерфейса передачи сообщений
    Версия 3.1, Форум по интерфейсу передачи сообщений, 4 июня 2015 г.
    . http://www.mpi-forum.org. Проверено 16 июня 2015.
  14. ^ а б «Правила соответствия типов». mpi-forum.org.
  15. ^ "Справочная страница MPI_Gather (3) (версия 1.8.8)". www.open-mpi.org.
  16. ^ "MPI_Get_address". www.mpich.org.
  17. ^ Обоснование механизма скелета / контента Boost.MPI (графики сравнения производительности были построены с использованием NetPIPE )
  18. ^ Гропп, Ласк и Скьеллинг, 1999b, п. 7
  19. ^ Гропп, Ласк и Скьеллинг, 1999b, стр. 5–6
  20. ^ "Разреженное умножение матрицы на вектор с использованием библиотеки ввода-вывода MPI" (PDF).
  21. ^ «Просеивание данных и коллективный ввод / вывод в ROMIO» (PDF). IEEE. Февраль 1999 г.
  22. ^ Чен, Юн; Сунь, Сиань-Хэ; Такур, Раджив; Рот, Филип С .; Гропп, Уильям Д. (сентябрь 2011 г.). «LACIO: Новая стратегия коллективного ввода-вывода для систем параллельного ввода-вывода». 2011 Международный симпозиум по параллельной и распределенной обработке IEEE. IEEE. С. 794–804. CiteSeerX  10.1.1.699.8972. Дои:10.1109 / IPDPS.2011.79. ISBN  978-1-61284-372-8. S2CID  7110094.
  23. ^ Тэн Ван; Кевин Васько; Чжо Лю; Хуэй Чен; Вэйкуан Ю (2016). «Улучшите параллельный ввод / вывод с помощью агрегации между пакетами». Международный журнал приложений для высокопроизводительных вычислений. 30 (2): 241–256. Дои:10.1177/1094342015618017. S2CID  12067366.
  24. ^ Ван, Тэн; Васько, Кевин; Лю, Чжо; Чен, Хуэй; Ю, Вэйкуань (ноябрь 2014 г.). «BPAR: основанная на пакетах структура параллельной агрегации для независимого выполнения ввода-вывода». 2014 Международный семинар по масштабируемым вычислительным системам с интенсивным использованием данных. IEEE. С. 25–32. Дои:10.1109 / DISCS.2014.6. ISBN  978-1-4673-6750-9. S2CID  2402391.
  25. ^ mpicc. Mpich.org. Проверено 24 марта 2014.
  26. ^ Чистый Mpi.NET
  27. ^ «MPI.NET: высокопроизводительная библиотека C # для передачи сообщений». www.osl.iu.edu.
  28. ^ "Домашняя страница mpiJava". www.hpjava.org.
  29. ^ «Введение в API mpiJava». www.hpjava.org.
  30. ^ «Спецификация API MPJ». www.hpjava.org.
  31. ^ «Экспресс-проект MPJ». mpj-express.org.
  32. ^ JuliaParallel / MPI.jl, Параллельная Юлия, 2019-10-03, получено 2019-10-08
  33. ^ «Параллельное программирование с Юлией с использованием MPI». Маргиналии. 2018-09-30. Получено 2019-10-08. Я был очень впечатлен, когда тестировал производительность реализации Julia по сравнению с Fortran и C: я обнаружил, что реализация Julia является самой быстрой!
  34. ^ «Ксавье Леруа - Программное обеспечение». cristal.inria.fr.
  35. ^ Архив списка рассылки Caml> Сообщение Ярона М. Мински. Caml.inria.fr (15 июля 2003 г.). Проверено 24 марта 2014.
  36. ^ "Архив Google Code - долгосрочное хранилище для хостинга проектов Google Code". code.google.com.
  37. ^ "Архив Google Code - долгосрочное хранилище для хостинга проектов Google Code". code.google.com.
  38. ^ Теперь часть Pydusa
  39. ^ "Привязки Python - 1.35.0". www.boost.org.
  40. ^ «0006498: В пакете boost- * mpi-python отсутствует модуль python - CentOS Bug Tracker». bugs.centos.org.
  41. ^ Ю, Хао (2002). «Rmpi: параллельные статистические вычисления в R». Новости R.
  42. ^ Чен, Вэй-Чен; Остроухов, Георгий; Шмидт, Дрю; Патель, Прагнешкумар; Ю, Хао (2012). «pbdMPI: Программирование с использованием больших данных - интерфейс для MPI».
  43. ^ Фрагмент вывода был создан на обычной настольной системе Linux с установленным Open MPI. Дистрибутивы обычно помещают команду mpicc в пакет openmpi-devel или libopenmpi-dev, а иногда заставляют выполнить команду «module add mpi / openmpi-x86_64» или аналогичную до того, как станут доступны mpicc и mpiexec.
  44. ^ «HPC умирает, а MPI убивает его». www.dursi.ca.

дальнейшее чтение

внешняя ссылка