- •(Вопросы 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.3.3. Одновременное выполнение передачи и приема
Одной из часто выполняемых форм информационного взаимодействия в параллельных программахявляется обмен данными междупроцессами, когда для продолжения вычисленийпроцессамнеобходимо отправить данные однимпроцессами в то же время получить сообщения от других. Простейший вариант этой ситуации состоит, например, в обмене данными между двумяпроцессами. Реализация таких обменов при помощи обычных парных операций передачи данных может быть неэффективна, кроме того, такая реализация должна гарантировать отсутствие тупиковых ситуаций, которые могут возникать, например, когда двапроцессаначинают передавать сообщения друг другу с использованием блокирующих функций передачи данных.
Достижение эффективного и гарантированного одновременного выполнения операций передачи и приема данных может быть обеспечено при помощи функции MPI:
int MPI_Sendrecv(void *sbuf,int scount,MPI_Datatype stype,
int dest, int stag, void *rbuf,int rcount,MPI_Datatype rtype,
int source,int rtag, MPI_Comm comm, MPI_Status *status),
где
sbuf, scount, stype, dest, stag — параметры передаваемого сообщения;
rbuf, rcount, rtype, source, rtag — параметры принимаемого сообщения;
comm — коммуникатор, в рамках которого выполняется передача данных;
status — структура данных с информацией о результате выполнения операции.
Как следует из описания, функция MPI_Sendrecvпередает сообщение, описываемое параметрами (sbuf, scount, stype, dest, stag),процессус рангомdestи принимает сообщение в буфер, определяемый параметрами (rbuf, rcount, rtype, source, rtag), отпроцессас рангомsource.
В функции MPI_Sendrecvдля передачи и приема сообщений применяются разные буферы. В случае же когда отсылаемое сообщение больше не нужно напроцессе-отправителе, вMPIимеется возможность использования единого буфера:
int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype type,
int dest, int stag, int source, int rtag, MPI_Comm comm,
MPI_Status* status),
где
buf, count, type — параметры передаваемого сообщения;
dest — ранг процесса, которому отправляется сообщение;
stag — тег для идентификации отправляемого сообщения;
source — ранг процесса, от которого выполняется прием сообщения;
rtag — тег для идентификации принимаемого сообщения;
comm — коммуникатор, в рамках которого выполняется передача данных;
status — структура данных с информацией о результате выполнения операции.
Пример использования функций для одновременного выполнения операций передачи и приема приведен в лекции 7при разработкепараллельных программматричного умножения.
5.4. Коллективные операции передачи данных
Как уже отмечалось ранее, под коллективными операциямивMPIпонимаются операции над данными, в которых принимают участие всепроцессыиспользуемого коммуникатора. Выделение основных видов коллективных операций было выполнено влекции 3. Часть коллективных операций уже была рассмотрена в п.5.2.3 – это операции передачи от одногопроцессавсемпроцессамкоммуникатора (широковещательная рассылка) и операции обработки данных, полученных на одномпроцессеот всехпроцессов(редукция данных).
Рассмотрим далее оставшиеся базовые коллективные операции передачи данных.