- •Двухточечный обмен
- •Int mpi_Testall(int count, mpi_Request requests[], int *flag, mpi_Status statuses[])
- •Коллективный обмен
- •Int mpi_Scatterv(void *sendbuf, int *sendcounts, int *displs,
- •Int mpi_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
- •Int mpi_Reduce(void *buf, void *result, int count,
- •Int mpi_Op_create(mpi_User_function *function, int commute, mpi_Op *op)
- •Int mpi_Allreduce(void *sendbuf, void *rcvbuf, int count,
- •Int mpi_Scan(void *sendbuf, void *rcvbuf, int count, mpi_Datatype datatype, mpi_Op op, mpi_Comm comm)
- •Int mpi_Intercomm_create(mpi_Comm local_comm, int local_leader,
- •Топологии
- •Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
- •Int mpi_Cart_map(mpi_Comm comm_old, int ndims, int *dims, int *periods, int *newrank)
- •Производные типы
- •Атрибуты
- •Void *extra_state, void *attribute_val_in, void *attribute_val_out, int *flag)
- •Int mpi_Keyval_free(int *keyval)
- •Int mpi_Attr_put(mpi_Comm comm, int keyval, void* attribute)
- •Int mpi_Attr_get(mpi_Comm comm, int keyval, void *attribute, int *flag)
- •Int mpi_Attr_delete(mpi_Comm comm, int keyval)
- •Задание 3
Int mpi_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
MPI_Datatype sendtype, void *rcvbuf, int *rcvcounts, int *rdispls,
MPI_Datatype rcvtype, MPI_Comm comm)
MPI_ALLTOALLV(SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPE, RCVBUF, RCVCOUNTS, RDISPLS, RCVTYPE, COMM, IERR)
Ее параметры аналогичны параметрам подпрограммы MPI_Alltoall, кроме двух дополнительных параметров:
sdispls - целочисленный массив, количество элементов в котором равно количеству процессов в коммуникаторе. Элемент j задает смещение относительно начала буфера, из которого данные передаются j -му процессу.
rdispls - целочисленный массив, количество элементов в котором равно количеству процессов в коммуникаторе. Элемент i задает смещение относительно начала буфера, в который принимается сообщение от i -го процесса.
Операция приведения, результат которой передается одному процессу
Int mpi_Reduce(void *buf, void *result, int count,
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
MPI_REDUCE(BUF, RESULT, COUNT, DATATYPE, OP, ROOT, COMM, IERR)
Входные параметры:
buf - адрес буфера передачи;
count - количество элементов в буфере передачи;
datatype - тип данных в буфере передачи;
op - операция приведения;
root - ранг главного процесса;
comm - коммуникатор.
MPI_Reduce применяет операцию приведения к операндам из buf, а результат каждой операции помещается в буфер результата result (рис. 3.9). MPI_Reduceдолжна вызываться всеми процессами в коммуникаторе comm, а аргументы count, datatype и op в этих вызовах должны совпадать.
Рис. 3.9. Распределение данных при выполнении операции приведения
Предопределенные операции приведения приведены в табл. 3.3.
Определение собственных глобальных операций
Int mpi_Op_create(mpi_User_function *function, int commute, mpi_Op *op)
MPI_OP_CREATE(FUNCTION, COMMUTE, OP, IERR)
Входные параметры:
function - пользовательская функция;
commute - флаг, которому присваивается значение "истина", если операция коммутативна (результат не зависит от порядка операндов).
Описание типа пользовательской функции выглядит следующим образом:
typedef void (MPI_User_function)(void *a, void *b, int *len, MPI_Datatype *dtype)
Здесь операция определяется так:
b[I] = a[I] op b[I]
для I = 0, ..., len-1.
Таблица 3.3. Предопределенные операции приведения 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 |
Минимальные значения элементов одномерных массивов и их индексы |
Удаление пользовательской функции
int MPI_Op_free(MPI_Op *op)
MPI_OP_FREE(OP, IERR)
После завершения вызова op присваивается значение MPI_OP_NULL.
Одновременные сбор и распределение данных
int MPI_Reduce_scatter(void *sendbuf, void *rcvbuf, int *rcvcounts,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
MPI_REDUCE_SCATTER(SENDBUF,RCVBUF,RCVCOUNTS,DATATYPE,OP,COMM, IERR)
Входные параметры:
sendbuf - стартовый адрес буфера приема;
rcvcounts - целочисленный одномерный массив, который задает количество элементов в результирующем массиве, распределяемом каждому процессу. Этот массив должен быть одинаковым во всех процессах, вызывающих данную подпрограмму;
datatype - тип данных в буфере приема;
op - операция;
comm - коммуникатор.
Выходной параметр:
rcvbuf - стартовый адрес буфера приема.
Каждая задача получает не весь результирующий массив, а его часть.
Сбор данных от всех процессов и сохранение результата операции приведения в результирующем буфере каждого процесса