Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Интерфейс передачи сообщений ( MPI ) - это стандартизованный переносимый стандарт передачи сообщений, предназначенный для работы в архитектурах параллельных вычислений . MPI стандарт определяет синтаксис и семантика из библиотеки подпрограмм , которые являются полезными для широкого круга пользователей , пишущих портативных программы передачи сообщений в C , C ++ и Fortran . Существует несколько реализаций 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 предоставляет простой в использовании переносимый интерфейс для базового пользователя, но достаточно мощный, чтобы позволить программистам использовать высокопроизводительные операции передачи сообщений, доступные на продвинутых машинах.

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

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

Обзор [ править ]

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

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

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

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

Большинство реализаций MPI состоят из определенного набора подпрограмм, вызываемых напрямую из C , C ++ , Fortran (т. Е. API) и любого языка, способного взаимодействовать с такими библиотеками, включая C # , Java или 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 ++ и Fortran 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 часто сравнивают с Parallel Virtual Machine (PVM), которая представляет собой популярную распределенную среду и систему передачи сообщений, разработанную в 1989 году и являющуюся одной из систем, которая мотивировала необходимость стандартной параллельной передачи сообщений. Модели потокового программирования с общей памятью (такие как Pthreads и OpenMP ) и программирование с передачей сообщений (MPI / PVM) можно рассматривать как взаимодополняющие и иногда использовались вместе, например, на серверах с несколькими большими узлами с общей памятью.

Функциональность [ править ]

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

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

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вызов, который берет данные от всех процессов в группе, выполняет операцию (например, суммирование) и сохраняет результаты на одном узле. MPI_Reduceчасто бывает полезно в начале или в конце больших распределенных вычислений, когда каждый процессор обрабатывает часть данных, а затем объединяет их в результат.

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

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

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

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

int  send_array [ 100 ]; int  root  =  0 ;  / * или что угодно * / int  num_procs ,  * recv_array ; MPI_Comm_size ( комм ,  и num_procs ); recv_array  =  malloc ( num_procs  *  sizeof ( send_array )); MPI_Gather ( массив_передачи ,  sizeof ( массив_передачи )  /  sizeof ( * массив_передачи ),  MPI_INT,  recv_array ,  sizeof ( send_array )  /  sizeof ( * send_array ),  MPI_INT ,  root ,  comm );

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

MPI_Datatype  newtype ; MPI_Type_contiguous ( 100 ,  MPI_INT ,  & новыйтип ); MPI_Type_commit ( & новыйтип ); MPI_Gather ( массив ,  1 ,  Newtype ,  receive_array ,  1 ,  Newtype ,  корень ,  Прдч );

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

INT  MPI_Type_create_struct ( INT  Количество ,  INT  * blocklen ,  MPI_Aint  * Индик.точки ,  MPI_Datatype  * тип ,  MPI_Datatype  * Newtype )

где:

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

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

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

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

struct  A  {  int  f ;  короткая  р ; };struct  B  {  struct  A  a ;  int  pp ,  vp ; };

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

статическая  константа  int  blocklen []  =  { 1 ,  1 ,  1 ,  1 }; static  const  MPI_Aint  disp []  =  {  offsetof ( struct  B ,  a )  +  offsetof ( struct  A ,  f ),  offsetof ( struct  B ,  a )  +  offsetof ( struct  A ,  p ),  offsetof (struct  B ,  pp ),  offsetof ( struct  B ,  vp ) }; статический  тип MPI_Datatype  [] = { MPI_INT , MPI_SHORT , MPI_INT , MPI_INT }; MPI_Datatype newtype ; MPI_Type_create_struct ( SizeOf ( тип ) / SizeOf ( * тип ), blocklen , СМЕЩЕНИЕ , тип , & Newtype );            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]

I / O [ править ]

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

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

Официальные реализации [ править ]

  • Первоначальной реализацией стандарта MPI 1.x был MPICH , разработанный Аргоннской национальной лабораторией (ANL) и Государственным университетом Миссисипи . IBM также была одним из первых разработчиков, и большинство суперкомпьютерных компаний начала 90-х либо коммерциализировали MPICH, либо создали свои собственные реализации. LAM / MPI от суперкомпьютерного центра Огайо была еще одной ранней открытой реализацией. ANL продолжала развивать MPICH более десяти лет и теперь предлагает MPICH-3.2, реализующий стандарт MPI-3.1.
  • Открытый MPI (не путать с OpenMP ) был образован путем слияния FT-MPI, LA-MPI, LAM / MPI и PACX-MPI и встречается во многих суперкомпьютерах TOP-500 .

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

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

Оборудование [ править ]

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

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

Оболочки компилятора [ править ]

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

Привязки языков [ править ]

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

Общая языковая инфраструктура [ править ]

Двумя управляемыми реализациями инфраструктуры Common Language Infrastructure .NET являются Pure Mpi.NET [26] и MPI.NET [27], исследовательская работа в Университете Индианы под лицензией в стиле BSD . Он совместим с Mono и может в полной мере использовать базовые сетевые структуры MPI с низкой задержкой.

Java [ править ]

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

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

Юлия [ править ]

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

MATLAB [ править ]

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

OCaml [ править ]

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

Python [ править ]

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

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

R [ править ]

R- привязки MPI включают Rmpi [41] и pbdMPI , [42], где Rmpi ​​фокусируется на параллелизме менеджеров и рабочих, а pbdMPI фокусируется на параллелизме SPMD . Обе реализации полностью поддерживают Open MPI или MPICH2 .

Пример программы [ править ]

Вот и "Привет, мир!" программа на MPI, написанная на C. В этом примере мы отправляем приветственное сообщение каждому процессору, тривиально обрабатываем его, возвращаем результаты основному процессу и распечатываем сообщения.

/ *  Тестовая программа MPI "Hello World" * / #include  <assert.h>#include  <stdio.h>#include  <string.h>#include  <mpi.h>int  main ( int  argc ,  char  ** argv ) {  char  buf [ 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 ); / * До этого момента все программы выполняли одно и то же.  Здесь мы проверяем рейтинг, чтобы различать роли программ * /  if  ( my_rank  ==  0 )  {  int  other_rank ;  printf ( "У нас% i процессов. \ n " ,  num_procs ); / * Отправлять сообщения всем остальным процессам * /  for  ( other_rank  =  1 ;  other_rank  <  num_procs ;  other_rank ++ )  {  sprintf ( buf ,  "Hello% i!" ,  Other_rank );  MPI_Send ( buf ,  sizeof ( buf ),  MPI_CHAR ,  other_rank ,  0 ,  MPI_COMM_WORLD );  } / * Получать сообщения от всех остальных процессов * /  for  ( other_rank  =  1 ;  other_rank  <  num_procs ;  other_rank ++ )  {  MPI_Recv ( buf ,  sizeof ( buf ),  MPI_CHAR ,  other_rank ,  0 ,  MPI_COMM_WORLD ,  MPI_STATUS_IGNORE );  printf ( "% s \ n " ,  buf );  } }  else  { / * Получение сообщения от процесса  №0 * / MPI_Recv ( buf ,  sizeof ( buf ),  MPI_CHAR ,  0 ,  0 ,  MPI_COMM_WORLD ,  MPI_STATUS_IGNORE );  assert ( memcmp ( buf ,  «Привет» ,  6 )  ==  0 ); / * Отправить сообщение процессу # 0 * /  sprintf ( buf ,  «Процесс% i сообщает о дежурстве.» ,  My_rank );  MPI_Send ( buf ,  sizeof ( buf ),  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коммуникатор, который состоит из всех процессов.

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

MPI использует понятие процесса, а не процессора. Копии программ отображаются на процессоры средой выполнения MPI . В этом смысле параллельная машина может отображаться на один физический процессор или на 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 устаревшим, указав на новые технологии, такие как язык Chapel , Unified Parallel C , Hadoop , Spark и Flink . [44]

См. Также [ править ]

  • Актерская модель
  • Массовая синхронная параллель
  • Космический куб Калифорнийского технологического института
  • Очарование ++
  • Ко-массив Fortran
  • Глобальные массивы
  • Интерфейс передачи сообщений Microsoft
  • МВАПИЧ
  • OpenHMPP
  • Параллельная виртуальная машина (PVM)
  • Разделенное глобальное адресное пространство
  • Унифицированный параллельный C
  • X10 (язык программирования)

Ссылки [ править ]

  1. ^ Уокер DW (август 1992 г.). Стандарты передачи сообщений в среде с распределенной памятью (PDF) (Отчет). Национальная лаборатория Ок-Ридж, штат Теннесси (США), Центр исследований параллельных вычислений (CRPC). п. 25. ОСТИ  10170156 . ORNL / TM-12147 . Проверено 18 августа 2019 .
  2. ^ ИМБ форум, КОРПОРАТИВНЫЙ (15-19 ноября, 1993). «MPI: интерфейс передачи сообщений». Материалы конференции ACM / IEEE 1993 г. по суперкомпьютерам . Суперкомпьютеры-93 . Портленд, Орегон, США: ACM. С. 878–883. DOI : 10.1145 / 169627.169855 . ISBN 0-8186-4340-4.
  3. ^ Gropp, Ласка & Skjellum 1996 , стр. 3
  4. ^ Сур, Саянтан; Куп, Мэтью Дж .; Панда, Дхабалешвар К. (4 августа 2017 г.). «MPI и связь --- Высокопроизводительный и масштабируемый MPI через Infini Band с уменьшенным использованием памяти». Высокопроизводительный и масштабируемый MPI через InfiniBand с уменьшенным использованием памяти: углубленный анализ производительности . ACM. п. 105. DOI : 10,1145 / 1188455,1188565 . ISBN 978-0769527000. S2CID  818662 .
  5. ^ KNEM: High-Performance Intra-Node MPI Communication »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. ^ Gropp, Ласка & Skjellum 1999b , стр. 4-5
  13. ^ MPI: передачи сообщений интерфейса Стандартная версия 3.1, интерфейс передачи сообщений форума, 4 июня 2015 . http://www.mpi-forum.org . Проверено 16 июня 2015.
  14. ^ a b «Правила сопоставления типов» . 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. ^ Gropp, Ласка & Skjelling 1999b , стр. 7
  19. ^ Gropp, Ласка & Skjelling 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 . DOI : 10.1109 / IPDPS.2011.79 . ISBN  978-1-61284-372-8. S2CID  7110094 .
  23. ^ Teng Wang; Кевин Васько; Чжо Лю; Хуэй Чен; Вэйкуан Ю (2016). «Улучшите параллельный ввод / вывод с помощью агрегации между пакетами». Международный журнал приложений высокопроизводительных вычислений . 30 (2): 241–256. DOI : 10.1177 / 1094342015618017 . S2CID 12067366 . 
  24. ^ Ван, Тэн; Васько, Кевин; Лю, Чжо; Чен, Хуэй; Ю, Вэйкуань (ноябрь 2014 г.). «BPAR: основанная на пакетах структура параллельного агрегирования для независимого выполнения операций ввода-вывода». 2014 Международный семинар по масштабируемым вычислительным системам с интенсивным использованием данных . IEEE. С. 25–32. DOI : 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 , Parallel Julia, 03.10.2019 , получено 08.10.2019.
  33. ^ «Параллельное программирование с Джулией с использованием MPI» . Marginalia . 2018-09-30 . Проверено 8 октября 2019 . Я был очень впечатлен, когда тестировал производительность реализации Julia в сравнении с Фортраном и 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. ^ Сейчас часть Пидуса
  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 News .
  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 .

Дальнейшее чтение [ править ]

  • Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.
  • Аояма, Юкия; Накано, июн (1999) RS / 6000 SP: Практическое программирование MPI , ITSO
  • Фостер, Ян (1995) Проектирование и создание параллельных программ (онлайн) Addison-Wesley ISBN 0-201-57594-9 , глава 8 Интерфейс передачи сообщений 
  • Wijesuriya, Viraj Brian (2010-12-29) Daniweb: Пример кода для умножения матриц с использованием подхода параллельного программирования MPI
  • Использование серии MPI :
    • Гропп, Уильям; Ласк, Юинг; Скьеллум, Энтони (1994). Использование MPI: переносимое параллельное программирование с интерфейсом передачи сообщений . Кембридж, Массачусетс, США: Серия научных и инженерных вычислений MIT Press . ISBN 978-0-262-57104-3.
    • Гропп, Уильям; Ласк, Юинг; Скьеллум, Энтони (1999a). Использование MPI, 2-е издание: переносимое параллельное программирование с интерфейсом передачи сообщений . Кембридж, Массачусетс, США: Серия научных и инженерных вычислений MIT Press . ISBN 978-0-262-57132-6.
    • Гропп, Уильям; Ласк, Юинг; Скьеллум, Энтони (1999b). Использование MPI-2: Расширенные возможности интерфейса передачи сообщений . MIT Press . ISBN 978-0-262-57133-3.
    • Гропп, Уильям; Ласк, Юинг; Скьеллум, Энтони (2014). Использование MPI, 3-е издание: переносимое параллельное программирование с интерфейсом передачи сообщений . Кембридж, Массачусетс, США: Серия научных и инженерных вычислений MIT Press . ISBN 978-0-262-52739-2.
  • Гропп, Уильям; Ласк, Юинг; Скьеллум, Энтони (1996). «Высокопроизводительная портативная реализация интерфейса передачи сообщений MPI». Параллельные вычисления . 22 (6): 789–828. CiteSeerX  10.1.1.102.9485 . DOI : 10.1016 / 0167-8191 (96) 00024-5 .
  • Пачеко, Питер С. (1997) Параллельное программирование с MPI . [1] 500 стр. ISBN Моргана Кауфмана 1-55860-339-5 . 
  • MPI - Полная серия справочных материалов :
    • Снир, Марк; Отто, Стив У .; Хусс-Ледерман, Стивен; Уокер, Дэвид В .; Донгарра, Джек Дж. (1995) MPI: Полный справочник . MIT Press, Кембридж, Массачусетс, США. ISBN 0-262-69215-5 
    • Снир, Марк; Отто, Стив У .; Хусс-Ледерман, Стивен; Уокер, Дэвид В .; Донгарра, Джек Дж. (1998) MPI - Полная справка: Том 1, Ядро MPI . MIT Press, Кембридж, Массачусетс. ISBN 0-262-69215-5 
    • Гропп, Уильям; Хусс-Ледерман, Стивен; Ламсдэйн, Эндрю; Ласк, Юинг; Ницберг, Билл; Сапфир, Уильям; и Снир, Марк (1998) MPI - Полный справочник: Том 2, Расширения MPI-2 . MIT Press, Кембридж, Массачусетс ISBN 978-0-262-57123-4 
  • Фирузиаан, Мохаммад; Номменсен, О. (2002) Параллельная обработка через MPI и OpenMP , Linux Enterprise, 10/2002
  • Ваннески, Марко (1999) Парадигмы для научных вычислений В трудах Европейской школы вычислительной химии (1999, Перуджа, Италия), номер 75 в конспектах лекций по химии , страницы 170–183. Спрингер, 2000 г.
  • Bala, Bruck, Cypher, Elustondo, A Ho, CT Ho, Kipnis, Snir (1995) ″ Портативная и настраиваемая библиотека коллективной связи для масштабируемых параллельных компьютеров »в IEEE Transactions on Parallel and Distributed Systems, ″ vol. 6, no. 2 , pp. 154–164, февраль 1995 г.

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Официальный стандарт MPI-3.1 ( неофициальная версия HTML )
  • Интерфейс передачи сообщений в Curlie
  • Учебник по MPI: интерфейс передачи сообщений
  • Руководство пользователя MPI
  • Учебное пособие: Введение в MPI (для самостоятельного обучения, включает самотестирование и упражнения)