Параллельное программирование: Учебное пособие, страница 112

Распределение и сбор данных выполняются с помощью подпрограмм MPI_Scatter и MPI_Gather соответственно. Список аргументов у обеих подпрограмм одинаков, но действуют они по-разному.

На рис. 6.2 и 6.3 приведены схемы передачи данных для операций сбора и распределения данных.


Рисунок 6.2.Схема передачи данных в операции сбора данных

При широковещательной рассылке всем процессам передается один и тот же набор данных, а при распределении передаются его части. Выполняется распределение данных подпрограммой MPI_Scatter, которая пересылает данные от одного процесса всем остальным процессам в группе так, как это показано на рис. 6.3. Разнообразие подпрограмм распределения и сбора данных представлено таблицей 6.1.


Рисунок 6.3.Схема передачи данных в операции распределения данных

Таблица 6.1. Подпрограммы распределения и сбора данных

Подпрограмма

Краткое описание

MPI_Allgather

Собирает данные от всех процессов и пересылает их всем процессам.

MPI_Allgatherv

Собирает данные от всех процессов в виде векторов и пересылает их всем процессам аналогично подпрограмме MPI_Allgather.

MPI_Allreduce

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

MPI_Alltoall

Пересылает данные от всех процессов всем процессам.

MPI_Alltoallv

Пересылает векторные данные от всех процессов всем процессам подобно MPI_Alltoall.

MPI_Gather

Собирает данные от группы процессов.

MPI_Gatherv

Собирает векторные данные от группы процессов подобно подпрограмме MPI_Gather.

MPI_Reduce

Выполняет операцию приведения, т. е. вычисление единственного значения по массиву исходных данных.

MPI_Reduce_scatter

    Сбор значений с последующим распределением результата операции приведения.

MPI_Scan

Выполнение операции сканирования (частичная редукция) для данных от группы процессов.

MPI_Scatter

Распределяет данные от одного процесса всем остальным процессам в группе.

MPI_Scatterv

Пересылает буфер по частям всем процессам в группе ("векторный" вариант подпрограммы MPI_Scatter).

Объявление подпрограммы распределения данных и смысл входящих в нее параметров на языке С++ представляется так:

int MPI_Scatter(void *sendbuf, int sendcount,

MPI_Datatype sendtype, void *rcvbuf,

int rcvcount, MPI_Datatype rcvtype,

int root, MPI_Comm comm)

Входные параметры:

·  sendbuf — адрес буфера передачи;

·  sendcount — количество элементов, пересылаемых каждому процессу, но не суммарное их число в буфере передачи;

·  sendtype — тип передаваемых данных;

·  rcvcount — количество элементов в буфере приема;

·  rcvtype — тип принимаемых данных;

·  root — ранг передающего процесса;

·  comm — коммуникатор.

Выходной параметр:

·  rcvbuf — адрес буфера приема.

Работает эта подпрограмма следующим образом. Процесс с рангом root (корневой процесс) распределяет содержимое буфера передачи sendbuf среди всех процессов. Содержимое буфера передачи разбивается на несколько фрагментов, каждый из которых содержит sendcount элементов. Первый фрагмент передается процессу 0, второй процессу 1 и т. д. Аргументы send имеют значение только на стороне процесса root.

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

int MPI_Gather(void *sendbuf, int sendcount,

MPI_Datatype sendtype, void *rcvbuf,

int rcvcount, MPI_Datatype rcvtype,

int root, MPI_Comm comm)