Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
про виконання лабораторної роботи №1
з курсу „ паралельні та розподілені обчислення”
на тему„ ВИКОРИСТАННЯ ФУНКЦІОНАЛЬНОЇ ДЕКОМПОЗИЦІЇ ДЛЯ РОЗВ’ЯЗКУ ОБЧИСЛЮВАЛЬНИХ ЗАДАЧ”
Львів 2005
Тема:
Використання функціональної декомпозиції для розв’язку обчислювальних задач.
Мета:
Вивчити методи декомпозицій задач. Набути навиків розв’язування задач з використанням функціональної декомпозиції.
Варіант №15
15
рядок
bi=i для парних і
bi=15/i для непарних і
15A1b1+c1
A2С2+B2
Cij=15/(i2+j)
Схема декомпозиції:
Текст програми:
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <fstream.h>
#include <time.h>
#include <iomanip.h>
class ofstream o("zvit.txt");
void delay()
{
for(int i=0;i<1000;i++);
}
double** AddMas(double** a, double** b, int n)
{
int i,j;
double **c;
c = new double*[n];
for(j=0; j<n; j++)
{
c[j]= new double[n];
}
for(i=0; i<n; i++)
{
for(j=0;j<n; j++)
{
c[i][j] = a[i][j] + b[i][j];
}
}
return c;
}
double** DeductMas(double **a, double **b, int n)
{
int i,j;
double **c;
c = new double*[n];
for(j=0; j<n; j++)
{
c[j]= new double[n];
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
c[i][j] = a[i][j] - b[i][j];
}
}
return c;
}
double* AddVector(double *a, double *b, int n)
{
int i;
double *c;
c = new double[n];
for(i=0; i<n; i++)
{
c[i] = a[i] + b[i];
}
return c;
}
double* DeductVector(double *a, double *b, int n)
{
int i;
double *c;
c = new double[n];
for(i=0; i<n; i++)
{
c[i] = a[i] - b[i];
}
return c;
}
double** MulMatrix_Number(double **a, double con, int n)
{
int i, j;
double **c;
c = new double*[n];
for(j=0; j<n; j++)
{
c[j]= new double[n];
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
c[i][j] = a[i][j] * con;
}
}
return c;
}
double** MulMatrix_Matrix(double **a, double **b, int n)
{
int i, j, k;
double **c;
double s;
c = new double*[n];
for(j=0; j<n; j++)
{
c[j]= new double[n];
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
s = 0;
for(k=0; k<n; k++)
{
s = s + a[i][k] * b[k][j];
}
c[i][j] = s;
}
}
return c;
}
double* MulVector_Number(double *a, double con, int n)
{
int i;
double* c;
c = new double[n];
for(i=0; i<n; i++)
{
c[i] = a[i] * con;
}
return c;
}
double MulVector(double *a, double *b, int n)
{
int i;
double c;
//c = new double[n];
c=0;
for(i=0; i<n; i++)
{
c = c + a[i] * b[i];
}
return c;
}
double* MulMatrix_Vector(double **a, double *b, int n)
{
int i, k;
double s;
double *c;
c = new double[n];
for(i=0; i<n; i++)
{
s = 0;
for(k=0; k<n; k++)
{
s = s + a[i][k] * b[k];
}
c[i] = s;
}
return c;
}
double** Transp(double **a, int n)
{
int i, j;
double prom;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
prom = a[i][j];
a[j][i] = prom;
}
}
return a;
}
double** InputMas(int n)
{
double **a;
a = new double*[n];
int j;
for(j=0; j<n; j++)
{
a[j]= new double[n];
}
int i;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cout << "Matrix[" << i << "][" << j << "]=";
cin >> a[i][j];
}
}
return a;
}
double* InputVector(int n)
{
double *a;
a = new double[n];
int i;
for(i=0; i<n; i++)
{
cout << "a[" << i << "]=";
cin >> a[i];
}
return a;
}
double** MatrixC(int n)
{
int i, j;
double **c;
c = new double*[n];
for(j=0; j<n; j++)
{
c[j]= new double[n];
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
c[i][j] = 15 * (pow(i+1,2)+j);
}
}
return c;
}
double* VectorBi(int n)
{
double *b;
b = new double[n];
int i, j;
j = 1;
for(i=0; i<n; i++)
{
if((j%2)==0) b[i] = j;else b[i]=15/j;
j = j + 1;
}
return b;
}
void FreeMem(double **a, int n)
{
for(int j=0; j<n;j++)
{
delete [] a[j];
}
delete [] a;
}
void FreeMemVector(double *a, int n)
{
delete [] a;
}
double** AvtoGen(int n)
{
double **a;
a = new double*[n];
int j;
for(j=0; j<n; j++)
{
a[j]= new double[n];
}
int i;
for(j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
a[j][i] = rand()%10+1;
}
}
return a;
}
double* AvtoGenVector(int n)
{
double *a;
a = new double[n];
int i;
for(i=0; i<n; i++)
{
a[i] = rand()%10+1;
}
return a;
}
void Out(double **a, int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cout <<setw(15)<< a[i][j];
}
cout << "\n";
}
cout << "\n";
}
void Out(double *a, int n)
{
int i;
for(i=0; i<n; i++)
{
cout <<setw(15)<< a[i];
}
cout << "\n";
}
void Out(double a)
{
cout<<setw(15)<<a<< "\n";
}
void FileOut(double **a, int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
o << setw(15) << a[i][j];
}
o << "\n";
}
o << "\n";
flushall();
}
void FileOut(double *a, int n)
{
int i;
for(i=0; i<n; i++)
{
o <<setw(15)<< a[i];
}
o << "\n";
flushall();
}
void FileOut(double a)
{
o<<setw(15)<<a<< "\n";
flushall();
}
double** step1(double **a, double **b, int n)
{
return MulMatrix_Matrix(a,b,n);
}
double* step2(double **a, double *b, double con, int n)
{
return MulMatrix_Vector(MulMatrix_Number(a,con,n),b,n);
}
double** step3(double **a, double **b, int n)
{
return AddMas(a,b,n);
}
double* step4(double *a, double *b, int n)
{
return AddVector(a,b,n);
}
double* step5(double **a, double *b, int n)
{
return MulMatrix_Vector(a,b,n);
}
double* step6(double *a, double *b, int n)
{
return AddVector(a,b,n);
}
double** step7(double **a, int n)
{
return MulMatrix_Matrix(a,a,n);
}
double step8(double *a, double *b, int n)
{
return MulVector(a,b,n);
}
double* step9(double **a, double *b, int n)
{
return MulMatrix_Vector(a,b,n);
}
double* step10(double **a, double *b, int n)
{
return MulMatrix_Vector(a,b,n);
}
double* step11(double *a, double con, int n)
{
return MulVector_Number(a,con,n);
}
double* step12(double *a, double *b, int n)
{
return AddVector(a,b,n);
}
double* step13(double *a, double *b, int n)
{
return AddVector(a,b,n);
}
void main()
{
srand(time(NULL));
class ofstream o("zvit.txt");
flushall();
cout << "Enter n: ";
int n;
cin >> n;
double **A, **A1, **A2, **B2, *b1, *c1;
char menu;
cout << "MENU\n";
cout << "1. Input matrix from keyboard\n";
cout << "2. Avtogenerate matrix\n";
cin >> menu;
switch (menu){
case '1':
cout << "Matrix A:\n";
A = InputMas(n);
cout << "Matrix A1:\n";
A1 = InputMas(n);
cout << "Matrix A2:\n";
A2 = InputMas(n);
cout << "Matrix B2:\n";
B2 = InputMas(n);
cout << "Matrix b1:\n";
b1 = InputVector(n);
cout << "Matrix c1:\n";
c1 = InputVector(n);
break;
case '2':
A = AvtoGen(n);
A1 = AvtoGen(n);
A2 = AvtoGen(n);
B2 = AvtoGen(n);
b1 = AvtoGenVector(n);
c1 = AvtoGenVector(n);
break;
default:
cout << "Enter number of menu!!!\n";
}
double **C2;
C2 = MatrixC(n);
double *b;
b = VectorBi(n);
cout << "Matrix A:\n";
o<< "Matrix A:\n";
Out(A,n);
FileOut(A,n);
delay();
cout << "Matrix A1:\n";
o<< "Matrix A1:\n";
Out(A1,n);
FileOut(A1,n);
delay();
cout << "Matrix A2:\n";
o<< "Matrix A2:\n";
Out(A2,n);
FileOut(A2,n);
delay();
cout << "Matrix B2:\n";
o<< "Matrix B2:\n";
Out(B2,n);
FileOut(B2,n);
cout << "Vector b1:\n";
o<< "Vector b1:\n";
Out(b1,n);
FileOut(b1,n);
cout << "Vector c1:\n";
o<< "Vector c1:\n";
Out(c1,n);
FileOut(c1,n);
cout << "Vector b:\n";
o<< "Vector b:\n";
Out(b,n);
FileOut(b,n);
char a;
cin >> a;
cout << "-----------------------Step1--------------------------\n";
double** TMPMatr1;
TMPMatr1=step1(A2,C2,n);
cout << "Step1 - TMPMatr1:\n";
o<<setw(15)<< "Step1 - TMPMatr1:\n";
Out(TMPMatr1,n);
FileOut(TMPMatr1,n);
cout << "-----------------------Step2--------------------------\n";
double *TMPVect1;
TMPVect1=step2(A1,b1,15,n);
cout << "Step2 - TMPVect1:\n";
o<<setw(15)<< "Step2 - TMPVect1:\n";
Out(TMPVect1,n);
FileOut(TMPVect1,n);
cout << "-----------------------Step3--------------------------\n";
double** y3;
y3=step3(TMPMatr1,B2,n);
cout << "Step3 - y3:\n";
o<< "Step3 - y3:\n";
Out(y3,n);
FileOut(y3,n);
cout << "-----------------------Step4--------------------------\n";
double* y2;
y2=step4(TMPVect1,c1,n);
cout << "Step4 - y2:\n";
o<< "Step4 - y2:\n";
Out(y2,n);
FileOut(y2,n);
cout << "-----------------------Step5--------------------------\n";
double* y1;
y1=step5(A,b,n);
cout << "Step5 - y1:\n";
o<< "Step5 - y1:\n";
Out(y1,n);
FileOut(y1,n);
cout << "-----------------------Step6--------------------------\n";
TMPVect1=step6(y2,y1,n);
cout << "Step6 - TMPVect1:\n";
o<< "Step6 - TMPVect1:\n";
Out(TMPVect1,n);
FileOut(TMPVect1,n);
cout << "-----------------------Step7--------------------------\n";
TMPMatr1=step7(y3,n);
cout << "Step7 - TMPMatr1:\n";
o<< "Step7 - TMPMatr1:\n";
Out(TMPMatr1,n);
FileOut(TMPMatr1,n);
cout << "-----------------------Step8--------------------------\n";
double TMPNumber1;
TMPNumber1=step8(y2,y2,n);
cout << "Step8 - TMPNumber1:\n";
o<< "Step8 - TMPNumber1:\n";
Out(TMPNumber1);
FileOut(TMPNumber1);
cout << "-----------------------Step9--------------------------\n";
double* TMPVect2;
TMPVect2=step9(y3,y1,n);
cout << "Step9 - TMPVect2:\n";
o<< "Step5 - TMPVect2:\n";
Out(TMPVect2,n);
FileOut(TMPVect2,n);
cout << "-----------------------Step10-------------------------\n";
double* TMPVect3;
TMPVect3=step10(TMPMatr1,y1,n);
cout << "Step10 - TMPVect3:\n";
o<< "Step10 - TMPVect3:\n";
Out(TMPVect3,n);
FileOut(TMPVect3,n);
cout << "-----------------------Step11-------------------------\n";
TMPVect2=step11(TMPVect2,TMPNumber1,n);
cout << "Step11 - TMPVect2:\n";
o<< "Step11 - TMPVect2:\n";
Out(TMPVect2,n);
FileOut(TMPVect2,n);
cout << "-----------------------Step12--------------------------\n";
TMPVect1=step12(TMPVect1,TMPVect3,n);
cout << "Step12 - TMPVect1:\n";
o<< "Step12 - TMPVect1:\n";
Out(TMPVect1,n);
FileOut(TMPVect1,n);
cout << "-----------------------Step13--------------------------\n";
double* x;
x=step13(TMPVect1,TMPVect2,n);
cout << "Step13 - x:\n";
o<< "Step13 - x:\n";
Out(x,n);
FileOut(x,n);
FreeMem(A,n);
FreeMem(A1,n);
FreeMem(A2,n);
FreeMem(B2,n);
FreeMem(C2,n);
FreeMem(TMPMatr1,n);
FreeMemVector(b1,n);
FreeMemVector(c1,n);
FreeMemVector(b,n);
FreeMemVector(y1,n);
FreeMemVector(y2,n);
FreeMem(y3,n);
FreeMemVector(TMPVect1,n);
FreeMemVector(TMPVect2,n);
FreeMemVector(TMPVect3,n);
}
Висновок:
Використовуючи декомпозицію задачу можливо розбити на підзадачі тим самим забезпечуючи можливість паралельного виконання. Для даної задачі оптимальна кількість процесорів – це 2-3.