- •(Вопросы 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.2. Передача данных от всех процессов одному процессу. Операция редукции
В рассмотренной программе суммирования числовых значений имеющаяся процедура сбора и последующего суммирования данных является примером часто выполняемой коллективной операции передачи данных от всех процессоводномупроцессу. В этой операции над собираемыми значениями осуществляется та или иная обработка данных (для подчеркивания последнего момента данная операция еще именуетсяоперацией редукции данных). Как и ранее, реализация операции редукции при помощи обычных парных операций передачи данных является неэффективной и достаточно трудоемкой. Для наилучшего выполнения действий, связанных с редукцией данных, вMPIпредусмотрена функция:
int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm),
где
sendbuf — буфер памяти с отправляемым сообщением;
recvbuf — буфер памяти для результирующего сообщения (только для процесса с рангом root);
count — количество элементов в сообщениях;
type — тип элементов сообщений;
op — операция, которая должна быть выполнена над данными;
root — ранг процесса, на котором должен быть получен результат;
comm — коммуникатор, в рамках которого выполняется операция.
В качестве операций редукции данных могут быть использованы предопределенные в MPIоперации – см.табл. 5.2.
Помимо данного стандартного набора операций могут быть определены и новые дополнительные операции непосредственно самим пользователем библиотеки MPI– см., например, [[4],[40]–[42],[57]].
Общая схема выполнения операции сбора и обработки данных на одном процессепоказана натабл. 5.2. Элементы получаемого сообщения напроцессеrootпредставляют собой результаты обработки соответствующих элементов передаваемыхпроцессамисообщений, т.е.:
где есть операция, задаваемая при вызове функцииMPI_Reduce (для пояснения на рис. 5.3 показан пример выполнения функции редукции данных).
Следует отметить:
функция MPI_Reduce определяет коллективную операцию, и, тем самым, вызов функции должен быть выполнен всеми процессами указываемого коммуникатора. При этом все вызовы функции должны содержать одинаковые значения параметров count, type, op, root, comm;
передача сообщений должна быть выполнена всеми процессами, результат операции будет получен только процессом с рангом root;
выполнение операции редукции осуществляется над отдельными элементами передаваемых сообщений. Так, например, если сообщения содержат по два элемента данных и выполняется операция суммирования MPI_SUM, то результат также будет состоять из двух значений, первое из которых будет содержать сумму первых элементов всех отправленных сообщений, а второе значение будет равно сумме вторых элементов сообщений соответственно;
не все сочетания типа данных type и операции op возможны, разрешенные сочетания перечислены в табл. 5.3.
Таблица 5.2. Базовые (предопределенные) типы операций MPI для функций редукции данных | |
Операции |
Описание |
MPI_MAX |
Определение максимального значения |
MPI_MIN |
Определение минимального значения |
MPI_SUM |
Определение суммы значений |
MPI_PROD |
Определение произведения значений |
MPI_LAND |
Выполнение логической операции "И" над значениями сообщений |
MPI_BAND |
Выполнение битовой операции "И" над значениями сообщений |
MPI_LOR |
Выполнение логической операции "ИЛИ" над значениями сообщений |
MPI_BOR |
Выполнение битовой операции "ИЛИ" над значениями сообщений |
MPI_LXOR |
Выполнение логической операции исключающего "ИЛИ" над значениями сообщений |
MPI_BXOR |
Выполнение битовой операции исключающего "ИЛИ" над значениями сообщений |
MPI_MAXLOC |
Определение максимальных значений и их индексов |
MPI_MINLOC |
Определение минимальных значений и их индексов |
Рис. 5.2. Общая схема операции сбора и обработки на одном процессе данных от всех процессов
Таблица 5.3. Разрешенные сочетания операции типа операнда в операции редукции | |
Операции |
Допустимый тип операндов для алгоритмического языка C |
MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD |
Целый, вещественный |
MPI_LAND, MPI_LOR, MPI_LXOR |
Целый |
MPI_BAND, MPI_BOR, MPI_BXOR |
Целый, байтовый |
MPI_MINLOC, MPI_MAXLOC |
Целый, вещественный |
Рис. 5.3. Пример выполнения операции редукции при суммировании пересылаемых данных для трех процессов (в каждом сообщении 4 элемента, сообщения собираются на процессе с рангом 2)
Применим полученные знания для переработки ранее рассмотренной программы суммирования: как можно увидеть, весь программный код, выделенный рамкой, может быть теперь заменен на вызов одной лишь функции MPI_Reduce:
// Сборка частичных сумм на процессе с рангом 0
MPI_Reduce(&ProcSum, &TotalSum, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);