Функция синхронизации процессов
Функция синхронизации процессовMPI_Barrier блокирует работу вызвавшего ее процесса до тех пор, пока все другие процессы группы также не вызовут эту функцию. Завершение работы этой функции возможно только всеми процессами одновременно (все процессы «преодолевают барьер» одновременно).
Int MPI_Barrier(MPI_Comm comm);
Синхронизация с помощью барьеров используется, например, для завершения всеми процессами некоторого этапа решения задачи, результаты которого будут использоваться на следующем этапе. Использование барьера гарантирует, что ни один из процессов не приступит раньше времени к выполнению следующего этапа, пока результат работы предыдущего не будет окончательно сформирован. Неявную синхронизацию процессов выполняет любая коллективная функция.
Широковещательная рассылка данных
Широковещательная рассылка данных выполняется с помощью функции MPI_Bcast. Процесс с номером root рассылает сообщение из своего буфера передачи всем процессам области связи коммуникатора comm.
int MPI_Bcast (void* buffer, int count,
MPI_Datatype datatype, int root,
MPI_Comm comm);
В результате вызова функции каждый процесс в области связи коммуникатора comm, включая процесс-отправитель, получит копию сообщения от процесса-отправителя root. Отправляемые данные берутся, начиная с адреса buffer, в количестве count элементов типа MPI_Datatype.
В коде MPI-программы функция MPI_Bcast не должна вызываться только одним каким-то процессом.
Рассмотрим пример использования функции MPI_Bcast:
#include "stdafx.h"
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int proc_rank, proc_count;
int mas[10]; // Массив данных на 10 интов
int i;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &proc_count);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
//==========================================================
if (proc_rank==0) // Если это "главный" процесс
{
// Заполняем массив числами от 1 до 10.
// Заполнение массива делается только в
// нулевом процессе. В остальных процессах
// массив изначально неинициализирован.
for (i=0; i<10; i++)
mas[i]=i+1;
// Участвуем в широковещательной рассылке массива:
MPI_Bcast (mas, 10, MPI_INT, 0, MPI_COMM_WORLD);
// Распечатываем полученный от самого себя массив:
for (i=0; i<10; i++)
cout << proc_rank << '_' << mas[i] << " ";
cout << '\n';
} // if - процесс 0
//==========================================================
if (proc_rank>0) // Если это не главный процесс
{
// Участвуем в широковещательной рассылке массива:
Дата добавления: 2016-02-02; просмотров: 792;