Теория и практика параллельных вычислений

         

Обобщенная передача данных от всех процессов одному процессу


Операция обобщенной передачи данных от всех процессов одному процессу (сбор данных) является двойственной к процедуре распределения данных (см. рис. 5.5). Для выполнения этой операции в MPI предназначена функция:

int MPI_Gather(void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, int root, MPI_Comm comm),

где

  • sbuf, scount, stype — параметры передаваемого сообщения;
  • rbuf, rcount, rtype — параметры принимаемого сообщения;
  • root — ранг процесса, выполняющего сбор данных;
  • comm — коммуникатор, в рамках которого выполняется передача данных.


Рис. 5.5.  Общая схема операции обобщенной передачи данных от всех процессов одному процессу

При выполнении функции MPI_Gather каждый процесс в коммуникаторе передает данные из буфера sbuf на процесс с рангом root. Процесс с рангом root собирает все получаемые данные в буфере rbuf (размещение данных в буфере осуществляется в соответствии с рангами процессов – отправителей сообщений). Для того чтобы разместить все поступающие данные, размер буфера rbuf должен быть равен scount * p элементов, где p есть количество процессов в коммуникаторе comm.

Функция MPI_Gather также определяет коллективную операцию, и ее вызов при выполнении сбора данных должен быть обеспечен в каждом процессе коммуникатора.

Следует отметить, что при использовании функции MPI_Gather сборка данных осуществляется только на одном процессе. Для получения всех собираемых данных на каждом из процессов коммуникатора необходимо применять функцию сбора и рассылки:

int MPI_Allgather(void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, MPI_Comm comm),

где

  • sbuf, scount, stype — параметры передаваемого сообщения;
  • rbuf, rcount, rtype — параметры принимаемого сообщения;
  • comm — коммуникатор, в рамках которого выполняется передача данных.

Выполнение общего варианта операции сбора данных, когда размеры передаваемых процессами сообщений могут быть различны, обеспечивается при помощи функций MPI_Gatherv и MPI_Allgatherv.

Пример использования функции MPI_Gather рассматривается в лекции 6 при разработке параллельных программ умножения матрицы на вектор.



Содержание раздела