Параллельное программирование: Учебное пособие, страница 115

·  count — количество элементов в буфере передачи;

·  datatype — тип данных в буфере передачи;

·  ор — операция приведения;

·  root — ранг главного процесса;

·  comm — коммуникатор.

Подпрограмма MPI_Reduce применяет операцию приведения к операндам из buf, а результат каждой операции помещается в буфер результата result. MPI_Reduce должна вызываться всеми процессами в коммуникаторе comm, а аргументы count, datatype и op в этих вызовах должны совпадать. Функция приведения (ор) не возвращает код ошибки, поэтому при возникновении аварийной ситуации либо завершается работа всей программы, либо ошибка молчаливо игнорируется. И то и другое в равной степени нежелательно.

В MPI имеется 12 предопределенных операций приведения (табл. 6.2).

Таблица 6.2. Список предопределенных операций приведения MPI

Операция

Описание

МР1_МАХ

Определение максимальных значений элементов одномерных массивов целого или вещественного типа

MPI_MIN

Определение минимальных значений элементов одномерных массивов целого или вещественного типа

MPI_SUM

Вычисление суммы элементов одномерных массивов целого, вещественного или комплексного типа

MPI_PROD

Вычисление   поэлементного   произведения   одномерных   массивов целого, вещественного или комплексного типа

MPI_LAND

Логическое "И"

MPI_BAND

Битовое "И"

MPI_LOR

Логическое "ИЛИ"

MPI_BOR

Битовое "ИЛИ"

MPI_LXOR

Логическое исключающее "ИЛИ"

MPI_BXOR

Битовое исключающее "ИЛИ"

MPI_MAXLOC

Максимальные значения элементов одномерных массивов и их индексы

MPI_MINLOC

Минимальные значения элементов одномерных массивов и их индексы

Программист может определить и собственные глобальные операции приведения, например, с помощью подпрограммы MPI_Op_create:

int MPI_Op_create(MPI_User_function *function,

                          int commute, MPI_Op *op)

Входными параметрами этой подпрограммы являются:

·  function— пользовательская функция;

·  commute — флаг, которому присваивается значение true, если операция коммутативна (то есть ее результат не зависит от порядка операндов).

Описание типа пользовательской функции выглядит следующим образом:

typedef void (MPI_User_function)(void *a, void *b,

int *len, MPI_Datatype *dtype)

Здесь операция для   I = 0, ..., len – 1  определяется так:

b[I] = a[I] opb[I]

После того как пользовательская функция сыграла свою роль, ее следует аннулировать с помощью подпрограммы MPI_Op_free:

int MPI_Op_free(МРI_Ор *ор)

По завершении вызова переменной Ор присваивается значение MPI_OP_NULL.

Подпрограмма MPI_Reduce имеет варианты. Так, подпрограмма MPI_Reduce_scatter, которая в пределах области взаимодействия процессов, определенной соммуникатором, собирает и распределяет данные. Ее описание выглядит следующим образом:

intMPI_Reduce_scatter(void *sendbuf, void *rcvbuf,

int *rcvcounts, MPI_Datatype datatype,

MPI_Op op, MPI_Comm comm)

Параметры процедуры:

·  sendbuf – входной параметр, задающий адрес посылающего буфера

·  recvbuf – выходной параметр, содержащий адрес получающего буфера. Начальные адреса передающего и принимающего буферов не могут совмещаться в памяти.

·  rcvcounts – входной параметр, представляющий одномерный целочисленный массив, который определяет число элементов в каждом сегменте передающего буфера. Каждое число определяет количество данных, которое при распределении возвращается каждому процессу. При вызове процедуры этот параметр должен быть идентичен на всех процессах.

·  datatype – описатель типа данных элементов во входном буфере

·  op – описатель операции приведения (см. табл. 6.2)

·  comm – описатель коммуникатора.