6Системы программирования на основе передачи сообщений
6.1Основы MPI MPI (Message Passing Interface – интерфейс передачи сообщений) – программный интерфейс (библиотека, API), предоставляющий процессам, выполняющим одну задачу, возможность обмена сообщениями
Разработан группой MPI Forum http://www.mpi-forum.org, поддержан академическими кругами (университет Иллинойса) и промышленностью
Является одним из первых стандартов систем передачи сообщений
Применяется в системах с распределённой памятью, кластерах
Основные особенности
Высокая производительность
Масштабируемость
Переносимость (портируемость)
Для упрощения переносимости используется языково-независимая спецификация (Language-independent specification – LIS)
Стандарты MPI
MPI-1 (≈128 функций)
Передача и получение сообщений между отдельными процессами (отправка сообщений указанному процессу)
Коллективные взаимодействия процессов (отправка сообщений нескольким получателям)
Взаимодействия между процессами в группах процессов (сообщения, синхронизация)
Виртуальные топологии процессоров
MPI-2 (≈500 функций)
Включает MPI-1
Динамическое порождение процессов и управление процессами (процессы допустимо создавать в процессе работы программы)
Односторонние коммуникации (обмены Get/Put)
Поддержка операций параллельного файлового ввода и вывода
Расширенные коллективные операции (процессы могут выполнять коллективные операции не только внутри одного коммуникатора, но и в рамках нескольких коммуникаторов)
Общая структура MPI-программы
Подключение необходимых библиотек (заголовочных файлов, областей имён)
Инициализация
MPI_Init
Параметры – аргументы командной строки
До инициализации не рекомендуется изменять состояние процесса, например, осуществлять ввод/вывод
Использование
Деинициализация
MPI_Finalize
Перед денициализацией все обмены должны быть завершены – это забота программиста
После деинициализации количество работающих процессов не определено – лучше завершить работу программы
Заново инициализировать MPI нельзя
Процессы в MPI
Для запуска приложений MPI используется специальная утилита (mpiexec)
Для обеспечения функционирования MPI приложений на распределённых архитектурах используются службы (демоны) MPI
Каждый MPI-процесс имеет свой номер – ранг процесса, используемый для его идентификации
Первый запущенный процесс имеет ранг 0
Сообщения
Виды сообщений по количеству взаимодействующих процессов
Попарные (point-to-point, двухточечные) – сообщение отправляется от одного процесса к другому
Используется для неструктурированных и локальных взаимодействий
Коллективные – сообщения отправляется и/или принимаются несколькими процессами
Эффективней множества попарных сообщений за счёт учёта архитектуры вычислительной системы
Виды сообщений по типам вызовов
Синхронные – процесс-отправитель сообщения ожидает готовности процесса-получателя принять сообщение
Асинхронные – процесс-отправитель сообщения не ждёт готовности процесса-получателя, доставка сообщения обеспечивается внутренним буфером MPI
Первые реализации MPI предусматривали только синхронные сообщения
Последние реализации MPI используют асинхронные сообщения для попарных обменов
Основные составляющие сообщения
Блок данных
Метаинформация блока данных
Тип данных – в MPI есть собственные типы данных, являющиеся реализацией канонических типов данных
Размер данных
Информация об отправителе и получателе сообщения
Коммуникатор (группа) – рассматривается в следующей части
Ранг отправителя
Ранг получателя
Тег сообщения – целое число от 0 до 32767
Используется для фильтрации сообщений получателем или определения порядка следования сообщений
Отсутствует в коллективных обменах сообщениями
Виды коллективных сообщений
Широковещательная передача – передача сообщения от одного процесса сразу всем процессам
Распределение данных – отправка сообщений от одного процесса нескольким процессам
Сбор данных – получение сообщений одним процессом от нескольких процессов
Обмен с барьером – ожидание заданного количества процессов
Операции приведения – разновидность сбора данных, при которой полученные данные становятся доступными всем процессам, из которых осуществлялся сбор данных
Операции сканирования – разновидность операции приведения, после выполнения которой данные процессов не идентичны, а последовательно передаются между процессами, как при конвейерной обработке
Коммуникаторы Процессы разделяются на виртуальные группы, внутри которых осуществляются обмены сообщениями
Коммуникатор – идентификатор группы взаимодействующих процессов, имеющих возможность обмениваться сообщениями
Один и тот же процесс может одновременно входить в несколько коммуникаторов
В каждом коммуникаторе процесс будет иметь собственный ранг
Коммуникаторы по умолчанию
MPI_COMM_WORLD – содержит все процессы
Первый запущенный процесс именно в этом коммуникаторе будет иметь ранг 0
MPI_COMM_SELF – содержит только процесс, в контексте которого вызвана функция
MPI_COMM_NULL – пустой коммуникатор, не содержит ни одного процесса
Назначение коммуникаторов
Возможность организации коллективных обменов сообщениями внутри групп процессов
Изоляция обменов различного назначения
Учёт архитектуры вычислительной системы (кластера) для повышения скорости обмена сообщениями
Обмен сообщениями Функции отправки и приёма сообщений
Попарные сообщения
MPI_Send – блокирующая отправка
MPI_Recv – блокирующий приём
MPI_Isend – неблокирующая отправка
MPI_Irecv – неблокирующий приём
Коллективные сообщения
MPI_Barrier – синхронизация всех процессов в коммуникаторе
MPI_Bcast – отправка сообщений всем процессам в коммуникаторе
MPI_Reduce – получение сообщений от нескольких процессов в коммуникаторе
MPI_Abort – запрос на завершение всех процессов
Имитация «вызова» функции
Порядок выполнения операций
Отправка сообщения со входными параметрами из вызывающего процесса
Приём сообщения в вызываемом процессе
Обработка информации
Отправка сообщения с результатом выполнения функции в вызывающий процесс
Приём сообщения в вызывающем процессе
Недостатки
Большое количество кода
Невысокое быстродействие
Трудность отладки, особенно при переходе от синхронных сообщений к асинхронным
Попарный обмен сообщениями
Предусмотрена функция обмена сообщениями, обеспечивающая имитацию «вызова», MPI_Sendrecv
Эта функция принимает сообщения от MPI_Send
Сообщения этой функции принимаются с помощью MPI_Recv
Функция MPI_Sendrecv_Replace позволяет использовать один буфер данных для отправки и получения сообщений
Ввод и вывод информации
Есть реализации MPI, в которых всем процессам разрешается выводить информацию на консоль Есть реализации MPI, в которых на консоль разрешается выводить информацию только процессу с рангом 0 в коммуникаторе MPI_COMM_WORLD
Есть реализации MPI, в которых ввод/вывод осуществляется только посредством файлов
Наиболее характерно для распределённых систем
Рекомендуется каждому процессу назначать собственный файл для ввода/вывода
Реализации MPI
|