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; просмотров: 1561;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.