Как установить mpi linux

Обновлено: 02.07.2024

Message Passing Interface — это открытая библиотека и фактически стандарт для распараллеливания распределенной памяти. Этот интерфейс обычно используется во многих рабочих нагрузках HPC. Рабочие нагрузки HPC на виртуальных машинах серии H и N с поддержкой RDMA могут использовать MPI для обмена данными по сети InfiniBand с низкой задержкой и высокой пропускной способностью.

  • Размеры виртуальных машин с поддержкой SR-IOV в Azure поддерживают использование практически всех версий MPI с Mellanox OFED.
  • Для обмена данными между виртуальными машинами, которые не поддерживают SR-IOV, поддерживаемые реализации MPI используют интерфейс Microsoft Network Direct (ND). Таким образом, поддерживаются только Microsoft MPI (MS-MPI) 2012 R2 и более поздних версий, а также Intel MPI 5.x. Более поздние версии библиотеки среды выполнения Intel MPI (2017, 2018) могут быть как совместимы, так и несовместимы с драйверами Azure RDMA.

Для виртуальных машин с поддержкой RDMA и SR-IOV подходят образы виртуальных машин CentOS-HPC версии 7.6 и более поздних версий. Эти образы виртуальных машин оптимизированы и предварительно загружены с помощью драйверов OFED для RDMA и различных, часто используемых библиотек MPI и пакетов для научных вычислений. Именно с них проще всего начать работу.

Несмотря на то что здесь приведены примеры для RHEL/CentOS, эти действия являются универсальными и применимыми для любой совместимой операционной системы Linux, такой как Ubuntu (16.04, 18.04, 19.04, 20.04) и SLES (12 SP4 и 15). Дополнительные примеры настройки других реализаций MPI на других дистрибутивах см. в репозитории azhpc-images.

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

Следующие фрагменты кода приведены для примера. Рекомендуется использовать последние стабильные версии пакетов или обращаться к репозиторию azhpc-images.

Выбор библиотеки MPI

Если для приложения HPC рекомендуется определенная библиотека MPI, сначала попробуйте использовать эту версию. Если у вас есть возможность выбора MPI и вы хотите получить максимальную производительность, попробуйте использовать HPC-X. В целом HPC-X MPI работает лучше всего с платформой UCX для интерфейса InfiniBand и использует все возможности оборудования и программного обеспечения Mellanox InfiniBand. Кроме того, HPC-X и OpenMPI совместимы с ABI, поэтому вы можете динамически запускать приложение HPC с помощью средства HPC-X, которое было создано, используя OpenMPI. Intel MPI, MVAPICH и MPICH также совместимы с ABI.

На следующем рисунке показана архитектура популярных библиотек MPI.

Архитектура популярных библиотек MPI

Unified Communication X (UCX) — это платформа API обмена данными для HPC. Она оптимизирована для обмена данными по MPI через InfiniBand и работает со многими реализациями MPI, такими как OpenMPI и MPICH.

В последних сборках UCX устранена проблема, при которой при наличии нескольких интерфейсов сетевой карты выбирается правильный интерфейс InfiniBand. Дополнительные сведения см. в статье Устранение известных проблем с виртуальными машинами HPC и GPU при работе с MPI с использованием InfiniBand, если на виртуальной машине включено ускорение сети.

Набор средств программного обеспечения HPC-X содержит UCX и HCOLL и может быть построен для UCX.

Следующая команда иллюстрирует некоторые рекомендуемые аргументы mpirun для HPC-X и OpenMPI.

Параметр Описание
NPROCS Указывает количество процессов MPI. Например, -n 16 .
$HOSTFILE Указывает файл, содержащий имя узла или IP-адрес для указания расположения, где будут выполняться процессы MPI. Например, --hostfile hosts .
$NUMBER_PROCESSES_PER_NUMA Указывает количество процессов MPI, которые будут выполняться в каждом домене NUMA. Например, чтобы задать четыре процесса MPI для каждого домена NUMA, используйте --map-by ppr:4:numa:pe=1 .
$NUMBER_THREADS_PER_PROCESS Указывает количество потоков на процесс MPI. Например, чтобы задать один процесс MPI и четыре потока на каждый домен NUMA, используйте --map-by ppr:1:numa:pe=4 .
-report-bindings Выводит значение сопоставления процессов MPI с ядрами. Это полезно для проверки правильности закрепления процесса MPI.
$MPI_EXECUTABLE Указывает встроенную компоновку исполняемого файла MPI в библиотеках MPI. Программы-оболочки компилятора MPI делают это автоматически. Пример: mpicc или mpif90 .

Ниже приведен пример выполнения микротестирования OSU для задержки.

Оптимизация групп MPI

Примитивы обмена данными в группе MPI предлагают гибкий, переносимый способ реализации операций обмена данными в группе. Они широко используются в различных научных параллельных приложениях и оказывают значительное влияние на общую производительность приложения. Сведения о параметрах конфигурации для оптимизации производительности обмена данными в группе с помощью HPC-X и библиотеки HCOLL для обмена данными в группе см. в статье TechCommunity.

Например, если у вас есть подозрение, что тесно связанное приложение MPI выполняет чрезмерное количество коллективных коммуникаций, можно попытаться включить Hierarchical Collectives (HCOLL). Чтобы включить эти функции, используйте следующие параметры.

При использовании HPC-X 2.7.4+ может потребоваться явная передача LD_LIBRARY_PATH, если версии UCX в MOFED и HPC-X отличаются.

OpenMPI

Установите UCX, как описано выше. HCOLL входит в состав набора средств программного обеспечения HPC-X и не требует специальной установки.

OpenMPI можно установить из пакетов, доступных в репозитории.

Рекомендуется собрать последний, стабильный выпуск OpenMPI с UCX.

Для оптимальной производительности запустите OpenMPI с ucx и hcoll . См. также пример с HPC-X.

Проверьте ключ секции, как описано выше.

Intel MPI

Скачайте версию Intel MPI по своему выбору. Выпуск Intel MPI 2019 перешел с платформы Open Fabric Alliance (OFA) на платформу Open Fabric Interfaces (OFI) и сейчас поддерживает libfabric. Существует два поставщика поддержки InfiniBand: mlx и verbs. Измените переменную среды I_MPI_FABRICS в зависимости от версии.

  • Intel MPI 2019 и 2021: используйте I_MPI_FABRICS=shm:ofi , I_MPI_OFI_PROVIDER=mlx . Поставщик mlx использует UCX. Было обнаружено, что использование команд стало нестабильным и менее производительным. Дополнительные сведения см. в статье TechCommunity.
  • Intel MPI 2018: используйте I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: используйте I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Ниже приведены некоторые рекомендуемые аргументы mpirun для Intel MPI 2019 с обновлением 5+.

Параметр Описание
FI_PROVIDER Указывает, какой поставщик libfabric следует использовать, что влияет на используемые интерфейсы API, протокол и сеть. verbs является еще одним вариантом, но обычно mlx обеспечивает лучшую производительность.
I_MPI_DEBUG Указывает уровень дополнительных отладочных выходных данных, которые могут содержать сведения о том, где закреплены процессы и какие протокол и сеть используются.
I_MPI_PIN_DOMAIN Указывает способ закрепления процессов. Например, за ядрами, сокетами или доменами NUMA. В этом примере вы присваиваете этой переменной среде значение numa, то есть процессы будут закреплены за доменами узла NUMA.

Оптимизация групп MPI

Существуют и другие варианты, которые можно использовать, особенно если коллективные операции занимают значительное время. Intel MPI 2019 с обновлением 5+ поддерживает указанный mlx и использует платформу UCX для взаимодействия с InfiniBand. Он также поддерживает HCOLL.

Виртуальные машины без SR-IOV

Для виртуальных машин без SR-IOV пример загрузки бесплатной ознакомительной версии среды выполнения 5.x выглядит следующим образом:

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

SUSE Linux

Для версий образа виртуальной машины SUSE Linux Enterprise Server SLES 12 SP3 для HPC, SLES 12 SP3 для HPC (Premium), SLES 12 SP1 для HPC, SLES 12 SP1 для HPC (Premium), SLES 12 SP4 и SLES 15 на виртуальной машине установлены драйверы RDMA и распределены пакеты Intel MPI. Установите MPI, выполнив следующую команду:

MVAPICH

Далее приведен пример сборки MVAPICH2. Примечание. Могут быть доступны более новые версии по сравнению с используемыми ниже.

Ниже приведен пример выполнения микротестирования OSU для задержки.

В приведенном ниже списке перечислены несколько рекомендуемых аргументов mpirun .

Параметр Описание
MV2_CPU_BINDING_POLICY Указывает используемую политику привязки, которая влияет на то, как процессы закрепляются за основными идентификаторами. В этом случае вы указываете scatter, поэтому процессы будут равномерно распределены между доменами NUMA.
MV2_CPU_BINDING_LEVEL Указывает, где следует закреплять процессы. В этом случае вы задаете значение numanode, то есть процессы закрепляются за элементами доменов NUMA.
MV2_SHOW_CPU_BINDING Указывает, необходимо ли получать отладочные сведения о том, где закреплены процессы.
MV2_SHOW_HCA_BINDING Указывает, необходимо ли получать отладочные сведения о том, какой хост-адаптер канала используется каждым процессом.

Платформа MPI

Установите необходимые пакеты для платформы MPI Community Edition.

Выполните этапы процесса установки.

Следующие команды являются примерами запуска команд MPI pingpong и allreduce с использованием платформы MPI на виртуальных машинах HBv3, на которых установлены образы виртуальных машин CentOS-HPC 7.6, 7.8 и 8.1.

MPICH

Установите UCX, как описано выше. Выполните сборку MPICH.

Проверьте ключ секции, как описано выше.

Тесты производительности OSU MPI

Скомпилируйте тесты производительности с помощью определенной библиотеки MPI:

Тесты MPI находятся в папке mpi/ .

Обнаружение ключей секций

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

Больший из двух является ключом клиента, который следует использовать с MPI. Пример. Ниже представлены p-ключи. С MPI следует использовать 0x800b.

Используйте секцию, отличную от ключа секции по умолчанию (0x7fff). UCX требует очистки p-ключа. Например, задайте для 0x800b значение ключа UCX_IB_PKEY 0x000b.

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

Настройка ограничений пользователей для MPI

Настройте ограничения пользователей для MPI.

Настройка ключей SSH для MPI

Настройте ключи SSH для типов MPI, которые этого требуют.

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

Установка MPI в Linux

Кстати, в OpenSuse для установки MPI достаточно добавить соответствующий пакет в Yast. Приведенная ниже инструкция пригодится если в вашем дистрибутиве нет такого пакета или есть, но нужна другая версия.

Проходим на официальный сайт, в раздел загрузки. Там нас интересует табличка с платформами и версиями библиотеки, находим Ubuntu и скачиваем.

После установки в системе появились компиляторы для языков C/C++ и Fortran, которые называются соответственно mpicc/mpic++ и mpifortran. Каждый из них снабжен подробной документацией, что резко уменьшает продолжительность танцев с бубном.

Рассмотрим компиляцию и запуск на классическом примере — программа «Hello, world».

Компилируется это дело командой

mpic++ -o hello hello.cpp

И сразу запускаем с помощью mpiexec, параметр -n говорит о том, сколько процессов запустить для этой программы.

mpiexec -n 5 ./hello

Таким образом мы запустим 5 процессов.

Подключение MPI в CLion

Проекты на C/C++ в CLion`е собираются с помощью автоматизированной кроссплатформенной системы сборки CMake. Суть в двух словах, мы пишем файл CMakeLists.txt в корне проекта, который содержит правила для сборки, на которые ориентируется Make, либо ее аналог в Windows. Более подробно о CMake написано в статье на хабре.

Подключать библиотеку мы будем именно с помощью настроек CMake.

Нам нужно добавить библиотеку mpi.h, сделать это можно с помощью правила include_directories() . В качестве аргумента передаем полный путь до библиотеки(в Linux Ubuntu — /usr/include/mpi/ ). Не забываем нажать «Reload changes» справа в углу.

Готово, теперь CLion знает все функции MPI, но пока не умеет их собирать.

Настройка компилятора прописывается в CMakeLists.txt правилами set() . Напомню, что в Ubuntu компиляторы живут по адресу /usr/bin/mpicc для си, и /usr/bin/mpic++ для си++ соответственно. Поэтому добавляем два правила: set(CMAKE_C_COMPILER "/usr/bin/mpicc") и set(CMAKE_CXX_COMPILER "/usr/bin/mpic++") .

Буквально только, после очередной переустановки системы, мной было замечено, что библиотека корректно подключилась только с настройкой


До чего техника дошла.


Каждому пионеру по кластеру!

A X-ы c TWM-ом на узлах обязательны? :-)))

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

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


Для начинающих MPI-программистов.


Чем дальше, тем более банальные вещи IBM_dW пишет. Скоро будут просвещать про команды ls, cp и exit.


это шизец какойто!
и нафиг это писать надо было?


О, узнаю первую лабу по архитектуре вычислительных систем.

фиии. осталось openpower тока достать

Написали уже бы о mpich2 или lammpi.

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


На OpenPower слака чтоли стоит ? ;)



> На OpenPower слака чтоли стоит ?

Русские физики выбирают OpenPower 720. :))))

Сейчас все посетители ЛОРа бросятся срочно покупать сии творения с тактовой частотой аж (страшно сказать!) 1,65 ГыГаГерцов. :)))


Скриншот в галерею лучших скриншотов на ЛОРе! Срочно! А то twm 'a у нас еще не было. Жму руку бимерам.


Специально для IBM_dW

А вот и ламерочка поймали. Работать под рутом ни-ззя! :)

Да уж, индусы жгут. Не думал, что о таких простых вещах можно написать столь непонятно и длинно.

Например, что такое MPI 1.2.7? Зачем нужен "Один настольный ПК", да еще с Виндовсом? Компиляторы IBM XLC 7.0 и XLF 9.1 -- что, без них никак? И без OpenPower, модель 720 с Red Hat Enterprise Linux® 3.0 с установленным пакетом update 3 или выше -- тоже никак? Вообще, описан процесс установки и настройки MPICH, но нигде про это не говорится, а, между тем, другие реализации MPI ведут себя совершенно иначе!

И компилить/конфигурить под рутом -- вредная привычка.


Просто судя по блогу аффтар не спец в MPI а жавабыдлокодер в лучшем случае ;)


> а жавабыдлокодер в лучшем случае

Не расстраивайте "жабабыдлокодеров" - они разные бывают :). Автор-бимер, видать, только веб-сферу и освоил. :))

> Компиляторы IBM XLC 7.0 и XLF 9.1 -- что, без них никак?

Ты этот OpenPOWER видел? GNU GCC там курит в сторонке по сравнению с родными компиляторами.


Вы до сих пор меряете производительность в ГГц?


>Ты этот OpenPOWER видел? GNU GCC там курит в сторонке по сравнению с родными компиляторами.

Там чиста для прикола результат сpi выведен ;)

Хошь приведу аналогичную цифру для быдлооптерона и быдлогцц ? ;)

>> Компиляторы IBM XLC 7.0 и XLF 9.1 -- что, без них никак?

> Ты этот OpenPOWER видел? GNU GCC там курит в сторонке по сравнению с родными компиляторами.

При чем тут это? Мой вопрос про компиляторы был к тому, что это требование в статье совершенно излишнее, ничего XLC /XLF специфического там нет. Более того, автор не удосужился даже рассказать, как компилить MPI программы: cd /opt/mpich/examples; make -- и вся наука.

Автор ухитрился в довольно длинной статье криво изложить последовательность действий configure; make; make install. Кто, интересно, составляет целевую аудиторию этой статьи? Вот кому адресована следующая фраза: "Отредактируйте файл /etc/bashrc так, чтобы переменная PATH указывала на каталог MPI:"? А если у юзера не bash, что будет?

> А если у юзера не bash, что будет?


> Работать под рутом ни-ззя! :)

можно. если не страдать параноей.


> Написали уже бы о mpich2 или lammpi.


Бу-га-га! Исменно так!:) А если мне кто будет говорить про "производительность" супер-пупер бимерских "рисков" за счет якобы "архитектуры", то пускай полюбуется на

Так обделать бимерских маркетологов, втирающих про "архитектурные решения" - это супер! :)))


>> Работать под рутом ни-ззя! :)

>можно. если не страдать параноей.

Ага! Конечно можно, если быть теоретиком, не утруждающим себя реальной работой с UNIX.

Курить $ man sudo ! :)

> Курить $ man sudo ! :)

Ну накурится человек до команды
$ sudo su -
Что дальше-то? ;)


А дальше поймет чем su отличается от sudo.

>А дальше поймет чем su отличается от sudo.

И чем su - отличается от sudo su - ?


Смотрите /etc/pam.d/su и /etc/pam.d/sudo. Может чего и поймете в этой жизни.


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

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

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

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

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

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

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

Для демонстрации я выбрал сервис 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 & Security / Security Groups необходимо создать правило, которым мы откроем порты для TCP соединений, — это нужно для менеджера MPI-процессов. Правило может выглядеть так:

Type: Custom TCP Rule
Protocol: TCP
Port Range: 1024-65535
Source: 0.0.0.0/0

В целях безопасности можно задать и более строгое правило, но для нашего демонстрационного примера достаточно этого.

Здесь можно прочитать инструкции о том, как связаться с виртуальными серверами с локального компьютера (на англ.).
Для связи с рабочими серверами c компьютера на Windows я использовал Putty, для передачи файлов — WinSCP. Здесь можно прочитать инструкции по их настройке для работы с сервисами Amazon (на англ.).

  1. На каждом из хостов запускаем утилиту ssh-keygen — она создаст в $HOME/.ssh директории пару из приватного и публичного ключей;
  2. Берем содержимое публичного ключа (файл с расширением .pub) с одного сервера и добавляем его в файл $HOME/.ssh/authorized_keys на другом сервере;
  3. Проделаем эту процедуру для обоих серверов;
  4. Попробуем присоединиться по 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 его нет, поэтому необходимо его установить:


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

Далее компилируем нашу тестовую программу с помощью скрипта из состава Intel MPI Library (все необходимые MPI зависимости при компиляции будут выставлены автоматически):
$ cd /home/ec2-user/intel/impi/5.0.3.048/test
$ mpicc -o test.exe ./test.c
$ 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-процессов работает корректно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В результате работы нашей демонстрационной 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.

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

Читайте также: