Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ / Parallelnoe_programmirovanie.doc
Скачиваний:
99
Добавлен:
15.02.2016
Размер:
274 Кб
Скачать
☆

2. Широковещательная передача mpi_bcast

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

MPI_Bcast (buffer, count, datatype, root, comm )

IN/OUT buffer - адрес начала буфера

IN count - количество записей в буфере (целое)

IN datatype - тип данных в буфере

IN root - номер корневого процесса (целое)

IN comm - коммуникатор

Функция MPI_Bcast осуществляет рассылку данных из буфера buf, содержащего count элементов типа type с процесса, имеющего номер root, всем процессам, входящим в коммуникатор comm. Следует отметить, что:

1. Функция MPI_Bcast определяет коллективную операцию и, тем самым, при выполнении необходимых рассылок данных вызов функции MPI_Bcast должен быть осуществлен всеми процессами указываемого коммуникатора.

2. Указываемый в функции MPI_Bcast буфер памяти имеет различное назначение в разных процессах. Для root процесса, с которого осуществляется рассылка данных, в этом буфере должно находиться рассылаемое сообщение. Для всех остальных процессов указываемый буфер предназначен для приема передаваемых данных.

Коллективная операция рассылки данных от одного процесса всем (распределение данных) MPI_Scatter отличается от широковещательной рассылки тем, что корневой процесс передает всем процессам различные данные. Данные выбираются из массива равными порциями в порядке возрастания номеров процессов.

Общая схема операции рассылки данных от одного процесса всем

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

Буфер отправки игнорируется всеми некорневыми процессами. Значения sendcount и sendtype, должны быть одинаковыми для всех процессов, таким образом, количество посланных и полученных данных для корневого и каждого другого процесса должно попарно совпадать. Также одинаковыми на всех процессах должны быть аргументы root и comm. Корневой процесс использует все аргументы функции, остальные процессы используют только аргументы для выполнения приема: recvbuf, recvcount, recvtype, root, comm.

Коллективная операция сбора данных MPI_Gather от всех процессов в одном является обратной операцией рассылки.

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

При выполнении операции сбора данных каждый процесс, включая корневой, посылает содержимое своего буфера в корневой процесс. Корневой процесс получает сообщения, располагая их в буфере приема равными порциями в порядке возрастания номеров процессов. Сообщения на root процесс могут приходить в разном порядке (например, от процесса 0, затем 2, затем 1, затем 3), при этом MPI гарантирует, что данные, посланные процессом с номером j, помещаются в j-ый блок приёмного буфера корневого процесса. Для того, чтобы разместить все поступающие данные, размер приемного буфера recvbuf должен быть равен sendcount * p элементов, где p есть количество процессов в группе. Функция MPI_Gather также определяет коллективную операцию, и ее вызов при выполнении сбора данных должен быть выполнен в каждом процессе группы.

Значения sendcount, sendtype у процесса j должны быть такими же, как значения recvcount, recvtype корневого процесса. Таким образом, количество отправленных и полученных данных для корневого и каждого другого процессов должно попарно совпадать. В корневом процессе используются все аргументы функции, в то время как у остальных процессов используются только аргументы sendbuf, sendcount, sendtype, root, comm. Аргументы comm и root должны иметь одинаковые значения во всех процессах.