- •(Вопросы 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.4.3. Общая передача данных от всех процессов всем процессам
Передача данных от всех процессоввсемпроцессамявляется наиболее общей операцией передачи данных (см.рис. 5.6). Выполнение данной операции может быть обеспечено при помощи функции:
int MPI_Alltoall(void *sbuf,int scount,MPI_Datatype stype,
void *rbuf,int rcount,MPI_Datatype rtype,MPI_Comm comm),
где
sbuf, scount, stype — параметры передаваемых сообщений;
rbuf, rcount, rtype — параметры принимаемых сообщений;
comm — коммуникатор, в рамках которого выполняется передача данных.
Рис. 5.6. Общая схема операции передачи данных от всех процессов всем процессам
При выполнении функции MPI_Alltoallкаждыйпроцессв коммуникаторе передает данные изscountэлементов каждомупроцессу(общий размер отправляемых сообщений впроцессахдолжен быть равенscount * pэлементов, гдеpесть количествопроцессовв коммуникатореcomm) и принимает сообщения от каждогопроцесса.
Вызов функции MPI_Alltoallпри выполнении операции общего обмена данными должен быть выполнен в каждомпроцессекоммуникатора.
Вариант операции общего обмена данных, когда размеры передаваемых процессамисообщений могут быть различны, обеспечивается при помощи функцийMPI_Alltoallv.
Пример использования функции MPI_Alltoallрассматривается влекции 6при разработкепараллельных программумножения матрицы на вектор как задание для самостоятельного выполнения.
5.4.4. Дополнительные операции редукции данных
Рассмотренная в п. 5.2.3.2 функция MPI_Reduceобеспечивает получение результатов редукции данных только на одномпроцессе. Для получения результатов редукции данных на каждом изпроцессовкоммуникатора необходимо использовать функцию редукции и рассылки:
int MPI_Allreduce(void *sendbuf, void *recvbuf, int count,
MPI_Datatype type, MPI_Op op, MPI_Comm comm),
где
sendbuf — буфер памяти с отправляемым сообщением;
recvbuf — буфер памяти для результирующего сообщения;
count — количество элементов в сообщениях;
type — тип элементов сообщений;
op — операция, которая должна быть выполнена над данными;
comm — коммуникатор, в рамках которого выполняется операция.
Функция MPI_Allreduceвыполняет рассылку междупроцессамивсех результатов операции редукции. Возможность управления распределением этих данных междупроцессамипредоставляется функцийMPI_Reduce_scatter.
И еще один вариант операции сбора и обработки данных, при котором обеспечивается получение всех частичных результатов редуцирования, может быть реализован при помощи функции:
int MPI_Scan(void *sendbuf, void *recvbuf, int count,
MPI_Datatype type, MPI_Op op, MPI_Comm comm),
где
sendbuf — буфер памяти с отправляемым сообщением;
recvbuf — буфер памяти для результирующего сообщения;
count — количество элементов в сообщениях;
type — тип элементов сообщений;
op — операция, которая должна быть выполнена над данными;
comm — коммуникатор, в рамках которого выполняется операция.
Общая схема выполнения функции MPI_Scanпоказана нарис. 5.7. Элементы получаемых сообщений представляют собой результаты обработки соответствующих элементов передаваемыхпроцессамисообщений, при этом для получения результатов напроцессес рангомi, 0i<n, используются данные отпроцессов, ранг которых меньше или равенi, т.е.
где есть операция, задаваемая при вызове функцииMPI_Scan.
Рис. 5.7. Общая схема операции редукции с получением частичных результатов обработки данных