- •Блок-схема паралельного алгоритму Флойда
- •Лістинг паралельної програми для реалізації алгоритму Флойда
- •Int *source,*dest;
- •Int scount,rows_count;//кількість елементів для передачі
- •Int *my_d,*my_s,*my_Mas;//масиви для приймання, що міститимуть матриці d та s
- •Int *displs,*Scatter_scount;
- •Ifstream file("input.Txt");
- •If(!file){
- •Int *exeption1;
Лістинг паралельної програми для реалізації алгоритму Флойда
#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;
