· count — количество элементов в буфере передачи;
· datatype — тип данных в буфере передачи;
· ор — операция приведения;
· root — ранг главного процесса;
· comm — коммуникатор.
Подпрограмма MPI_Reduce применяет операцию приведения к операндам из buf, а результат каждой операции помещается в буфер результата result. MPI_Reduce должна вызываться всеми процессами в коммуникаторе comm, а аргументы count, datatype и op в этих вызовах должны совпадать. Функция приведения (ор) не возвращает код ошибки, поэтому при возникновении аварийной ситуации либо завершается работа всей программы, либо ошибка молчаливо игнорируется. И то и другое в равной степени нежелательно.
В MPI имеется 12 предопределенных операций приведения (табл. 6.2).
Операция |
Описание |
МР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 – описатель коммуникатора.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.