Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельное программирование на основе MPI.doc
Скачиваний:
125
Добавлен:
11.04.2015
Размер:
941.57 Кб
Скачать

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

Обобщенная операция передачи данных от одного процессавсемпроцессам(распределение данных) отличается от широковещательной рассылки тем, чтопроцесспередаетпроцессамразличающиеся данные (см.рис. 5.4). Выполнение данной операции может быть обеспечено при помощи функции:

int MPI_Scatter(void *sbuf, int scount, MPI_Datatype stype,

void *rbuf, int rcount, MPI_Datatype rtype, int root,

MPI_Comm comm),

где

  • sbuf, scount, stype — параметры передаваемого сообщения (scount определяет количество элементов, передаваемых на каждый процесс);

  • rbuf, rcount, rtype — параметры сообщения, принимаемого в процессах;

  • root — ранг процесса, выполняющего рассылку данных;

  • comm — коммуникатор, в рамках которого выполняется передача данных.

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

При вызове этой функции процессс рангомrootпроизведет передачу данных всем другимпроцессамв коммуникаторе. Каждомупроцессубудет отправленоscountэлементов.Процессс рангом0получит блок данных изsbufэлементов с индексами от0доscount-1,процессус рангом1будет отправлен блок изsbufэлементов с индексами отscountдо2*scount-1и т.д. Тем самым, общий размер отправляемого сообщения должен быть равенscount * pэлементов, где p есть количествопроцессовв коммуникатореcomm.

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

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

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

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

Операция обобщенной передачи данных от всех процессоводномупроцессу(сбор данных) является двойственной к процедуре распределения данных (см.рис. 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при разработкепараллельных программумножения матрицы на вектор.