Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dodatok_B_and_V.docx
Скачиваний:
1
Добавлен:
09.09.2019
Размер:
34.94 Кб
Скачать

Лістинг паралельної програми для реалізації алгоритму Флойда

#include <iostream>

#include <fstream>

#include <cmath>

#include <cstdlib>

#include <iomanip>

#include "mpi.h"

using namespace std;

#define n 500//Кількість вершин графа.

#define N 8//Кількість процесів.

int main(int argv,char *argc[])

{

int *Mas; //Матриця ваг дуг.

int *D; //Матриця відстаней.

int *S; //Матриця послідовності вузлів.

int Operator; //Трикутний оператор.

int start_node=-1,end_node=-1;//Початкова та кінцева вершини.

/*Параметри, необхідні для паралельної частини*/

double time;//Змінна для визначення часу виконання програми

int ProcNum,ProcRank,root=0;//Кількість та номер процесу

int ndims,*dims; //Кількість вимірів топології та процесів в кожному вимірі

int *periods,reorder=1;

MPI_Comm cube_comm;//Новий комунікатор для гіперкуба

/*-------ВИЗНАЧЕННЯ ДЕЯКИХ ПАРАМЕТРІВ----------*/

Mas = new int[n*n];

D = new int[n*n];

S = new int[n*n];

ndims=3;// - гіперкуб повинен бути 3-вимірним

dims=new int[ndims];

periods= new int[ndims];

for(int i=0;i<ndims;i++){

dims[i]=0;

periods[i]=1;}

/*----------------------------------------------*/

/*++++++++++++++++ПАРАЛЕЛЬНА ЧАСТИНА++++++++++++++++++++*/

MPI_Init(&argv,&argc);

//Початок ведення обліку часу

time=MPI_Wtime();

MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);

MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank);

//Якщо кількість процесів менша за ту, яку необхідно для створенням куба,

// то виконується вихід

if(ProcNum<N){

if(ProcRank==0)

cout<<"ERROR: Too litle process to continue, aplication has”;

cout<<”been close\n"<<"Press any key\n\n";

MPI_Finalize();return(0);}

/*----СТВОРЕННЯ ТОПОЛОГІЇ ГІПЕРКУБА(КОМУНІКАТОРА)----*/

//Деякі параметри, не обхідні для роботи

Int *source,*dest;

source = new int[ndims];

dest = new int[ndims];

//Виклик функції створення декартової топології

MPI_Dims_create(ProcNum,ndims,dims);

MPI_Cart_create(MPI_COMM_WORLD,ndims,dims,periods,reorder,&cube_comm);

MPI_Comm_rank(cube_comm,&ProcRank);

//Виконання зсуву по всым вимырам

MPI_Cart_shift(cube_comm,0,-1,&source[0],&dest[0]);

MPI_Cart_shift(cube_comm,1,-1,&source[1],&dest[1]);

MPI_Cart_shift(cube_comm,2,-1,&source[2],&dest[2]);

delete(source);

delete(dest);

/*-----------------------------------------------------------*/

/*----РОЗПОДІЛ ДАНИХ ДЛЯ ОБЧИСЛЕНЬ ПО ПРОЦЕСАХ ----*/

//Утворення ваг дуг на 0-му процесі

if(ProcRank==0){

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

for(int j=0;j<n;j++){

S[i*n+j]=j;

if(i==j){

Mas[i*n+j]=-1;

S[i*n+j]=-1;}

else if(rand()%2==1) Mas[i*n+j]=rand()%N+1;

else Mas[i*n+j]=0;

D[i*n+j]=Mas[i*n+j];}

}

//Оголошення необхідних змінних для передачі

Int scount,rows_count;//кількість елементів для передачі

Int *my_d,*my_s,*my_Mas;//масиви для приймання, що міститимуть матриці d та s

//Розрахунок кількості рядків(елементів), що потрібно передати кожному //процесору

scount=n*n/N;

rows_count=scount/n;

//Передача повідомлень від головного процесу всім іншим

my_D = new int[scount];

my_S = new int[scount];

my_Mas = new int[scount];

MPI_Scatter(Mas,scount,MPI_INT,my_Mas,scount,MPI_INT,root,cube_comm);

MPI_Scatter(D,scount,MPI_INT,my_D,scount,MPI_INT,root,cube_comm);

MPI_Scatter(S,scount,MPI_INT,my_S,scount,MPI_INT,root,cube_comm);

/*-------------------------------------------------*/

/*----ПОБУДОВА ЧАСТКОВИХ МАТРИЦЬ ВІДСТАНЕЙ ТА ПОСЛІДОВНОСТІ ВУЗЛІВ----*/

//Оголошення необхідних змінних

int *k_row;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]