30135

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

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

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

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

Русский

2013-08-23

65.72 KB

6 чел.

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

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

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

}

Вывод:

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


 

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

54198. Сценарій позакласного заходу: «Математика – зліва, математика - справа» 134 KB
  Бажаю вам дорогі друзі шановні академіки успіхів у вивченні цариці наук Математики 1 учень вбігає Хлопці я чув що в школі буде тиждень математики Уявляєте весь тиждень сама лиш тільки математика 2 учень з місця Та не може такого бути 3 учень вбігає У мене для вас ось така новина Всіх вчителів направили на курси залишилися лише математики. 1 учень Ну. Учень Як зібрався математику вивчати То до класу на уроки вирушай. Виконується цікавий номер Учень Сорокап'ятирічний чоловік покохав п'ятнадцятирічну дівчину.
54200. Конкурс знавців математики «Мадонна Математика» 714 KB
  Сьогодні будемо ми друзі Царицю всіх наук вітати. Не всі ви в майбутньому станете математиками але математика потрібна і в науці і в техніці і в повсякденному житті. Ще в давні часи математику називали царицею наук ключем до всіх наук. Одне слово одне слово Математику Чом по курсу спішать на морях кораблі Хуртовини й тумани долають в імлі Капітани не ледачі Не лякають їх задачі Одне слово одне слово Математики Хочеш лікарем стати хочеш в космос літати Перш за все треба друже математику знати Всі повинні шанувати Ікси...
54201. Математична конференція «Золотий переріз – душа гармонії» 502 KB
  І називається вона Золотий переріз душа гармонії. Теорему Піфагора знає кожен школяр а про золотий переріз – далеко не всі. Про золотий переріз знали ще в Давньому Єгипті й Вавилоні в Індії та Китаї.
54202. Математичний гурток для творчих дітей 623 KB
  Для пробудження в учнів інтересу до математики дуже важлива позакласна робота та особливо гурткова. Декілька років я керую гуртком «Цікава математика». Основним своїм завданням як керівника гуртка вважаю саме пробудження інтересу до свого предмету. До роботи в гуртку я залучаю в першу чергу творчих дітей, які не дуже дружать з математикою, бо не бачать в ній можливостей для реалізації своїх творчих сил.
54203. Математика і поезія – два крила натхнення 417.5 KB
  Прищеплювати інтерес до предметів математики та літератури; активізувати і стимулювати розумову і пізнавальну діяльність учнів; розвивати вміння й навички розмірковувати, розширювати кругозір; виховувати в учнів свідоме ставлення до одержання знань.
54204. Додавання та віднімання чисел частинами. Задачі на різницеве порівняння 60 KB
  Правильно це Буратіно. Відправляючись в країну дурнів Буратіно потрапляє в казковий математичний ліс. Ось і вибрався Буратіно із лісу знайшов стежку і вона привела його до будинку Мальвіни. Мальвіна запросила Буратіно в гості напоїла чаєм і вирішила перевірити його знання з математики.
54205. Множення чисел 1 і 0. Множення на 1 і 0. Задачі на дві і три дії 36 KB
  Множення чисел 1 і 0. Множення на 1 і 0.Ознайомити учнів із випадками множення коли одним із множників є число 1 чи 0. Що таке множення Як називаються числа при множенні Що показує перший другий множник 2.
54206. Перетин прямих. Точка. Відрізки та їх порівняння. Приклади на додавання 108.5 KB
  Які саме У кожній країні на кожному кроці зустрічаються фігури такі як на дошці додаток 1. Будинки стоять вздовж прямої з обох боків додаток 2. Курка пробігла розсипала зернята додаток 3. А якщо розглянути лінію від точки до точки то бачимо що вона має початок та кінець – це відрізок додаток 4.