Microsoft mpi что это за программа и нужна ли она

FindMPI

Поиск реализации интерфейса передачи сообщений (MPI).

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

Новое в версии 3.10:Значительная переработка модуля:множество новых переменных,компоненты для каждого языка,поддержка более широкого спектра систем исполнения.

Переменные для использования MPI

Модуль подвергает компоненты C , CXX , MPICXX и Fortran . Каждый из них управляет различными языками MPI для поиска. Разница между CXX и MPICXX является то , что CXX относится к API MPI — C будучи пригодными для использования C ++, тогда как MPICXX относится к MPI-2 C ++ API , который был удален снова в MPI-3.

В зависимости от включенных компонентов будут установлены следующие переменные:

Создание проекта VisualStudio с поддержкой MPI

Переменная, указывающая, что были найдены настройки MPI для всех запрошенных языков. Если компоненты не указаны, это верно, если были обнаружены настройки MPI для всех включенных языков. Обратите внимание, что компонент MPICXX не влияет на эту переменную.

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

Этот модуль устанавливает следующие переменные для каждого языка в вашем проекте, где — это одна из C, CXX или Fortran:

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

MPI-компилятор для , если такая программа существует.

Опции компиляции для программ MPI в , заданные как ;-list .

Определения компиляции для программ MPI в , заданные как ;-list .

Включите путь(ы)для заголовка MPI.

Флаги компоновки для MPI-программ.

Все библиотеки для связи MPI программ с.

Новое в версии 3.9: Дополнительно определены следующие IMPORTED цели:

Цель для использования MPI из .

Будут определены следующие переменные,указывающие,какие из них присутствуют:

Переменная,указывающая на наличие креплений MPI-2 C++(введено в MPI-2,удалено с помощью MPI-3).

True, если доступен заголовок Fortran 77 mpif.h

Истинно, если для доступа к MPI можно использовать mpi модуля Fortran 90 (только MPI-2 и выше).

Истинно, если Fortran 2008 mpi_f08 доступен для программ MPI (только MPI-3 и выше).

По возможности,версия MPI будет определяться этим модулем.Средства определения версии MPI были введены в MPI-1.2,и поэтому не могут быть найдены для более старых версий MPI.

Основная версия MPI, реализованная для дистрибутивом MPI.

Незначительная версия MPI, реализованная для дистрибутивом MPI.

Версия MPI, реализованная для дистрибутивом MPI.

Обратите внимание, что нет переменной для привязок C, доступных через mpi.h , поскольку стандарты MPI всегда требовали, чтобы эта привязка работала как в коде C, так и в коде C ++.

Установка, настройка и запуск программ средствами MPI в Visual Studio 2019

Для запуска MPI-программ модуль устанавливает следующие переменные

Исполняется для запуска MPI-программ,если таковые существуют.

Флаг для передачи в mpiexec перед указанием количества процессоров для запуска.

Количество используемых MPI-процессоров.По умолчанию-количество процессоров,обнаруженных в хост-системе.

Флаги для передачи в mpiexec непосредственно перед запуском исполняемого файла.

Флаги для передачи в mpiexec после других флагов.

Переменные для определения местоположения MPI

Этот модуль выполняет четырехступенчатый поиск реализации MPI:

  1. Найдите MPIEXEC_EXECUTABLE и, если он найден, используйте его базовый каталог.
  2. Проверьте, имеет ли компилятор встроенную поддержку MPI. Это тот случай, если пользователь передал оболочку компилятора как CMAKE__COMPILER или если он использует оболочки системного компилятора Cray.
  3. Попробуйте найти обертку MPI-компилятора и определить по ней информацию о компиляторе.
  4. Попробуйте найти MPI реализацию,которая не поставляет такую обертку,угадав настройки.В настоящее время поддерживаются только Microsoft MPI и MPICH2 на Windows.

Для управления шагом MPIEXEC_EXECUTABLE могут быть установлены следующие переменные:

Вручную укажите расположение mpiexec .

Укажите базовый каталог установки MPI.

Переменная окружения для указания базового каталога установки MPI.

Переменная окружения для указания базового каталога установки MPI.

Для управления шагом обертки компилятора можно задать следующие переменные:

Найдите указанную обертку компилятора и используйте ее.

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

Используется для инициализации MPI__COMPILER_FLAGS , если не указан флаг для конкретного языка. Пусто по умолчанию.

Суффикс, который добавляется ко всем именам, которые ищутся. Например, вы можете установить это значение в .mpich или .openmpi , чтобы предпочитать одно или другое в Debian и его производных.

Для управления шагом отгадывания можно установить следующую переменную:

Допустимые значения: MSMPI и MPICH2 . Если установлено, будет выполняться поиск только в указанной библиотеке. По умолчанию MSMPI будет предпочтительнее MPICH2 , если оба доступны. Это также устанавливает для MPI_SKIP_COMPILER_WRAPPER значение true , которое может быть переопределено.

Каждый из этапов поиска можно пропустить с помощью следующих управляющих переменных:

Если это так,модуль предполагает,что компилятор сам по себе не предоставляет реализацию MPI и пропускает этап 2.

Если верно,то обертка компилятора не будет искаться.

Если это правда,шаг догадки будет пропущен.

Кроме того,для изменения поведения поиска доступна следующая управляющая переменная:

Добавьте некоторые определения,которые отключат привязки MPI-2 C++.В настоящее время поддерживаются MPICH,Open MPI,Platform MPI и их производные,например MVAPICH или Intel MPI.

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

Если всех этих параметров было недостаточно для поиска правильной реализации MPI, пользователь может отключить весь процесс автоопределения, указав как список библиотек в MPI__LIBRARIES ,так и список включаемых каталогов в MPI__ADDITIONAL_INCLUDE_DIRS . Любая другая переменная может быть установлена ​​в дополнение к этим двум. Затем модуль проверит настройки MPI и сохранит настройки в кеше.

Переменные кэша для MPI

Переменная MPI__INCLUDE_DIRS будет собрана из следующих переменных. Для C и CXX:

Расположение заголовка mpi.h на диске.

Расположение заголовка Fortran 77 mpif.h , если он существует.

Местонахождение mpi или mpi_f08 модулей, если таковые имеются.

Для всех языков дополнительно рассматриваются следующие переменные:

;-список путей , необходимых в дополнение к обычным включаемым каталогам.

Переменные пути для включаемых папок, на которые ссылается .

;-список < , которые будут добавлены к местам включения < .

Переменная MPI__LIBRARIES будет собрана из следующих переменных:

Расположение библиотеки с именем для использования с MPI.

; -список < lib_name , который будет добавлен во включаемые местоположения < .

Использование спиексека

При использовании MPIEXEC_EXECUTABLE для выполнения приложений MPI обычно следует использовать все флаги MPIEXEC_EXECUTABLE следующим образом:

$ $ $ $ EXECUTABLE $ ARGS

где EXECUTABLE — программа MPI, а ARGS — аргументы для передачи программе MPI.

Расширенные переменные для использования MPI

Модуль может выполнять некоторые расширенные детекции функций по конкретному запросу.

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

Если следующие переменные будут установлены в true,то будет выполнен соответствующий поиск:

Определите для всех доступных Фортрана привязок , что значения MPI_SUBARRAYS_SUPPORTED и MPI_ASYNC_PROTECTS_NONBLOCKING являются и сделать их значения доступны MPI_Fortran__SUBARRAYS и MPI_Fortran__ASYNCPROT , где является одним из F77_HEADER , F90_MODULE и F08_MODULE .

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

Backward Compatibility

Утратил силу с версии 3.10.

Читайте также:
Пиньинь что это за программа

Для обратной совместимости с более старыми версиями FindMPI эти переменные установлены:

MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS MPI_LIBRARIES

В новых проектах, пожалуйста, используйте MPI__XXX . Кроме того, следующие переменные устарели:

MPI__COMPILE_OPTIONS используйте MPI_ _COMPILE_OPTIONS и MPI__COMPILE_DEFINITIONS .

Для использования используйте MPI__INCLUDE_DIRS , а для указания папок используйте MPI__ADDITIONAL_INCLUDE_DIRS .

MPIEXEC_EXECUTABLE этого используйте MPIEXEC_EXECUTABLE .

Источник: runebook.dev

Лабораторная работа №1 Принципы работы mpi в операционной системе Windows

Цель работы: Получить представление о MPI-программах.

Получить навыки конфигурирования программы MPICH2.

Краткая теория

MPI (Message Passing Interface) — ин­тер­фейс об­ме­на со­об­ще­ни­я­ми (ин­фор­ма­ци­ей) меж­ду од­но­вре­мен­но ра­бо­таю­щи­ми вы­чис­ли­тель­ны­ми про­цес­са­ми. Он ши­ро­ко ис­поль­зу­ет­ся для со­зда­ния па­ра­л­лель­ных про­грамм для вы­чис­ли­тель­ных си­стем с рас­пре­де­лён­ной па­мя­тью (кла­сте­ров).

MPICH — са­мая из­ве­ст­ная реа­ли­за­ция MPI, со­здан­ная в Ара­гон­ской на­цио­наль­ной ла­бо­ра­то­рии (США). Су­ще­ству­ют вер­сии этой биб­лио­те­ки для всех по­пу­ляр­ных опе­ра­ци­он­ных си­стем. К то­му же, она бес­плат­на. Пе­ре­чис­лен­ные фак­то­ры де­ла­ют MPICH иде­аль­ным ва­ри­ан­том для то­го, что­бы на­чать прак­ти­че­ское освое­ние MPI.

В дан­ной лабораторной работе речь пой­дёт об MPICH2. Двой­ка в на­зва­нии — это не вер­сия про­граммно­го обес­пе­че­ния, а но­мер то­го стан­дар­та MPI, ко­то­рый реа­ли­зо­ван в биб­лио­те­ке. MPICH2 со­от­вет­ству­ет стан­дар­ту MPI 2.0, от­сю­да и на­зва­ние.

MPICH2 — это быст­ро­дей­ствую­щая и ши­ро­ко пор­ти­ру­е­мая реа­ли­за­ция стан­др­та MPI (реа­ли­зо­ва­ны оба стан­дар­та MPI-1 и MPI-2). Це­ли со­зда­ния MPICH2 сле­дую­щие:

  1. Предо­ста­вить реа­ли­за­цию MPI, ко­то­рая эф­фек­тив­но под­дер­жи­ва­ет раз­лич­ные вы­чис­ли­тель­ные и ком­му­ни­ка­ци­он­ные плат­фор­мы, вклю­чая об­ще­до­ступ­ные кла­сте­ры (на­столь­ные си­сте­мы, си­сте­мы с об­щей па­мя­тью, мно­го­ядер­ные ар­хи­тек­ту­ры), вы­со­ко­ско­ро­ст­ные се­ти (Ethernet 10 ГБит/с, InfiniBand, Myrinet, Quadrics) и экс­клю­зив­ные вы­чис­ли­тель­ные си­сте­мы (Blue Gene, Cray, SiCortex).
  2. Сде­лать воз­мож­ны­ми пе­ре­до­вые ис­сле­до­ва­ния тех­но­ло­гии MPI с по­мо­щью лег­ко рас­ши­ря­е­мой мо­дуль­ной ст­рук­ту­ры для со­зда­ния про­из­вод­ных реа­ли­за­ций.

В нашем случае мы имеем кластер из 9 машин (вы­чис­ли­тель­ны­х уз­лов), ра­бо­таю­щих под управ­ле­ни­ем Microsoft Windows. Для учеб­ных це­лей мож­но за­пус­кать все вы­чис­ли­тель­ные про­цес­сы и на од­ном ком­пью­те­ре. Ес­ли ком­пью­тер од­но­ядер­ный, то, ес­те­ствен­но, при­ро­ста быст­ро­дей­ствия вы не по­лу­чи­те, — толь­ко за­мед­ле­ние.

В ка­че­стве сре­ды раз­ра­бот­ки можно ис­поль­зо­вать Visual Studio 2005 .. 2008 или Dev C++. Для удоб­ства из­ло­же­ния со­здан­ную ва­ми про­грам­му, ис­поль­зу­ю­щую MPI, и пред­на­зна­чен­ную для за­пус­ка на не­сколь­ких вы­чис­ли­тель­ных уз­лах, бу­дем на­зы­вать MPI-про­грам­мой.

Прин­ци­пы ра­бо­ты mpich

Начнем из­ло­же­ние материала о программе MPICH2, с прин­ци­пов её ра­бо­ты.

MPICH для Microsoft Windows со­сто­ит из сле­дую­щих ком­по­нен­тов:

  • Ме­не­джер про­цес­сов smpd.exe, ко­то­рый пред­став­ля­ет со­бой си­стем­ную служ­бу (сер­вис­ное при­ло­же­ние). Ме­не­джер про­цес­сов ве­дёт спи­сок вы­чис­ли­тель­ных уз­лов си­сте­мы, и за­пус­ка­ет на этих уз­лах MPI-про­грам­мы, предо­став­ляя им не­об­хо­ди­мую ин­фор­ма­цию для ра­бо­ты и об­ме­на со­об­ще­ни­я­ми.
  • За­го­ло­воч­ные фай­лы (.h) и биб­лио­те­ки ста­дии ком­пи­ля­ции (.lib), не­об­хо­ди­мые для раз­ра­бот­ки MPI-про­грамм.
  • Биб­лио­те­ки вре­ме­ни вы­пол­не­ния (.dll), не­об­хо­ди­мые для ра­бо­ты MPI-про­грамм.
  • До­пол­ни­тель­ные ути­ли­ты (.exe), не­об­хо­ди­мые для на­строй­ки MPICH и за­пус­ка MPI-про­грамм.

Все ком­по­нен­ты, кро­ме биб­лио­тек вре­ме­ни вы­пол­не­ния, уста­нав­ли­ва­ют­ся по умол­ча­нию в пап­ку C:Program FilesMPICH2; dll-биб­лио­те­ки уста­нав­ли­ва­ют­ся в C:WindowsSystem32.

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

Ме­не­джер ра­бо­та­ет в фо­но­вом ре­жи­ме и ждёт за­про­сов к не­му из се­ти со сто­ро­ны «го­лов­но­го» ме­не­дже­ра про­цес­сов (по умол­ча­нию ис­поль­зу­ет­ся се­те­вой порт 8676). Что­бы как-то обезопа­сить се­бя от ха­ке­ров и ви­ру­сов, ме­не­джер тре­бу­ет па­роль при об­ра­ще­нии к не­му. Ко­гда один ме­не­джер про­цес­сов об­ра­ща­ет­ся к дру­го­му ме­не­дже­ру про­цес­сов, он пе­ре­да­ёт ему свой па­роль.

Ри­с. 1.1. Схе­ма ра­бо­ты MPICH на кла­сте­ре.

В со­вре­мен­ных кла­сте­рах «сеть пе­ре­да­чи дан­ных» обыч­но от­де­ля­ет­ся от «управ­ляю­щей се­ти»

За­пуск MPI-про­грам­мы про­из­во­дит­ся сле­дую­щим об­ра­зом

(смот­ри­те ри­с. 1.1.):

  1. Поль­зо­ватель с по­мо­щью про­грам­мы Mpirun (или Mpiexec, при ис­поль­зо­ва­нии MPICH2 под Microsoft Windows) ука­зы­ва­ет имя ис­пол­ня­е­мо­го фай­ла MPI-про­грам­мы и тре­бу­е­мое чис­ло про­цес­сов. Кро­ме то­го, мож­но ука­зать имя поль­зо­ва­те­ля и па­роль: про­цес­сы MPI-про­грам­мы бу­дут за­пус­кать­ся от име­ни это­го поль­зо­ва­те­ля.
  2. Mpirun пе­ре­да­ёт све­де­ния о за­пус­ке ло­каль­но­му ме­не­дже­ру про­цес­сов, у ко­то­ро­го име­ет­ся спи­сок до­ступ­ных вы­чис­ли­тель­ных уз­лов.
  3. Ме­не­джер про­цес­сов об­ра­ща­ет­ся к вы­чис­ли­тель­ным уз­лам по спис­ку, пе­ре­да­вая за­пу­щен­ным на них ме­не­дже­рам про­цес­сов ука­за­ния по за­пус­ку MPI-про­грам­мы.
  4. Ме­не­дже­ры про­цес­сов за­пус­ка­ют на вы­чис­ли­тель­ных уз­лах не­сколь­ко ко­пий MPI-про­грам­мы (воз­мож­но, по не­сколь­ко ко­пий на каж­дом уз­ле), пе­ре­да­вая про­грам­мам не­об­хо­ди­мую ин­фор­ма­цию для свя­зи друг с дру­гом.

Очень важ­ным мо­мен­том здесь яв­ля­ет­ся то, что пе­ред за­пус­ком MPI-про­грам­ма не ко­пи­ру­ет­ся ав­то­ма­ти­че­ски на вы­чис­ли­тель­ные уз­лы кла­сте­ра. Вме­сто это­го ме­не­джер про­цес­сов пе­ре­да­ёт уз­лам путь к ис­пол­ня­е­мо­му фай­лу про­грам­мы точ­но в том ви­де, в ко­то­ром поль­зо­ватель ука­зал этот путь про­грам­ме Mpirun. Это озна­ча­ет, что ес­ли, на­при­мер, за­пус­тить про­грам­му C:proga.exe, то все ме­не­дже­ры про­цес­сов на вы­чис­ли­тель­ных уз­лах бу­дут пы­тать­ся за­пу­стить файл C:proga.exe. Ес­ли хо­тя бы на од­ном из уз­лов та­ко­го фай­ла не ока­жет­ся, про­изой­дёт ошиб­ка за­пус­ка MPI-про­грам­мы.

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

Ра­бо­та MPI-про­грам­мы про­ис­хо­дит сле­дую­щим об­ра­зом:

  1. Про­грам­ма за­пус­ка­ет­ся и ини­циа­ли­зи­ру­ет биб­лио­те­ку вре­ме­ни вы­пол­не­ния MPICH пу­тём вы­зо­ва функ­ции MPI_Init.
  2. Биб­лио­те­ка по­лу­ча­ет от ме­не­дже­ра про­цес­сов ин­фор­ма­цию о ко­ли­че­стве и ме­сто­по­ло­же­нии дру­гих про­цес­сов про­грам­мы, и уста­нав­ли­ва­ет с ни­ми связь.
  3. По­сле это­го за­пу­щен­ные ко­пии про­грам­мы мо­гут об­ме­ни­вать­ся друг с дру­гом ин­фор­ма­ци­ей по­сред­ством биб­лио­те­ки MPICH. С точ­ки зре­ния опе­ра­ци­он­ной си­сте­мы биб­лио­те­ка яв­ля­ет­ся ча­стью про­грам­мы (ра­бо­та­ет в том же про­цес­се), по­это­му мож­но счи­тать, что за­пу­щен­ные ко­пии MPI-про­грам­мы об­ме­ни­ва­ют­ся дан­ны­ми на­пря­мую друг с дру­гом, как лю­бые дру­гие при­ло­же­ния, пе­ре­даю­щие дан­ные по се­ти.
  4. Кон­соль­ный ввод-вы­вод всех про­цес­сов MPI-про­грам­мы пе­ре­на­прав­ля­ет­ся на кон­соль, на ко­то­рой за­пу­ще­на Mpirun. Пе­ре­на­прав­ле­ни­ем вво­да-вы­во­да за­ни­ма­ют­ся ме­не­дже­ры про­цес­сов, так как имен­но они за­пу­сти­ли ко­пии MPI-про­грам­мы, и по­это­му мо­гут по­лу­чить до­ступ к по­то­кам вво­да-вы­во­да про­грамм.
  5. Пе­ред за­вер­ше­ни­ем все про­цес­сы вы­зы­ва­ют функ­цию MPI_Finalize, ко­то­рая кор­рект­но за­вер­ша­ет пе­ре­да­чу и при­ём всех со­об­ще­ний, и от­клю­ча­ет MPICH.

Все опи­сан­ные вы­ше прин­ци­пы дей­ству­ют, да­же ес­ли за­пустить

MPI-про­грам­му на од­ном ком­пью­те­ре.

Источник: studfile.net

Обмен данными с использованием MPI. Работа с библиотекой MPI на примере Intel® MPI Library

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

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

MPI (Message Passing Interface)

MPI — интерфейс передачи сообщений между процессами, выполняющими одну задачу. Он предназначен, в первую очередь, для систем с распределенной памятью (MPP) в отличие от, например, OpenMP. Распределенная (кластерная) система, как правило, представляет собой набор вычислительных узлов, соединенных высокопроизводительными каналами связи (например, InfiniBand).

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

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

Основная операция в MPI — это передача сообщений. В MPI реализованы практически все основные коммуникационные шаблоны: двухточечные (point-to-point), коллективные (collective) и односторонние (one-sided).

Работа с MPI

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

Настройка кластерного окружения

Для экспериментов нам понадобится пара вычислительный узлов (желательно со схожими характеристиками). Если под руками нет двух серверов, всегда можно воспользоваться cloud-сервисами.

Читайте также:
Omlet чат что это за программа на Андроид

Для демонстрации я выбрал сервис Amazon Elastic Compute Cloud (Amazon EC2). Новым пользователям Amazon предоставляет пробный год бесплатного использования серверами начального уровня.

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

Создаем два рабочих виртуальных сервера. В консоли управления выбираем EC2 Virtual Servers in the Cloud, затем Launch Instance (под «Instance» подразумевается экземпляр виртуального сервера).

Следующим шагом выбираем операционную систему. Intel MPI Library поддерживает как Linux, так и Windows. Для первого знакомства с MPI выберем OC Linux. Выбираем Red Hat Enterprise Linux 6.6 64-bit или SLES11.3/12.0.
Выбираем Instance Type (тип сервера). Для экспериментов нам подойдет t2.micro (1 vCPUs, 2.5 GHz, Intel Xeon processor family, 1 GiB оперативной памяти). Как недавно зарегистрировавшемуся пользователю, мне такой тип можно было использовать бесплатно — пометка «Free tier eligible». Задаем Number of instances: 2 (количество виртуальных серверов).

После того, как сервис предложит нам запустить Launch Instances (настроенные виртуальные сервера), сохраняем SSH-ключи, которые понадобятся для связи с виртуальными серверами извне. Состояние виртуальных серверов и IP адреса для связи с серверами локального компьютера можно отслеживать в консоли управления.

Важный момент: в настройках Network

  • Берем содержимое публичного ключа (файл с расширением .pub) с одного сервера и добавляем его в файл $HOME/.ssh/authorized_keys на другом сервере;
  • Проделаем эту процедуру для обоих серверов;
  • Попробуем присоединиться по SSH с одного сервера на другой и обратно, чтобы проверить корректность настройки SSH. При первом соединении может потребоваться добавить публичный ключ удаленного хоста в список $HOME/.ssh/known_hosts.
  • Настройка MPI библиотеки

    Итак, рабочее окружение настроено. Время установить MPI.
    В качестве демонстрационного варианта возьмем 30-дневную trial-версию Intel MPI Library (~300МБ). При желании можно использовать другие реализации MPI, например, MPICH. Последняя доступная версия Intel MPI Library на момент написания статьи 5.0.3.048, ее и возьмем для экспериментов.

    Установим Intel MPI Library, следуя инструкциям встроенного инсталлятора (могут потребоваться привилегии суперпользователя).

    $ tar xvfz l_mpi_p_5.0.3.048.tgz
    $ cd l_mpi_p_5.0.3.048
    $ ./install.sh

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

    Для компиляции демонстрационной MPI-программы воспользуемся GNU C компилятором (gcc).
    В стандартном наборе программ RHEL образа от Amazon его нет, поэтому необходимо его установить:

    $ sudo yum install gcc

    В качестве демонстрационной MPI-программы возьмем test.c из стандартного набора примеров Intel MPI Library (находится в папке intel/impi/5.0.3.048/test).
    Для его компиляции первым шагом выставляем Intel MPI Library окружение:

    $. /home/ec2-user/intel/impi/5.0.3.048/intel64/bin/mpivars.sh

    Далее компилируем нашу тестовую программу с помощью скрипта из состава Intel MPI Library (все необходимые MPI зависимости при компиляции будут выставлены автоматически):

    $ cd /home/ec2-user/intel/impi/5.0.3.048/test
    $ mpicc -o test.exe ./test.c

    Полученный test.exe копируем на второй узел:

    $ scp test.exe ip-172-31-47-24:/home/ec2-user/intel/impi/5.0.3.048/test/

    Прежде чем выполнять запуск MPI-программы, полезно будет сделать пробный запуск какой-нибудь стандартной Linux утилиты, например, ‘hostname’:

    $ mpirun -ppn 1 -n 2 -hosts ip-172-31-47-25,ip-172-31-47-24 hostname
    ip-172-31-47-25
    ip-172-31-47-24

    Утилита ‘mpirun’ — это программа из состава Intel MPI Library, предназначенная для запуска MPI-приложений. Это своего рода «запускальщик». Именно эта программа отвечает за запуск экземляра MPI-программы на каждом из узлов, перечисленных в ее аргументах.

    Касательно опций, ‘-ppn’ — количество запускаемых процессов на каждый узел, ‘-n’ — общее число запускаемых процессов, ‘-hosts’ — список узлов, где будет запущено указанное приложение, последний аргумент — путь к исполняемому файлу (это может быть и приложение без MPI).

    В нашем примере с запуском утилиты hostname мы должны получить ее вывод (название вычислительного узла) с обоих виртуальных серверов, тогда можно утверждать, что менеджер MPI-процессов работает корректно.

    «Hello World» с использованием MPI

    В качестве демонстрационного MPI-приложения мы взяли test.c из стандартного набора примеров Intel MPI Library.

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

    Рассмотрим подробнее основные составляющие типичной MPI-программы.

    #include «mpi.h»

    Подключение заголовочного файла mpi.h, который содержит объявления основных MPI-функций и констант.
    Если для компиляции нашего приложения мы используем специальные скрипты из состава Intel MPI Library (mpicc, mpiicc и т.д.), то путь до mpi.h прописывается автоматически. В противном случае, путь до папки include придется задать при компиляции.

    MPI_Init (argv); . MPI_Finalize ();

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

    Чтобы описать остальные части нашей MPI-программы необходимо рассмотреть основные термины используемые в MPI-программировании.

    MPI-программа — это набор процессов, которые могут посылать друг другу сообщения посредством различных MPI-функций. Каждый процесс имеет специальный идентификатор — ранг (rank). Ранг процесса может использоваться в различных операциях посылки MPI-сообщений, например, ранг можно указать в качестве идентификатора получателя сообщения.

    Кроме того в MPI существуют специальные объекты, называемые коммуникаторами (communicator), описывающие группы процессов. Каждый процесс в рамках одного коммуникатора имеет уникальный ранг. Один и тот же процесс может относиться к разным коммуникаторам и, соответственно, может иметь разные ранги в рамках разных коммуникаторов. Каждая операция пересылки данных в MPI должна выполняться в рамках какого-то коммуникатора. По умолчанию всегда создается коммуникатор MPI_COMM_WORLD, в который входят все имеющиеся процессы.

    Вернемся к test.c:

    MPI_Comm_size (MPI_COMM_WORLD, MPI_Comm_rank (MPI_COMM_WORLD,

    MPI_Comm_size() вызов запишет в переменную size (размер) текущего MPI_COMM_WORLD коммуникатора (общее количество процессов, которое мы указали с mpirun опцией ‘-n’).
    MPI_Comm_rank() запишет в переменную rank (ранг) текущего MPI-процесса в рамках коммуникатора MPI_COMM_WORLD.

    MPI_Get_processor_name (name,

    Вызов MPI_Get_processor_name() запишет в переменную name строковой идентификатор (название) вычислительного узла, на котором был запущен соответствующий процесс.

    Собранная информация (ранг процесса, размерность MPI_COMM_WORLD, название процессора) далее посылается со всех ненулевых рангов на нулевой с помощью функции MPI_Send():

    MPI_Send ( MPI_Send ( MPI_Send ( MPI_Send (name, namelen + 1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);

    MPI_Send() функция имеет следующий формат:

    MPI_Send(buf, count, type, dest, tag, comm)
    buf — адрес буфера памяти, в котором располагаются пересылаемые данные;
    count — количество элементов данных в сообщении;
    type — тип элементов данных пересылаемого сообщения;
    dest — ранг процесса-получателя сообщения;
    tag — специальный тег для идентификации сообщений;
    comm — коммуникатор, в рамках которого выполняется посылка сообщения.

    Более подробное описание функции MPI_Send() и ее аргументов, а также других MPI-функций можно найти в MPI-стандарте (язык документации — английский).

    На нулевом ранге принимаются сообщения, посланные остальными рангами, и печатаются на экран:

    printf («Hello world: rank %d of %d running on %sn», rank, size, name); for (i = 1; i

    Для наглядности нулевой ранг дополнительно печатает свои данные наподобие тех, что он принял с удаленных рангов.

    MPI_Recv() функция имеет следующий формат:

    MPI_Recv(buf, count, type, source, tag, comm, status)
    buf, count, type — буфер памяти для приема сообщения;
    source — ранг процесса, от которого должен быть выполнен прием сообщения;
    tag — тег принимаемого сообщения;
    comm — коммуникатор, в рамках которого выполняется прием данных;
    status — указатель на специальную MPI-структуру данных, которая содержит информацию о результате выполнения операции приема данных.

    В данной статье мы не будем углубляться в тонкости работы функций MPI_Send()/MPI_Recv(). Описание различных типов MPI-операций и тонкостей их работы — тема отдельной статьи. Отметим только, что нулевой ранг в нашей программе будет принимать сообщения от других процессов строго в определенной последовательности, начиная с первого ранга и по нарастающей (это определяется полем source в функции MPI_Recv(), которое изменяется от 1 до size).

    Описанные функции MPI_Send()/MPI_Recv() — это пример так называемых двухточечных (point-to-point) MPI-операций. В таких операциях один ранг обменивается сообщениями с другим в рамках определенного коммуникатора. Существуют также коллективные (collective) MPI-операции, в которых в обмене данными могут участвовать более двух рангов. Коллективные MPI-операции — это тема для отдельной (и, возможно, не одной) статьи.

    Читайте также:
    Средство dxdiag обнаружило что при последнем запуске этой программы при доступе к системная

    В результате работы нашей демонстрационной MPI-программы мы получим:

    $ mpirun -ppn 1 -n 2 -hosts ip-172-31-47-25,ip-172-31-47-24 /home/ec2-user/intel/impi/5.0.3.048/test/test.exe
    Hello world: rank 0 of 2 running on ip-172-31-47-25
    Hello world: rank 1 of 2 running on ip-172-31-47-24

    Вас заинтересовало рассказанное в этом посте и вы хотели бы принять участие в развитии технологии MPI? Команда разработчиков Intel MPI Library (г.Нижний Новгород) в данный момент активно ищет инженеров-соратников. Дополнительную информацию можно посмотреть на официальном сайте компании Intel и на сайте BrainStorage.

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

    Источник: habr.com

    Основные функции MPI и пример простейшей программы

    Приветствую всех в третьей статье посвященной параллельному программированию с помощью библиотеки MPICH. В прошлых сериях мы научились устанавливать MPI в Linux Ubuntu и заставили Eclipse понимать код библиотеки. Наконец пришло время взяться за программирование. А какую программу должен написать каждый уважающий себя программист?

    Правильно, сегодня мы напишем «Hello World» на MPI, и заодно глянем на самые базовые функции библиотеки. Поехали!

    Основные функции MPI

    Я сейчас говорю о тех, которые помогут нам грамотно идентифицировать каждый процесс, чтобы управлять общей логикой приложения. Реализовано это следующим образом: все процессы делятся на группы, называемые коммуникаторами, при этом один процесс может находиться сразу в нескольких коммуникаторах. По умолчанию все процессы попадают в коммуникатор MPI_COMM_WORLD . Каждый процесс имеет порядковый номер в коммуникаторе, называемый рангом. Как правило, процесс с рангом 0 назначается главным, он рулит бизнес логикой приложения и раздает команды другим процессам, еще он может отвечать за вывод в консоль, если вывод предусмотрен.

    Но прежде чем начать рулить процессами, нужно их инициализировать с помощью функции MPI_Init(int *argc, char ***argv) , которая принимает аргументы командной строки и раздает их процессам. А после завершения грамотно оборвать все связи и убить процессы функцией MPI_Finalize() .

    Перечень основных функций MPI

    MPI_Initi(int *argc, char ***argv) — как уже было сказано, инициализирует все процессы и раздает им аргументы командной строки. По умолчанию, все вновь созданные процессы принадлежат стандартному коммуникатору MPI_COMM_WORLD ;

    MPI_Finalize() — обрывает связи и убивает процессы;

    MPI_Comm_size(MPI_Comm comm, int* size) — Функция запишет в переменную size количество процессов в коммуникаторе comm. Для того, чтобы узнать общее число процессов следует первым аргументом передать стандартный коммуникатор MPI_COMM_WORLD;

    MPI_Comm_rank(MPI_Comm comm, int* rank) — Функция запишет в переменную rank ранг процесса в коммуникаторе comm. Это и есть способ идентифицировать процесс для того, чтобы отдать ему какую либо логику. Разделение полномочий между процессами осуществляется с помощью условных конструкций, например, if (rank == 0) < … >или switch(rank) < … >.

    Простейшая программа с использованием библиотеки MPI

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

    #include «mpi.h» int main(int argc, char **argv) < int rank, size; MPI_Init(argv); //Количество процессов в этом коммуникаторе MPI_Comm_size(MPI_COMM_WORLD, //Ранг процесса MPI_Comm_rank(MPI_COMM_WORLD, if(rank == 0) < printf(«Hello world, Im main process! There are %d processes in my comm.n», size); > else < printf(«Hello world! Im %d process in comm.n», rank); > MPI_Finalize(); return 0; >

    Заключение

    Нехитрое дело сделано, в следующей серии будет обмен сообщениями между процессами и какое нибудь задание поинтереснее, но начинать всегда нужно с «Hello world»! А на сегодня у меня все, спасибо за внимание!

    Подписывайтесь на рассылку чтобы не пропустить продолжение.

    Источник: mindhalls.ru

    Основные функции MPI

    Наиболее распространенной технологией программирования для параллельных систем с распределенной памятью в настоящее время является MPI (Message Passing Interface). Основным способом взаимодействия параллельных процессов друг с другом в таких системах является передача сообщений (Message Passing). По сути MPI – это библиотека и среда исполнения для параллельных программ на языках C или Fortran. В данном пособии будут описаны примеры программ на языке С.

    Изначально MPI позволяет использовать модель программирования MIMD (Multiple Instruction Multiple Data) – много потоков инструкций и данных, т.е. объединение различных программ с различными данными. Но программирование для такой модели на практике оказывается слишком сложным, поэтому обычно используется модель SIMD (Single Program Multiple Data) –одна программа и много потоков данных. Здесь параллельная программа пишется так, чтобы разные ее части могли одновременно выполнять свою часть задачи, таким образом, достигается параллелизм. Поскольку все функции MPI содержаться в библиотеке, то при компиляции параллельной программы необходимо будет прилинковать соответствующие модули.

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

    Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI — программ и в ходе вычислений меняться не может. Все процессы программы последовательно перенумерованы от 0 до np-1, где np есть общее количество процессов. Номер процесса называется рангом процесса.

    Взаимодействуют параллельные процессы между собой при помощи посылки сообщений. Методы посылки (их называют коммуникации) бывают двух видов – коллективные(collective) и “точка-точка” (point-to-point).

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

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

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

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

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

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

    Константы MPI ТИП данных языка С
    MPI_INT signed int
    MPI_UNSIGNED unsigned int
    MPI_SHORT signed int
    MPI_LONG signed long int
    MPI_UNSIGNED_SHORT unsigned int
    MPI_UNSIGNED_LONG unsigned long int
    MPI_FLOAT float
    MPI_DOUBLE double
    MPI_LONG_DOUBLE long double
    MPI_UNSIGNED_CHAR unsigned char
    MPI_CHAR signed char

    Пример запуска библиотеки MPI: логин student, пароль s304.

    int main (int argc, char *argv[])

    /* получение ранга процесса */

    Источник: poznayka.org

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru