...

Microsoft mpi что это за программа

Часть 1. MPI — Введение и первая программа

В этом цикле статей речь пойдет о параллельном программировании.

  • Часть 1. MPI — Введение и первая программа.
  • Часть 2. MPI — Учимся следить за процессами.
  • Часть 3. MPI — Как процессы общаются? Сообщения типа точка-точка.

В бой. Введение

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

В основном используют 2 типа оптимизации, либо их смесь: векторизация и распараллеливание
вычислений. Чем же они отличаются?

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

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

Так а чем отличаются векторизация и параллельные вычисления? Векторизация — позволяет выполнять операции над данными целыми векторами. Например для С++: если мы используем AVX инструкции, то у нас есть вектора размером 256 бит, куда мы можем поместить float32 элементы. Получится, что мы можем собрать 2 вектора по (256 / 32) = 8 float32 значений. После чего выполнить над ними одну операцию за такт, хотя если бы мы этого не сделали, то вполне возможно, что аналогичные вычисления прошли бы за 8 операций, а то и больше если брать в учет вычисления индексов конкретных элементов. Однако есть одна проблема: компиляторы нынче довольно умны и довольно хорошо справляются с подобной оптимизацией и сами, поэтому большая часть сил уходит на то чтобы правильно организовать данные.

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

Основная часть

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

Существует два основных стиля создания параллельных программ: MIMD(Multiple Instruction Multiple Data — Множественный поток Инструкций, Множественный поток Данных) и SPMD(Single Program Multiple Data — Одна Программа, Множественный поток Данных).

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

Установка

Поскольку MPI — библиотека, то необходимо ее прилинковать к компилятору. В каждой среде это делается по своему и в зависимости от компилятора. Лично я работал на Ubuntu Budgie 20.04 LTS и расскажу инструкцию по установке именно для нее.

В командной строке вводим следующие команды:

[user-name]$ sudo apt-get update [user-name]$ sudo apt-get install gcc [user-name]$ sudo apt-get install mpich

Первая команда обновляет менеджер пакетов, вторая устанавливает компилятор GCC, если его нет в системе, третья программа устанавливает компилятор через который мы собственно и будем работать с C\С++&MPI кодом.

Первые шаги.

MPI-программа — это множество параллельных взаимодействующих процессов, которые работают каждый в своей выделенной области памяти. По сути это N независимых программ, которые общаются между собой в ходе работы. В MPI большинство типов данных уже переопределены и начинаются с аббревиатуры MPI_[Name], далее это будет понятно.

Для понимания того что происходит дальше нужно определиться с несколькими терминами:

Коммуникатор — объект через который общается определенная группа порожденных процессов. В С++/С это тип данных MPI_Comm. Коммуникатор может объединять несколько процессов путем передачи сообщений между ними, при этом коммуникаторов может быть несколько, группы которые они образуют могут как не пересекаться, так пересекаться частично. При старте программы все процессы работают под единым коммуникатором с именем MPI_COMM_WORLD. Кроме него существуют еще коммуникаторы MPI_COMM_SELF, MPI_COMM_NULL, которые содержат только текущий процесс и ни одного процесса соответственно.

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

Тег сообщения — целое не отрицательное число от 0 до 32767(В зависимости от реализации. Максимально возможная величина тега хранится в константе MPI_TAG_UB).

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

int MPI_Init(int *argc, char ***argv); int MPI_Finalize(void);

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

Для того чтобы проверить работу программы реализуем самую примитивную программку на С++ с применением MPI.

#include #include "mpi.h" int main(int argc, char **argv)

Чтобы запустить эту программу сохраним нашу запись в файле с любым названием и расширением *.cpp, после чего выполним следующие действия в консоли (В моем случае код лежит в файле main.cpp):

[user-name]$ mpic++ main.cpp -o main [user-name]$ mpiexec -n 2 ./main 

Первая команда скомпилирует нашу MPI-программу, а вторая команда позволяет ее запустить. Заметим, что мы передаем параметры -n 2 во второй строке, зачем это? Таким образом мы сообщаем исполнителю, что нужно запустить 2 параллельных процесса.

Программа просто напечатает несколько строк в зависимости от количества процессов которое вы укажете. Не стоит пугаться если строки «Before . » и «After . « будут отображаться не по одному разу, в зависимости от реализации MPI программа может работать параллельно и вне процедур Init-Finalize.

Итог

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

  • mpi
  • c++
  • оптимизация
  • параллельное программирование
  • многопоточные приложения

Настройка MPI Windows, пример программы

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

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

MS-MPI — это реализация стандарта интерфейса передачи сообщений компании Майкрософт для разработки и запуска параллельных приложений на платформе Windows.

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

Установка среды MPI Windows

Для функционирования интерфейса передачи сообщений MPI на операционной системе Windows необходима установка пакетов MS-MPI, описание и ссылки для загрузки пакетов находятся на: Message Passing Interface Windows. Для скачивания предлагаются два файла: msmpisetup.exe – установщик MS-MPI msmpisdk.msi — комплект разработки программного обеспечения (SDK). На странице загрузки размещены также и инструкции по установке MS-MPI с помощью данных файлов.

Успешную установку пакетов и создания набора переменных среды MS-MPI можно проверить в командной строке запущенной от имени администратора командой set MSMPI . При правильной установке в консоли напечатаются переменные среды и их физические пути.

Проверка установки пакетов MS-MPI

Создание проекта в Visual Studio для приложения MPI

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

Создание проекта в Visual Studio происходит в несколько шагов: выбор типа проекта, задание имени и расположения файлов проекта на вашем компьютере. Ниже скриншоты наглядно показывают эти этапы.

Выбор типа проекта в Visual Studio Настройка имени и расположения проекта

Подключение заголовочных файлов MS-MPI в проект на С++

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

Доступ к заголовочным файлам прописываются на вкладке Свойства конфигурации-> Дополнительные каталоги включаемых файлов. Прописываем доступ через переменные среды для 64-разрядной и 32-разрядной версии приложения соответственно: $(MSMPI_INC);$(MSMPI_INC)\x64
$(MSMPI_INC);$(MSMPI_INC)\x86
Вместо переменных среды можно прописывать абсолютные пути. Теперь можно добавить в исходный файл проекта С++ директиву: #include «mpi.h»

Добавление заголовочных файлов в проект C++

Подключение компонуемых библиотек MS-MPI в проект на С++

После прописывания доступа к заголовочным файлам подключаем также компонуемые библиотеки на вкладке Свойства конфигурации-> Компоновщик-> Дополнительные зависимости (между названиями обязателен разделитель ;):
msmpi.lib
и Свойства конфигурации-> Компоновщик-> Дополнительные каталоги библиотек, для 64-разрядной и 32-разрядной версии соответственно:
$(MSMPI_LIB64)
$(MSMPI_LIB32) .

Подключение компонуемых библиотек C++ Visual Studio

Программный код приложения MPI

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

Листинг кода первого запуска приложения MPI:

#include #include "mpi.h" int main() < // Инициализация среды параллельных вычислений MPI. MPI_Init(NULL, NULL); // ----- // Размещение программного кода параллельной программы. // ----- // Завершение работы среды параллельных вычислений MPI MPI_Finalize(); // Приостановка консольного окна перед закрытием для // тестирования программного кода в студии. std::cin.get(); >

При первом запуске приложения в среде высокопроизводительны вычислений MS-MPI операционная система Windows выбросит предупредительное окно брандмауэра с запросом на разрешение передачи сообщений между процессами параллельных приложений. Для полноценной работы приложений MPI необходимо разрешить доступ.

 Запрос брандмауэра на разблокирование всех функций приложения MPI

Тестирование параллельных процессов MPI

Добавим еще немного кода чтобы оживить программу и создать смысл запуска N-ого количества процессов одновременно. Каждый процесс в группе имеет свой уникальный номер, называемый рангом. Ранг процесса MPI — это целое число в диапазоне [0, N-1], где N — количество процессов в группе.

Теперь каждый запущенный процесс будет печатать свой ранг в группе, а процесс с рангом 0 дополнительно выведет количество размер группы. Функция MPI_Comm_rank(MPI_Comm comm, int *rank) позволит каждому процессу получить свой уникальный ранг.

Листинг кода программы тестирования параллельных процессов MPI:

#include #include "mpi.h" int main() < // Инициализация среды параллельных вычислений MPI. MPI_Init(NULL, NULL); // Получение ранга текущего процесса в группе запущенных приложений. // MPI_COMM_WORLD - коммуникатор, объединяющий все процессы параллельной программы. int rank = -1; MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Получение количества процессов в группе. int count_processes = -1; MPI_Comm_size(MPI_COMM_WORLD, &count_processes); // Вывод ранга (идентификатора) текущего процесса. // Экземпляр ранга 0 дополнительно выводит // количество процессов в группе. if (rank == 0) < std::cout else < std::cout // Завершение работы среды параллельных вычислений MPI MPI_Finalize(); // Приостановка консольного окна перед закрытием для // тестирования программного кода в студии. //std::cin.get(); > 

Команда запуска параллельных процессов

В составе пакетов MS-MPI устанавливается утилита mpiexec.exe, которая осуществляет запуск программ, написанных для среды MPI. По умолчанию mpiexec.exe устанавливается в каталог C:\Program Files\Microsoft MPI\Bin, путь к каталогу доступен через переменную среды MSMPI_BIN .

Командная строка для тестирования параллельных процессов открывается в папке нахождения приложения MPI. Для этого удобно в адресной строке проводника Windows, находясь в папке приложения, набрать команду cmd . Запуск N-ого количества параллельных процессов осуществляется командой:
mpiexec -n N название_файла_программы_MPI
Т. е. для запуска 8 параллельных процессов такая команда:
mpiexec -n 8 StartMPI.exe
Если не указывать опцию -n и запустить программу MPI командой:
mpiexec StartMPI.exe
то запустится количество одновременных процессов равное количеству процессоров или ядер процессора аппаратного устройства. Для справки по опциям и аргументам запуска программ MPI служит команда:
mpiexec -help

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

Исходник запуска программы на MPI

Архивный файл исходника содержит проект приложения параллельных вычислений MPI на языке С++. Исходник написан в среде MS Visual Studio 2022. Процессы запущенной программы в среде MPI выводят свои ранги и размер группы.

Microsoft MPI

Microsoft MPI (MS-MPI) — это реализация майкрософт стандарта интерфейса передачи сообщений для разработки и запуска параллельных приложений на платформе Windows.

MS-MPI предлагает несколько преимуществ:

  • Простота переноса существующего кода, использующего MPICH.
  • Безопасность на основе доменные службы Active Directory.
  • Высокая производительность в операционной системе Windows.
  • Совместимость двоичных файлов между различными типами параметров взаимодействия.

Исходный код MS-MPI

Исходный код Microsoft MPI доступен на сайте GitHub.

Загрузки MS-MPI

Ниже приведены текущие скачиваемые файлы для MS-MPI:

  • MS-MPI версии 10.1.3 (новая версия!) — см. заметки о выпуске
  • Отладчик для приложений MS-MPI с пакетом HPC 2012 R2

Более ранние версии MS-MPI доступны в Центре загрузки Майкрософт.

Ресурсы сообщества

  • Форум MPI для Windows HPC
  • Обратитесь к команде MS-MPI

Высокопроизводительные вычислительные ресурсы Майкрософт

  • Рекомендуемое руководство. Компиляция и запуск простой программы MS-MPI
  • Рекомендуемое руководство. Настройка кластера Windows RDMA с пакетом HPC и экземплярами A8 и A9 для запуска приложений MPI
  • Высокопроизводительные вычисления Microsoft для разработчиков
  • Обзор пакета Microsoft HPC 2019
  • Сценарии Azure HPC

При подготовке материала использовались источники:
https://habr.com/ru/articles/548266/
https://www.interestprograms.ru/source-codes-nastrojka-mpi-dlya-windows-primer-parallelnoj-programmy
https://learn.microsoft.com/ru-ru/message-passing-interface/microsoft-mpi

Оцените статью