Распределение и сбор данных выполняются с помощью подпрограмм MPI_Scatter и MPI_Gather соответственно. Список аргументов у обеих подпрограмм одинаков, но действуют они по-разному.
На рис. 6.2 и 6.3 приведены схемы передачи данных для операций сбора и распределения данных.
Рисунок 6.2.Схема передачи данных в операции сбора данных
При широковещательной рассылке всем процессам передается один и тот же набор данных, а при распределении передаются его части. Выполняется распределение данных подпрограммой MPI_Scatter, которая пересылает данные от одного процесса всем остальным процессам в группе так, как это показано на рис. 6.3. Разнообразие подпрограмм распределения и сбора данных представлено таблицей 6.1.
Рисунок 6.3.Схема передачи данных в операции распределения данных
Подпрограмма |
Краткое описание |
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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.