Jump to content

Интерфейс передачи сообщений

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

История [ править ]

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

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

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

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

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

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

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

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

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

Хотя 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 г.). [12] и вскоре после этого был завершен. Около 128 функций составляют стандарт MPI-1.3, который был выпущен как финальная версия серии MPI-1 в 2008 году. [13]

В настоящее время стандарт имеет несколько версий: версия 1.3 (обычно сокращенно MPI-1 ), в которой особое внимание уделяется передаче сообщений и имеет статическую среду выполнения, MPI-2.2 (MPI-2), которая включает в себя новые функции, такие как параллельный ввод-вывод, динамическое управление процессами и удаленные операции с памятью, [14] и MPI-3.1 (MPI-3), который включает расширения коллективных операций с неблокирующими версиями и расширения односторонних операций. [15] 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 часто сравнивают с параллельной виртуальной машиной (PVM), которая представляет собой популярную распределенную среду и систему передачи сообщений, разработанную в 1989 году и которая была одной из систем, обусловивших необходимость стандартной параллельной передачи сообщений. Модели программирования с поточной общей памятью (такие как Pthreads и OpenMP ) и программирование передачи сообщений (MPI/PVM) можно считать взаимодополняющими и время от времени использовались вместе, например, на серверах с несколькими большими узлами с общей памятью.

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

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

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

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

Концепции [ править ]

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

Коммуникатор [ править ]

Объекты Communicator соединяют группы процессов в сеансе 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 направлен на поддержку гетерогенных сред, в которых типы могут быть представлены по-разному на разных узлах. [16] (например, они могут использовать разные архитектуры ЦП с разным порядком байтов ), и в этом случае реализации MPI могут выполнять преобразование данных . [16] Поскольку язык C не позволяет передавать тип в качестве параметра, MPI заранее определяет константы. MPI_INT, MPI_CHAR, MPI_DOUBLE переписываться с int, char, double, и т. д.

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

int send_array[100];
int root = 0; /* or whatever */
int num_procs, *recv_array;
MPI_Comm_size(comm, &num_procs);
recv_array = malloc(num_procs * sizeof(send_array));
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), 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, &newtype);
MPI_Type_commit(&newtype);
MPI_Gather(array, 1, newtype, receive_array, 1, newtype, root, comm);

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

int MPI_Type_create_struct(int count,
                           int *blocklen,
                           MPI_Aint *disp,
                           MPI_Datatype *type,
                           MPI_Datatype *newtype)

где:

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

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

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

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

struct A {
    int f;
    short p;
};

struct B {
    struct A a;
    int pp, vp;
};

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

static const 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)
};
static MPI_Datatype type[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
MPI_Datatype newtype;
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
MPI_Type_commit(&newtype);

Концепции 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 — это альтернативный интерфейс, который позволяет различным создаваемым экземплярам быть разными двоичными файлами с разными аргументами. [20]

Я О /

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

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

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

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

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

ABI . реализаций MPI примерно разделен между производными MPICH и Open MPI , так что библиотека из одного семейства работает как замена библиотеки из того же семейства, но прямая замена между семействами невозможна Французский CEA поддерживает интерфейс-оболочку для облегчения таких переключений. [27]

Аппаратное обеспечение [ править ]

Исследования аппаратного обеспечения MPI сосредоточены на реализации MPI непосредственно в аппаратном обеспечении, например, посредством процессора в памяти , встраивая операции MPI в микросхемы микросхем ОЗУ в каждом узле. Подразумевается, что этот подход не зависит от языка, операционной системы и процессора, но его нельзя легко обновить или удалить.

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

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

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

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

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

Общеязыковая инфраструктура

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

Ява [ править ]

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

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

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

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

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

Для MPI существует языковая оболочка Julia . [35]

МАТЛАБ [ править ]

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

OCaml [ править ]

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

ПАРИ/GP [ править ]

PARI/GP может быть построен [38] использовать MPI в качестве многопоточного механизма, позволяющего запускать параллельные программы PARI и GP на кластерах MPI без изменений.

Питон [ править ]

Реализации MPI в Python включают: pyMPI , mpi4py, [39] пипар, [40] МОЯ МЕЧТА, [41] и подмодуль MPI в ScientificPython . pyMPI примечателен тем, что это вариант интерпретатора Python, тогда как pypar, MYMPI и модуль ScientificPython являются модулями импорта. Они возлагают на программиста задачу решить, куда следует обращаться. MPI_Init принадлежит.

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

Р [ править ]

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

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

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

/*
  "Hello World" MPI Test Program
*/
#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;

    /* Initialize the infrastructure necessary for communication */
    MPI_Init(&argc, &argv);

    /* Identify this process */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    /* Find out how many total processes are active */
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    /* Until this point, all programs have been doing exactly the same.
       Here, we check the rank to distinguish the roles of the programs */
    if (my_rank == 0) {
        int other_rank;
        printf("We have %i processes.\n", num_procs);

        /* Send messages to all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            sprintf(buf, "Hello %i!", other_rank);
            MPI_Send(buf, 256, MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD);
        }

        /* Receive messages from all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            MPI_Recv(buf, 256, MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("%s\n", buf);
        }

    } else {

        /* Receive message from process #0 */
        MPI_Recv(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        assert(memcmp(buf, "Hello ", 6) == 0);

        /* Send message to process #0 */
        sprintf(buf, "Process %i reporting for duty.", my_rank);
        MPI_Send(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD);

    }

    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
}

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

$ mpicc example.c && mpiexec -n 4 ./a.out
We have 4 processes.
Process 1 reporting for duty.
Process 2 reporting for duty.
Process 3 reporting for duty.

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

- Принятие 2 MPI

Принятие 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 вновь собрался в 2007 году, чтобы прояснить некоторые проблемы MPI-2 и изучить разработки для возможного MPI-3, в результате чего были созданы версии MPI-3.0 (сентябрь 2012 г.) и MPI-3.1 (июнь 2015 г.).

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

Астрофизик Джонатан Дурси написал статью, в которой назвал MPI устаревшим, указав на новые технологии, такие как язык Chapel , Unified Parallel C , Hadoop , Spark и Flink . [48] В то же время почти все проекты Exascale Computing Project основаны исключительно на MPI; В начале 2020-х годов было показано, что MPI масштабируется до самых больших машин, и многие считают, что он останется актуальным еще долгое время.

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

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

  1. ^ «Интерфейс передачи сообщений :: Высокопроизводительные вычисления» . hpc.nmsu.edu . Проверено 6 августа 2022 г.
  2. ^ Уокер Д.В. (август 1992 г.). Стандарты передачи сообщений в среде распределенной памяти (PDF) (Отчет). Национальная лаборатория Ок-Ридж, Теннесси (США), Центр исследований параллельных вычислений (CRPC). п. 25. ОСТИ   10170156 . ОРНЛ/ТМ-12147 . Проверено 18 августа 2019 г.
  3. ^ Форум MPI, КОРПОРАТИВНЫЙ (15–19 ноября 1993 г.). «MPI: интерфейс передачи сообщений». Материалы конференции ACM/IEEE 1993 года по суперкомпьютерам . Суперкомпьютеры '93 . Портленд, Орегон, США: ACM. стр. 878–883. дои : 10.1145/169627.169855 . ISBN  0-8186-4340-4 .
  4. ^ Нильсен, Франк (2016). «2. Введение в MPI: интерфейс передачи сообщений» . Введение в HPC с MPI для науки о данных . Спрингер. стр. 195–211. ISBN  978-3-319-21903-5 .
  5. ^ Гропп, Ласк и Скьеллум 1996 , стр. 3
  6. ^ Сур, Саянтан; Куп, Мэтью Дж.; Панда, Дхабалешвар К. (4 августа 2017 г.). «MPI и связь. Высокопроизводительный и масштабируемый MPI через InfiniBand с уменьшенным использованием памяти: углубленный анализ производительности». Материалы конференции ACM/IEEE 2006 г. по суперкомпьютингу - SC '06 . АКМ. п. 105. дои : 10.1145/1188455.1188565 . ISBN  978-0769527000 . S2CID   818662 .
  7. ^ KNEM: высокопроизводительная внутриузловая связь MPI «MPICH2 (начиная с версии 1.1.1) использует KNEM в DMA LMT для повышения производительности больших сообщений в пределах одного узла. Open MPI также включает поддержку KNEM в своем компоненте SM BTL, начиная с версии 1.5. Кроме того, NetPIPE включает в себя серверную часть KNEM, начиная с версии 3.7.2».
  8. ^ «Часто задаваемые вопросы: Настройка динамических характеристик связи MPI sm» . www.open-mpi.org .
  9. ^ https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en «Стандарт MPI-3 представляет другой подход к гибридному программированию, который использует новая модель общей памяти MPI (SHM)"
  10. ^ Общая память и MPI 3.0 «Можно запустить различные тесты, чтобы определить, какой метод лучше всего подходит для конкретного приложения, будь то использование MPI + OpenMP или расширений MPI SHM. В довольно простом тестовом примере ускорение по сравнению с базовой версией, которая использовалась, указывает на точечная связь была до 5 раз, в зависимости от сообщения».
  11. ^ Использование общей памяти MPI-3 в качестве многоядерной системы программирования (слайды презентации в формате PDF)
  12. ^ Оглавление — сентябрь 1994 г., 8 (3-4) . HPc.sagepub.com. Проверено 24 марта 2014 г.
  13. ^ Документы MPI . Mpi-forum.org. Проверено 24 марта 2014 г.
  14. ^ Гропп, Ласк и Скьеллум 1999b , стр. 4–5
  15. ^ MPI: стандарт интерфейса передачи сообщений
    Версия 3.1, Форум интерфейса передачи сообщений, 4 июня 2015
    г. http://www.mpi-forum.org . Проверено 16 июня 2015 г.
  16. ^ Jump up to: Перейти обратно: а б «Правила сопоставления типов» . mpi-forum.org .
  17. ^ «Справочная страница MPI_Gather(3) (версия 1.8.8)» . www.open-mpi.org .
  18. ^ «MPI_Get_address» . www.mpich.org .
  19. ^ Обоснование механизма скелета/контента Boost.MPI (графики сравнения производительности были созданы с использованием NetPIPE )
  20. ^ Gropp, Lusk & Skjelling 1999b , стр. 7.
  21. ^ Gropp, Lusk & Skjelling 1999b , стр. 5–6.
  22. ^ «Разреженное матрично-векторное умножение с использованием библиотеки ввода-вывода MPI» (PDF) .
  23. ^ «Просеивание данных и коллективный ввод-вывод в ROMIO» (PDF) . IEEE. февраль 1999 года.
  24. ^ Чен, Юн; Сунь, Сянь-Хе; Тхакур, Раджив; Рот, Филип К.; Гропп, Уильям Д. (сентябрь 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 .
  25. ^ Тенг Ван; Кевин Васко; Чжо Лю; Хуэй Чен; Вэйкуань Ю (2016). «Расширение возможностей параллельного ввода-вывода с помощью перекрестной агрегации». Международный журнал приложений для высокопроизводительных вычислений . 30 (2): 241–256. дои : 10.1177/1094342015618017 . S2CID   12067366 .
  26. ^ Ван, Дэн; Васько, Кевин; Лю, Чжо; Чен, Хуэй; Ю, Вэйкуань (ноябрь 2014 г.). «BPAR: платформа параллельного агрегирования на основе пакетов для разделенного выполнения ввода-вывода». 2014 Международный семинар по масштабируемым вычислительным системам с интенсивным использованием данных . IEEE. стр. 25–32. дои : 10.1109/DISCS.2014.6 . ISBN  978-1-4673-6750-9 . S2CID   2402391 .
  27. ^ цеа-hpc. «cea-hpc/wi4mpi: интерфейс оболочки для MPI» . Гитхаб .
  28. ^ мпкк . Mpicch.org. Проверено 24 марта 2014 г.
  29. ^ Чистый Mpi.NET
  30. ^ «MPI.NET: Высокопроизводительная библиотека C# для передачи сообщений» . www.osl.iu.edu .
  31. ^ «Домашняя страница mpiJava» . www.hpjava.org .
  32. ^ «Введение в API mpiJava» . www.hpjava.org .
  33. ^ «Спецификация MPJ API» . www.hpjava.org .
  34. ^ «Проект MPJ Экспресс» . mpj-express.org .
  35. ^ JuliaParallel/MPI.jl , Parallel Julia, 03 октября 2019 г. , получено 8 октября 2019 г.
  36. ^ «Ксавье Лерой — Программное обеспечение» . cristal.inria.fr .
  37. ^ Архив списка рассылки Caml> Сообщение от Ярона М. Мински . Caml.inria.fr (15 июля 2003 г.). Проверено 24 марта 2014 г.
  38. ^ «Введение в параллельный GP» (PDF) . pari.math.u-bordeaux.fr .
  39. ^ «Архив кода Google — долгосрочное хранилище для хостинга проектов Google Code» . code.google.com .
  40. ^ «Архив кода Google — долгосрочное хранилище для хостинга проектов Google Code» . code.google.com .
  41. ^ Теперь часть Pydusa
  42. ^ «История изменений Boost.MPI» . www.boost.org .
  43. ^ «Привязки Python — 1.35.0» . www.boost.org .
  44. ^ «0006498: В пакете boost-*mpi-python отсутствует модуль Python — система отслеживания ошибок CentOS» . bugs.centos.org .
  45. ^ Ю, Хао (2002). «Rmpi: параллельные статистические вычисления в R» . Р Новости .
  46. ^ Чен, Вэй-Чен; Остроухов, Георгий; Шмидт, Дрю; Патель, Прагнешкумар; Ю, Хао (2012). «pbdMPI: Программирование с большими данными — интерфейс для MPI» .
  47. ^ Выходной фрагмент был создан в обычной настольной системе Linux с установленным Open MPI. Дистрибутивы обычно помещают команду mpicc в пакет openmpi-devel или libopenmpi-dev и иногда требуют запуска «module add mpi/openmpi-x86_64» или аналогичного, прежде чем mpicc и mpiexec станут доступны.
  48. ^ «HPC умирает, и MPI убивает его» . www.dursi.ca .

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

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 509d37b76176ecdbabfc8aa6f52586ed__1716457920
URL1:https://arc.ask3.ru/arc/aa/50/ed/509d37b76176ecdbabfc8aa6f52586ed.html
Заголовок, (Title) документа по адресу, URL1:
Message Passing Interface - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)