Коллективные обмены
Операции распределения и сбора данных
Распределение данных
Пример
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 среди всех процессов. Содержимое буфера передачи разбивается на несколько фрагментов, каждый из которых содержит sendcount элементов. Первый фрагмент передается процессу 0, второй процессу 1 и т. д. Аргументы send… имеют значение только на стороне распределяющего процесса root
Сбор данных
Сбор данных от остальных процессов в буфер главной задачи выполняется подпрограммой:
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 склеивает полученные данные в буфере приема.
Порядок склейки определяется рангами процессов: Аргументы rcvbuf, rcvcount и rcvtype играют роль только на стороне главного процесса. Аргумент rcvcount указывает количество элементов данных, полученных от каждого процесса (но НЕ суммарное их количество). При вызове подпрограмм MPI_Scatter и MPI_Gather из разных процессов следует использовать общий главный процесс.
int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, MPI_Comm comm) MPI_Allgather(sendbuf, sendcount, sendtype, rcvbuf, rcvcount, rcvtype, comm, ierr)
Входные параметры:
- sendbuf - начальный адрес буфера передачи;
- sendcount - количество элементов в буфере передачи;
- sendtype - тип передаваемых данных;
- rcvcount - количество элементов, полученных от каждого процесса;
- rcvtype - тип данных в буфере приема;
- comm - коммуникатор.
Выходной параметр: rcvbuf - адрес буфера приема.
Блок данных, переданный от j-го процесса, принимается каждым процессом и размещается в j-м блоке буфера приема recvbuf