- •Двухточечный обмен
- •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_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
MPI_BCAST(BUFFER, COUNT, DATATYPE, ROOT, COMM, IERR)
Параметры этой процедуры одновременно являются входными и выходными:
buffer - адрес буфера;
count - количество элементов данных в сообщении;
datatype - тип данных MPI ;
root - ранг главного процесса, выполняющего широковещательную рассылку;
comm - коммуникатор.
Схема распределения данных представлена на рис. 3.4.
Рис. 3.4. Распределение данных при широковещательной рассылке
Синхронизация с помощью "барьера" (рис. 3.5)
int MPI_Barrier(MPI_Comm comm)
MPI_BARRIER(COMM, IERR)
Рис. 3.5. Синхронизация с "барьером"
При синхронизации с барьером выполнение каждого процесса из данного коммуникатора приостанавливается до тех пор, пока все процессы не выполнят вызов процедуры синхронизации MPI_Barrier.
Распределение данных
int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount,
MPI_Datatype rcvtype, int root, MPI_Comm comm)
MPI_SCATTER(SENDBUF,SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT,
RCVTYPE, ROOT, COMM, IERR)
Входные параметры:
sendbuf - адрес буфера передачи;
sendcount - количество элементов, пересылаемых каждому процессу (но не суммарное количество пересылаемых элементов);
sendtype - тип передаваемых данных;
rcvcount - количество элементов в буфере приема;
rcvtype - тип принимаемых данных;
root - ранг передающего процесса;
comm - коммуникатор.
Выходной параметр:
rcvbuf - адрес буфера приема.
Процесс с рангом root распределяет содержимое буфера передачи sendbuf среди всех процессов (рис. 3.6). Содержимое буфера передачи разбивается на несколько фрагментов, каждый из которых содержит sendcount элементов. Первый фрагмент передается процессу 0, второй процессу 1 и т. д. Аргументы sendимеют значение только на стороне процесса root.
Рис. 3.6. Распределение данных при выполнении операции Scatter
Сбор сообщений от остальных процессов в буфер главной задачи
int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf,
int rcvcount, MPI_Datatype rcvtype, int root, MPI_Comm comm)
MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, ROOT, COMM, IERR)
Каждый процесс в коммуникаторе comm пересылает содержимое буфера передачи sendbuf процессу с рангом root. Процесс root "склеивает" полученные данные в буфере приема (рис. 3.7). Порядок склейки определяется рангами процессов, то есть в результирующем наборе после данных от процесса 0 следуют данные от процесса 1, затем данные от процесса 2 и т. д. Аргументы rcvbuf, rcvcount и rcvtype играют роль только на стороне главного процесса. Аргумент rcvcountуказывает количество элементов данных, полученных от каждого процесса (но не суммарное их количество). При вызове подпрограмм MPI_Scatter и MPI_Gatherиз разных процессов следует использовать общий главный процесс.
Рис. 3.7. Сбор данных при выполнении операции Gather
Векторная подпрограмма распределения данных