
- •(Вопросы 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.1. Обобщенная передача данных от одного процесса всем процессам
Обобщенная операция передачи данных от одного процессавсемпроцессам(распределение данных) отличается от широковещательной рассылки тем, чтопроцесспередаетпроцессамразличающиеся данные (см.рис. 5.4). Выполнение данной операции может быть обеспечено при помощи функции:
int MPI_Scatter(void *sbuf, int scount, MPI_Datatype stype,
void *rbuf, int rcount, MPI_Datatype rtype, int root,
MPI_Comm comm),
где
sbuf, scount, stype — параметры передаваемого сообщения (scount определяет количество элементов, передаваемых на каждый процесс);
rbuf, rcount, rtype — параметры сообщения, принимаемого в процессах;
root — ранг процесса, выполняющего рассылку данных;
comm — коммуникатор, в рамках которого выполняется передача данных.
Рис. 5.4. Общая схема операции обобщенной передачи данных от одного процесса всем процессам
При вызове этой функции процессс рангомrootпроизведет передачу данных всем другимпроцессамв коммуникаторе. Каждомупроцессубудет отправленоscountэлементов.Процессс рангом0получит блок данных изsbufэлементов с индексами от0доscount-1,процессус рангом1будет отправлен блок изsbufэлементов с индексами отscountдо2*scount-1и т.д. Тем самым, общий размер отправляемого сообщения должен быть равенscount * pэлементов, где p есть количествопроцессовв коммуникатореcomm.
Следует отметить, что поскольку функция MPI_Scatterопределяет коллективную операцию, вызов этой функции при выполнении рассылки данных должен быть обеспечен на каждомпроцессекоммуникатора.
Отметим также, что функция MPI_Scatterпередает всемпроцессамсообщения одинакового размера. Выполнение более общего варианта операции распределения данных, когда размеры сообщений дляпроцессовмогут быть различны, обеспечивается при помощи функцииMPI_Scatterv.
Пример использования функции MPI_Scatterрассматривается влекции 6при разработкепараллельных программумножения матрицы на вектор.
5.4.2. Обобщенная передача данных от всех процессов одному процессу
Операция обобщенной передачи данных от всех процессоводномупроцессу(сбор данных) является двойственной к процедуре распределения данных (см.рис. 5.5). Для выполнения этой операции вMPIпредназначена функция:
int MPI_Gather(void *sbuf, int scount, MPI_Datatype stype,
void *rbuf, int rcount, MPI_Datatype rtype,
int root, MPI_Comm comm),
где
sbuf, scount, stype — параметры передаваемого сообщения;
rbuf, rcount, rtype — параметры принимаемого сообщения;
root — ранг процесса, выполняющего сбор данных;
comm — коммуникатор, в рамках которого выполняется передача данных.
Рис. 5.5. Общая схема операции обобщенной передачи данных от всех процессов одному процессу
При выполнении функции MPI_Gatherкаждыйпроцессв коммуникаторе передает данные из буфераsbufнапроцессс рангомroot.Процессс рангомrootсобирает все получаемые данные в буфереrbuf(размещение данных в буфере осуществляется в соответствии с рангамипроцессов– отправителей сообщений). Для того чтобы разместить все поступающие данные, размер буфераrbufдолжен быть равенscount * pэлементов, гдеpесть количествопроцессовв коммуникатореcomm.
Функция MPI_Gatherтакже определяет коллективную операцию, и ее вызов при выполнении сбора данных должен быть обеспечен в каждомпроцессекоммуникатора.
Следует отметить, что при использовании функции MPI_Gatherсборка данных осуществляется только на одномпроцессе. Для получения всех собираемых данных на каждом изпроцессовкоммуникатора необходимо применять функцию сбора и рассылки:
int MPI_Allgather(void *sbuf, int scount, MPI_Datatype stype,
void *rbuf, int rcount, MPI_Datatype rtype, MPI_Comm comm),
где
sbuf, scount, stype — параметры передаваемого сообщения;
rbuf, rcount, rtype — параметры принимаемого сообщения;
comm — коммуникатор, в рамках которого выполняется передача данных.
Выполнение общего варианта операции сбора данных, когда размеры передаваемых процессамисообщений могут быть различны, обеспечивается при помощи функцийMPI_GathervиMPI_Allgatherv.
Пример использования функции MPI_Gatherрассматривается влекции 6при разработкепараллельных программумножения матрицы на вектор.