Создание приложений для распределенной обработки данных. Результаты вычислений

Страницы работы

Содержание работы

Министерство Образования Республики Беларусь

Гомельский государственный технический университет имени П.О.Сухого

Кафедра “Информационные технологии”

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

“Создание приложений для распределенной обработки данных”

Выполнил: студент ИТ-32

Принял: преподаватель

Гомель 2014

Цель: необходимо разработать распределенное приложение MPI, осуществляющее решение СЛАУ согласна варианта.

Ход работы

Вариант 18

Гаусс блочный

Результаты вычислений отображены на рисунке 1.

Рисунок 1 – Результаты вычислений

Код приложения расположен в приложении А.

Вывод: в результате выполнения данной лабораторной работы было разработано распределенное приложение MPI, осуществляющее решение СЛАУ согласна варианта.


ПРИЛОЖЕНИЕ А

(обязательное)

Код программы

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <windows.h>

#include <mpi.h>

#include <time.h>

int main(int argc, char** argv)

{

/* .......Variables Initialisation ......*/

time_t startTime = time(NULL);

MPI_Status status;

int n_size, NoofRows_Bloc, NoofRows, NoofCols;

int Numprocs, MyRank, Root = 0;

int irow, jrow, icol, index, ColofPivot, neigh_proc;

double **Matrix_A, *Input_A, *Input_B, *ARecv, *BRecv;

double *Output, Pivot;

double *X_buffer, *Y_buffer;

double *Buffer_Pivot, *Buffer_bksub;

double tmp;

FILE *fp;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &MyRank);

MPI_Comm_size(MPI_COMM_WORLD, &Numprocs);

if (MyRank == 0)

{

if ((fp = fopen("./test1.A", "r")) == NULL)

{

printf("Can't open input matrix file");

exit(-1);

}

fscanf(fp, "%d %d", &NoofRows, &NoofCols);

n_size = NoofRows;

Matrix_A = new double*[n_size];

for (irow = 0; irow < n_size; irow++)

{                           

Matrix_A[irow] = new double[n_size];

for (icol = 0; icol < n_size; icol++)

fscanf(fp, "%lf", &Matrix_A[irow][icol]);

}

fclose(fp);

if ((fp = fopen("./test1.B", "r")) == NULL)

{

printf("Can't open input vector file");

exit(-1);

}

fscanf(fp, "%d", &NoofRows);

n_size = NoofRows;

Input_B = new double[n_size];

for (irow = 0; irow<n_size; irow++)

fscanf(fp, "%lf", &Input_B[irow]);

fclose(fp);

Input_A = new double[n_size * n_size];

index = 0;

for (irow = 0; irow<n_size; irow++)

for (icol = 0; icol<n_size; icol++)

Input_A[index++] = Matrix_A[irow][icol];

}

MPI_Bcast(&NoofRows, 1, MPI_INT, Root, MPI_COMM_WORLD);

MPI_Bcast(&NoofCols, 1, MPI_INT, Root, MPI_COMM_WORLD);

if (NoofRows != NoofCols)

{

MPI_Finalize();

if (MyRank == 0)

{

printf("Input Matrix Should Be Square Matrix ..... \n");

}

exit(-1);

}

MPI_Bcast(&n_size, 1, MPI_INT, 0, MPI_COMM_WORLD);

if (n_size % Numprocs != 0)

{

MPI_Finalize();

if (MyRank == 0)

{

printf("Matrix Can not be Striped Evenly ....No of processors (p) should divide the size of the Input matrix (n)\n");

}

exit(-1);

}

NoofRows_Bloc = n_size / Numprocs;

ARecv = new double[NoofRows_Bloc * n_size];

BRecv = new double[NoofRows_Bloc];

MPI_Scatter(Input_A, NoofRows_Bloc * n_size, MPI_DOUBLE, ARecv, NoofRows_Bloc * n_size,

MPI_DOUBLE, 0, MPI_COMM_WORLD);

MPI_Scatter(Input_B, NoofRows_Bloc, MPI_DOUBLE, BRecv, NoofRows_Bloc, MPI_DOUBLE, 0,

MPI_COMM_WORLD);

Buffer_Pivot = new double[NoofRows_Bloc + 1 + n_size];

for (neigh_proc = 0; neigh_proc < MyRank; neigh_proc++)

{

MPI_Recv(Buffer_Pivot, NoofRows_Bloc * n_size + 1 + NoofRows_Bloc, MPI_DOUBLE, neigh_proc,

neigh_proc, MPI_COMM_WORLD, &status);

for (irow = 0; irow < NoofRows_Bloc; irow++)

Похожие материалы

Информация о работе