MPI_Bcast (mas, 10, MPI_INT, 0, MPI_COMM_WORLD);
// Распечатываем полученный от процесса 0 массив:
for (i=0; i<10; i++)
cout << proc_rank << '_' << mas[i] << " ";
cout << '\n';
}
//==========================================================
MPI_Finalize();
// закрываем MPI-библиотеку
return 0;
}
В данной программе с помощью блоков if выделены области кода, выполняемые определенными процессами. В частности, первый оператор if содержит блок кода для процесса с рангом 0, второй оператор if содержит блок кода для всех процессов с ненулевым рангом.
Процесс с рангом 0, запустившись, инициализирует массив mas числами от 1 до 10. При этом остальные процессы начальной инициализации не делают.
Рано или поздно все процессы дойдут до вызова функции MPI_Bcast. В процессе ее выполнения содержимое массива mas нулевого процесса будет скопировано в массив mas всех остальных процессов.
В заключение каждый из процессов распечатает на экране содержимое своего массива. Для наглядности перед значением каждого элемента через символ «_» печатается ранг соответствующего процесса.
Например, для восьми процессов результат работы программы может быть следующим:
5_1 5_2 5_3 5_4 5_5 5_6 5_7 5_8 5_9 5_10
2_1 2_2 2_3 2_4 2_5 2_6 2_7 2_8 2_9 2_10
6_1 6_2 6_3 6_4 6_5 6_6 6_7 6_8 6_9 6_10
0_1 0_2 0_3 0_4 0_5 0_6 0_7 0_8 0_9 0_10
4_1 4_2 4_3 4_4 4_5 4_6 4_7 4_8 4_9 4_10
7_1 7_2 7_3 7_4 7_5 7_6 7_7 7_8 7_9 7_10
3_1 3_2 3_3 3_4 3_5 3_6 3_7 3_8 3_9 3_10
1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 1_10
Рассмотренный пример программы можно записать более кратко, если учесть, что:
– вызов функции MPI_Bcast синтаксически не отличается для процессов разных рангов;
– все процессы после вызова MPI_Bcast делают в точности одно и то же: распечатывают массив mas.
Тогда программа принимает следующий вид:
#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];
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) // Если это "главный" процесс
{
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';
MPI_Finalize();
// закрываем MPI-библиотеку
Return 0;
}
Как можно видеть, в блок if вынесены действия, свойственные только процессу с рангом 0. Все последующие действия являются одинаковыми для всех процессов. Если после широковещательной рассылки данных необходимо снова разделить действия для разных процессов, после функции MPI_Bcast можно снова использовать операторы if, анализирующие ранг процесса.
Дата добавления: 2016-02-02; просмотров: 1567;