- •(Вопросы 34-40) содержание
- •5.2. Введение в разработку параллельных программ с использованием mpi
- •5.3. Операции передачи данных между двумя процессами
- •5.1. Mpi: основные понятия и определения
- •5.1.1. Понятие параллельной программы
- •5.1.2. Операции передачи данных
- •5.1.3. Понятие коммуникаторов
- •5.1.4. Типы данных
- •5.1.5. Виртуальные топологии
- •5.2. Введение в разработку параллельных программ с использованием mpi
- •5.2.1. Основы mpi
- •5.2.1.1. Инициализация и завершение mpi-программ
- •5.2.1.2. Определение количества и ранга процессов
- •5.2.1.3. Передача сообщений
- •5.2.1.4. Прием сообщений
- •5.2.1.5. Первая параллельная программа с использованием mpi
- •5.2.2. Определение времени выполнение mpi-программы
- •5.2.3. Начальное знакомство с коллективными операциями передачи данных
- •5.2.3.1. Передача данных от одного процесса всем процессам программы
- •5.2.3.2. Передача данных от всех процессов одному процессу. Операция редукции
- •5.2.3.3. Синхронизация вычислений
- •5.2.3.4. Аварийное завершение параллельной программы
- •5.3. Операции передачи данных между двумя процессами
- •5.3.1. Режимы передачи данных
- •5.3.2. Организация неблокирующих обменов данными между процессами
- •5.3.3. Одновременное выполнение передачи и приема
- •5.4. Коллективные операции передачи данных
- •5.4.1. Обобщенная передача данных от одного процесса всем процессам
- •5.4.2. Обобщенная передача данных от всех процессов одному процессу
- •5.4.3. Общая передача данных от всех процессов всем процессам
- •5.4.4. Дополнительные операции редукции данных
- •5.4.5. Сводный перечень коллективных операций данных
- •5.5. Производные типы данных в mpi
- •5.5.1. Понятие производного типа данных
- •5.5.2. Способы конструирования производных типов данных
- •5.5.2.1. Непрерывный способ конструирования
- •5.5.2.2. Векторный способ конструирования
- •5.5.2.3. Индексный способ конструирования
- •5.5.2.4. Структурный способ конструирования
- •5.5.3. Объявление производных типов и их удаление
- •5.5.4. Формирование сообщений при помощи упаковки и распаковки данных
- •5.6. Управление группами процессов и коммуникаторами
- •5.6.1. Управление группами
- •5.6.2. Управление коммуникаторами
- •5.7. Виртуальные топологии
- •5.7.1. Декартовы топологии (решетки)
- •5.7.2. Топологии графа
- •5.8. Дополнительные сведения о mpi
- •5.8.1. Разработка параллельных программ с использованием mpi на алгоритмическом языке Fortran
- •5.8.2. Общая характеристика среды выполнения mpi-программ
- •5.8.3. Дополнительные возможности стандарта mpi-2
- •5.9. Краткий обзор лекции
- •6. Параллельные методы умножения матрицы на вектор
- •6.1. Принципы распараллеливания
- •6.2. Постановка задачи
- •6.3. Последовательный алгоритм
- •6.4. Разделение данных
- •6.5. Умножение матрицы на вектор при разделении данных по строкам
- •6.5.1. Выделение информационных зависимостей
- •6.5.2. Масштабирование и распределение подзадач по процессорам
- •6.5.3. Анализ эффективности
- •6.5.4. Программная реализация
- •6.5.5. Результаты вычислительных экспериментов
- •6.6. Умножение матрицы на вектор при разделении данных по столбцам
- •6.6.1. Определение подзадач и выделение информационных зависимостей
- •6.6.2. Масштабирование и распределение подзадач по процессорам
- •6.6.3. Анализ эффективности
- •6.6.4. Результаты вычислительных экспериментов
- •6.7. Умножение матрицы на вектор при блочном разделении данных
- •6.7.1. Определение подзадач
- •6.7.2. Выделение информационных зависимостей
- •6.7.3. Масштабирование и распределение подзадач по процессорам
- •6.7.4. Анализ эффективности
- •6.7.5. Результаты вычислительных экспериментов
- •6.8. Краткий обзор лекции
5.2.3.3. Синхронизация вычислений
В ряде ситуаций независимо выполняемые в процессахвычисления необходимо синхронизировать. Так, например, для измерения времени начала работыпараллельной программынеобходимо, чтобы для всехпроцессоводновременно были завершены все подготовительные действия, перед окончанием работы программы всепроцессыдолжны завершить свои вычисления и т.п.
Синхронизация процессов, т.е. одновременное достижениепроцессамитех или иных точекпроцессавычислений, обеспечивается при помощи функцииMPI:
int MPI_Barrier(MPI_Comm comm),
где
comm — коммуникатор, в рамках которого выполняется операция.
Функция MPI_Barrierопределяет коллективную операцию, и, тем самым, при использовании она должна вызываться всемипроцессамииспользуемого коммуникатора. При вызове функцииMPI_Barrierвыполнениепроцессаблокируется, продолжение вычисленийпроцессапроизойдет только после вызова функцииMPI_Barrierвсемипроцессамикоммуникатора.
5.2.3.4. Аварийное завершение параллельной программы
Для корректного завершения параллельной программыв случае непредвиденных ситуаций необходимо использовать функцию:
int MPI_Abort(MPI_Comm comm, int errorcode),
где
comm — коммуникатор, процессы которого необходимо аварийно остановить;
errorcode — код возврата из параллельной программы.
Эта функция корректно прерывает выполнение параллельной программы, оповещая об этом событии средуMPI, в отличие от функций стандартной библиотеки алгоритмического языкаC, таких, какabortилиterminate. Обычное ее использование заключается в следующем:
MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OTHER);
5.3. Операции передачи данных между двумя процессами
5.3.1. Режимы передачи данных
Рассмотренная ранее функция MPI_Sendобеспечивает так называемый стандартный (standard) режим отправки сообщений, при котором (см. также п. 5.2.1.3):
на время выполнения функции процесс – отправитель сообщения блокируется;
после завершения функции буфер может быть использован повторно;
состояние отправленного сообщения может быть различным – сообщение может располагаться на процессе-отправителе, может находиться в состоянии передачи, может храниться на процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv.
Кроме стандартного режима в MPIпредусматриваются следующие дополнительные режимыпередачи сообщений:
синхронный (synchronous) режим состоит в том, что завершение функции отправки сообщения происходит только при получении от процесса - получателя подтверждения о начале приема отправленного сообщения. Отправленное сообщение или полностью принято процессом - получателем, или находится в состоянии приема;
буферизованный (buffered) режим предполагает использование дополнительных системных или задаваемых пользователем буферов для копирования в них отправляемых сообщений. Функция отправки сообщения завершается сразу же после копирования сообщения в системный буфер;
режим передачи по готовности (ready) может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован.
Для именования функций отправки сообщения для разных режимов выполнения в MPIприменяется название функцииMPI_Send, к которому как префикс добавляется начальный символ названия соответствующего режима работы, т.е.:
MPI_Ssend – функция отправки сообщения в синхронном режиме;
MPI_Bsend – функция отправки сообщения в буферизованном режиме;
MPI_Rsend – функция отправки сообщения в режиме по готовности.
Список параметров всех перечисленных функций совпадает с составом параметров функции MPI_Send.
Для применения буферизованного режима передачиможет быть создан и переданMPIбуфер памяти, используемая для этого функция имеет вид:
int MPI_Buffer_attach(void *buf, int size),
где
buf — адрес буфера памяти;
size — размер буфера.
После завершения работы с буфером он должен быть отключен от MPIпри помощи функции:
int MPI_Buffer_detach(void *buf, int *size),
где
buf — адрес буфера памяти;
size — возвращаемый размер буфера.
По практическому использованию режимов можно привести следующие рекомендации:
стандартный режим обычно реализуется как буферизированный или синхронный, в зависимости от размера передаваемого сообщения, и зачастую является наиболее оптимизированным по производительности;
режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т. к. обычно сложно гарантировать готовность операции приема;
буферизованный режим также выполняется достаточно быстро, но может приводить к большим расходам ресурсов (памяти), – в целом может быть рекомендован для передачи коротких сообщений;
синхронный режим является наиболее медленным, т.к. требует подтверждения приема, однако не нуждается в дополнительной памяти для хранения сообщения. Этот режим может быть рекомендован для передачи длинных сообщений.
В заключение отметим, что для функции приема MPI_Recvне существует различных режимов работы.