30135

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

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

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

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

Русский

2013-08-23

65.72 KB

8 чел.

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

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

Лабораторная работа №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;

}

Вывод:

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


 

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

21789. Теоретические аспекты риск-менеджмента 70 KB
  Основные принципы управления рисками 3. Анализ риска 4. Методы количественного анализа риска 1. Содержание рискменеджмента Рискменеджмент система управления рисками на предприятии которая представляет собой совокупность методов приемов и мероприятий позволяющих в определенной степени прогнозировать наступление рисковых событий и принимать меры к исключению или снижению отрицательных последствий наступления таких событий.
21790. Риск и доход 72 KB
  Величина FV показывает будущую стоимость сегодняшней величины PV при заданном уровне доходности. Концепция риска и доходности в финансовом менеджменте Риск и доходность в финансовом менеджменте и анализе рассматриваются как две взаимосвязанные категории. Активы с которыми ассоциируется относительно больший размер возможных потерь рассматриваются как более рисковые; вполне естественно что к таким активам предъявляются и большие требования в отношении доходности.
21791. Управление рисками и антикризисное управление 81 KB
  Главная задача антикризисного управления обеспечение такого положения предприятия на рынке когда оно может преодолеть временные трудности в том числе и финансовые посредством использования всех возможностей современного менеджмента. главной целью его является обеспечение стабильного положения на рынке компании при любых экономических политических и социальных изменениях в стране; в его рамках применяются в основном те управленческие инструменты которые наиболее эффективны в устранении временных финансовых затруднений и решении других...
21792. Санитарные требования к транспортированию, приему, хранению, механической кулинарной обработке пищевых продуктов 75 KB
  ПЛАН ЛЕКЦИИ : Санитарные требования к транспортированию пищевых продуктов. Санитарные требования к приему и хранению пищевых продуктов. Санитарные требования к механической кулинарной обработке пищевых продуктов.
21793. Санитпрные требования к содержанию предприятий общественного питания 110.5 KB
  Санитарные требования к содержанию территории и помещений предприятий общественного питания. Цель способы и средства дезинфекции в предприятиях общественного питания. Гигиена и санитария общественного питания: Учебник для техн.
21794. Санитарные требования к тепловой обработке пищевых продуктов, хранению и раздаче готовой пищи 91 KB
  Санитарные требования к изготовлению кремовых изделий и пирожков во фритюре. Органолептическими признаками готовности мясных изделий являются выделение бесцветного сока в месте прокола и серый цвет на разрезе продукта при этом температура в центре готовых изделий должна быть не ниже 85 град. C для натуральных рубленых изделий и не ниже 90 град. C для изделий из котлетной массы.
21795. Гигиенические требования к факторам внешней среды и благоустройству предприятий общественного питания 112.5 KB
  Гигиена воздуха: а физические свойства воздуха; б химический состав воздуха; в загрязнение воздуха вредными примесями влияющими на организм и условия труда работников предприятия общественного питания. При этом оценивая влияние различных факторов внешней среды на организм человека обычно выделяют преимущественный фактор который по своим параметрам имеет наибольшее отклонение от требований организма человека например повышенная температура воздуха или запылённость его. 2 вопрос Гигиена воздуха Среди факторов внешней среды...
21796. Санитарный надзор в области гигиены паитания 88.5 KB
  Санитарный надзор в области гигиены паитания План лекции Предмет и задачи гигиены и санитарии Органы и службы государственного санитарного надзора Министерства здравоохранения Украины Основные направления предупредительного и текущего государственного санитарного надзора за предприятиями общественного питания Краткий обзор развития науки о питании Литература основная Закон Украины Об обеспечении санитарного и эпидемического благополучия населения от 24. Гигиена и санитария общественного питания: Учебник для технол. Гигиена и...
21797. Кишечные инфекции и их профилактика 73.5 KB
  48 стор 1 вопрос Общие сведения об инфекционных заболеваниях. Патогенные микроорганизмы могут вызывать различные заболевания в том числе и инфекционные. Инфекционные заболевания человека могут проходить в трех формах: При заболевании нарушаются физиологические функции организма и организм выводится из состояния равновесия с окружающей средой то есть развивается инфекционное заболевание и при этом признаки заболевания проявляются резко; Признаки заболевания проявляются не резко и как правило такие...