Министерство Образования Республики Беларусь
Гомельский государственный технический университет имени П.О.Сухого
Кафедра “Информационные технологии”
Лабораторная работа №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++)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.