30135

ИЗУЧЕНИЕ МОДЕЛЕЙ ВЗАИМОДЕЙСТВИЯ РАСПРЕДЕЛЕННО ВЫПОЛНЯЮЩИХСЯ ПРОЦЕССОВ

Лабораторная работа

Информатика, кибернетика и программирование

Осуществить построение топологии сети требуемого вида (рис. 3.1); выполнить широковещательную рассылку вводимого с клавиатуры сообщения от узла S на все остальные узлы. На узле, инициирующем рассылку, выводить (в виде матрицы) топологию сети и остовное дерево, на остальных хостах сети после получения сообщения выводить номер хоста и сам текст сообщения.

Русский

2013-08-23

65.72 KB

7 чел.

Министерство образования, науки, молодежи и спорта Украины

Севастопольский национальный технический университет

Лабораторная работа №5

ИЗУЧЕНИЕ МОДЕЛЕЙ ВЗАИМОДЕЙСТВИЯ РАСПРЕДЕЛЕННО ВЫПОЛНЯЮЩИХСЯ ПРОЦЕССОВ

Выполнил:

Ст. гр. И-32д

Сычев П.Ю

Проверил:

Кротов К.В

Севастополь

2012

Цель работы:

Изучить алгоритмическое построение взаимодействий распределено выполняющихся процессов.

Вариант 1

Осуществить построение топологии сети требуемого вида (рис. 3.1); выполнить широковещательную рассылку вводимого с клавиатуры сообщения от узла S на все остальные узлы. На узле, инициирующем рассылку, выводить (в виде матрицы) топологию сети и остовное дерево, на остальных хостах сети после получения сообщения выводить номер хоста и сам текст сообщения.

Текст программы:

// lab5.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "mpi.h"

#include "conio.h"

#include "iostream"

using namespace std;

int main(int argc, char **argv)

{

int rank;

   MPI_Status status;

 MPI_Comm new_comm;

//массив, описывающий степени узлов

int index[]={2,5,7,10,12};

//массив, описывающий ребра графа

 int edges[]={1,3,0,2,4,1,3,0,2,4,1,3};

int message[300];

int* temp;

temp=new int[300];

 

   MPI_Init(&argc, &argv);

   MPI_Comm_rank(MPI_COMM_WORLD, &rank);

//создание топологии графа

MPI_Graph_create(MPI_COMM_WORLD,5,index,edges,false,&new_comm);

 int count;

//узнаем количество соседей процесса в топологии

 MPI_Graph_neighbors_count(new_comm,rank,&count);

int* nei=new int[count];

 //получаем список соседей процесса в топологии

 MPI_Graph_neighbors(new_comm,rank,count,nei);

MPI_Comm_rank(new_comm, &rank);

 int first;

/*

Все процессы кроме первого начинают свою работу

с того, что ожидают зонда

*/

 if (rank)

{

 //ожидание зонда

 MPI_Recv(message,300,MPI_INT,MPI_ANY_SOURCE,99,new_comm,&status);

 cout<<"Process "<<rank<<"\t Recv zond from process "<<message[1]<<endl;

 /*

 Запоминаем тот процесс, который первым прислал нам зонд.

 Ему нужно будет вернуть эхо

 */

 if (message[0]==1)

  first=message[1];

}

/*

message[0] - тип сообщения

     =1 - зонд

     =2 - эхо

message[1] - ID источника соообщение

*/

message[0]=1;

message[1]=rank;

//каждый процесс рассылает всем своим соседям зонды

 for (int i=0;i<count;i++)

{

 cout<<"Process "<<rank<<"\t Send zond to process "<<nei[i]<<endl;

 MPI_Send(message,300,MPI_INT,nei[i],99,new_comm);

}

int from;

int all=count*2;

if (rank)

 all--;

for (int i=0;i<300;i++)

 temp[i]=0;

/*

В матрице temp(и message), которая будет передаваться в сообщении,

в элементах с индексами от 2 до 2+25 будет храниться последовательность

строк двумерной матрицы связности кластера.

Т.е. temp[i][j]=1, если есть ребро соединяющее вершины i и j

Иначе элемент равен 0

*/

//Записываем строку матрицы топологии для процесса rank

 for (int i=0;i<count;i++)

{

 temp[ rank*5 + nei[i] + 2 ]=1;

 temp[ nei[i]*5 + rank + 2]=1;

}

for (int i=0;i<all;i++)

{

 MPI_Recv(message,300,MPI_INT,MPI_ANY_SOURCE,99,new_comm,&status);

 cout<<"Process "<<rank<<"\t Recv message from process "<<message[1];

 if (message[0]==1)

  cout<<"\t It is zond ";

 else

  cout<<"\t It is echo ";

 cout<<endl;

 //зонд

 if (message[0]==1)

 {

  //узнаем, от окго пришло сообщение

  from=message[1];

  message[0]=2;

  message[1]=rank;

  //message[99]==-1 - признак пустого эха

  message[99]=-1;

  cout<<"Process "<<rank<<"\t Send empty echo to process "<<from<<endl;

  MPI_Send(message,300,MPI_INT,from,99,new_comm);

 }

 //эхо

 else if (message[0]==2)

 {

  //не пустое

  if (message[99]!=-1)

  {

   //добавляем полученную часть топологии

   for (int i=2;i<300;i++)

    if (message[i]==1)

     temp[i]=1;

  }

 }

}

if (rank)

{

 cout<<"Process "<<rank<<"\t Send final echo to process "<<first<<endl;

 temp[99]=1;

 temp[0]=2;

 temp[1]=rank;

 MPI_Send(temp,300,MPI_INT,first,99,new_comm);

}

if (!rank)

{

 cout<<endl<<"Topologiya klastera"<<endl;

 for (int i=0;i<5;i++)

 {

  for (int j=0;j<5;j++)

  {

   cout<<temp[5*i + j + 2]<<"\t";

  }

  cout<<endl;

 }

 cout<<endl;

}

int ostov[5][5];

for (int i=0;i<5;i++)

 for (int j=0;j<5;j++)

  ostov[i][j]=0;

/*

Получаем из топологии остов дерева

На каждом шаге алгоритма добавляем по одному ребру

т.о., чтобы одна вершина ребра была среди уже добавленных,

а вторая - нет. Эту, вторую вершину, добавляем в список добавленных.

Вершина на первом шаге добавляется произвольно

 */

if (!rank)

{

 bool used[5];

 for (int i=0;i<5;i++)

  used[i]=false;

 used[0]=true;

 for (int i=0;i<4;i++)

 {

  bool done=false;

  for (int j=0;j<5;j++)

  {

   if (used[j])

   {

    for (int k=0;k<5;k++)

     if ((!used[k])&&(temp[5*j + k + 2]))

     {

      ostov[j][k]=1;

      ostov[k][j]=1;

      done=true;

      used[k]=true;

      break;

     }      

   }   

   if (done)

    break;

  }

 }

 cout<<endl<<"Ostovnoe derevo"<<endl;

 for (int i=0;i<5;i++)

 {

  for (int j=0;j<5;j++)

  {

   cout<<ostov[i][j]<<"\t";

  }

  cout<<endl;

 }

 cout<<endl<<"Enter the message "<<endl;

 }

char s[250];

/*

Считываем строку

Сообщение будем передавать в массиве temp

temp[0] - длина строки

далее идет temp[0] элементов массива temp, определяющих строку

каждый элемент - очередная буква строки

после строки 25 элементов матрицы temp - остовное дерево

 */

if (!rank)

{

 scanf("%s",s);

 temp[0]=strlen(s);

 for (int i=0;i<temp[0];i++)

 {

  temp[i+1]=(int)s[i];

 }

 for (int i=0;i<5;i++)

  for (int j=0;j<5;j++)

   temp[temp[0] + 1 + 5*i + j]=ostov[i][j];

 }

/*

Все процессы кроме первого принимают одно сообщение

 */

if (rank)

{

 MPI_Recv(temp,300,MPI_INT,MPI_ANY_SOURCE,99,new_comm,&status);

 for (int i=0;i<temp[0];i++)

  s[i]=(char)temp[i+1];

 s[temp[0]]='\0';

 cout<<"Process "<<rank<<"\t Message "<<s<<endl;

 }

/*

Весь столбец остовной матрицы, соотв. процессу rank, обнуляется

Для того, чтобы снова не отсылать ему сообщение, которое он сам разослал

*/

for (int i=0;i<5;i++)

{

 temp[temp[0] + 1 + 5*i + rank]=0;

}

/*

Отсылаем сообщения каждому соседу, только если не получили от

него сообщение сами

*/

for (int i=0;i<5;i++)

 if (temp[temp[0] + 1 + 5*rank + i]==1)

  MPI_Send(temp,300,MPI_INT,i,99,new_comm);

 MPI_Finalize();

return 0;

}

Вывод:

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


 

А также другие работы, которые могут Вас заинтересовать

63800. Заболеваемость и методы её изучения 28.5 KB
  Населения характеризует распространение заболеваний среди всего населения или отдельных его групп в расчете на 1000 или 10000 человек. имеют важнейшее значение для научной организации системы медико-санитарного обслуживания населения...
63801. Характеристика уровней и структур причин заболеваемости 27 KB
  В структуре причин с возрастом все большую роль играют несчастные случаи и инфекционные заболевания. У женщин до 20 лет болезни связанные с беременностью с возрастом больше проявляются хронические заболевания. После 60 лет выявляются на 1 больного 25 3 заболевания...
63802. Заболеваемость с временной утратой трудоспособности 26 KB
  Единицей наблюдения при изучении заболеваемости с ВУТ является каждый случай временной нетрудоспособности в связи с заболеванием или травмой в данном году. Учетным документом служит листок нетрудоспособности который является не только медицинским...
63803. Инвалидность и инвалидизация населения 24.5 KB
  В России средний уровень инвалидности колеблется от 40 до 49 на 10000 жителей. 3 группы инвалидности: 1 группа полная утрата способности к регулярному профессиональному труду в обычных условиях и нуждающихся в постоянном уходе.
63805. Организация медицинской помощи городскому населению 25.5 KB
  В настоящее время в России основными стационарными учреждениями являются центральные районные городские областные и республиканские больницы. В первую группу входят больницы которые обслуживают только местное население и выполняют локальные функции.
63806. Поликлиника 35.5 KB
  Кабинет доврачебного приема Отделение профилактики в крупных поликлиниках. Лечебно-профилактическое отделение: кабинеты участковых терапевтов; подростковый кабинет; специальные кабинеты неврологический лор и др.