Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 956 / 174 | Длительность: 05:14:00
Лекция 5:

Коллективные обмены

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Операции распределения и сбора данных

Распределение данных

Пример

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


< Лекция 4 || Лекция 5: 123 || Лекция 6 >