Інститут менеджменту та економіки “Галицька Академія”
“Паралельні та розподілені обчислення”
Тема роботи: Методи розпаралелення лінійних та циклічних алгоритмів.
Мета роботи: Освоєння принципів та отримання навиків по розпаралеленню послідовних лінійних та циклічних алгоритмів.
Завдання для виконання роботи
Побудувати блок-схему та написати програму (засобами послідовного програмування), орієнтовану на виконання на чотирьох процесорах, яка виконує:
Обчислення суми двох векторів А={a1, a2,… a100} та B={b1, b2,… b100}, результат якої множиться на матрицю С=||сij||, тобто D=(A+B)*C. Дані векторів А, B, C відповідно до табл. 1.1.
Множення матриці M=||mij||, де , на обчислений транспонований вектор D із першого пункту завдання.
2
#include <conio.h>
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
void main(void)
{
int i,j,k;
float a[100],b[100],ab[100],c[100][100],d[100],m[100][100],r[100];
for(i=1;i<=100;i++)
{
a[i]=cos(3.14/60);
b[i]=sin(3.14/60);
}
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
c[i-1][j-1]=cos(2*3.14/sin(i+j));
m[i-1][j-1]=sin(2*3.14/sin(i+j));
}
}
for(i=0;i<=24;i++)
{
ab[i]=a[i]+b[i];
}
for(i=25;i<=49;i++)
{
ab[i]=a[i]+b[i];
}
for(i=50;i<=74;i++)
{
ab[i]=a[i]+b[i];
}
for(i=75;i<=99;i++)
{
ab[i]=a[i]+b[i];
}
for(i=0;i<=99;i++)
{
if((i<=10)||(i>=90))
cout<<"a "<<i<<" "<<a[i]<<'\t'<<"b "<<i<<" "<<b[i]<<'\t'<<"ab "<<i<<" "<<ab[i]<<'\n';
}
getch();
for(i=0;i<=24;i++)
{
d[i]=0;
for(j=0;j<=99;j++)
{
d[i]+=ab[j]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"d "<<i<<" "<<d[i]<<'\n';
}
for(i=25;i<=49;i++)
{
d[i]=0;
for(j=0;j<=99;j++)
{
d[i]+=ab[j]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"d "<<i<<" "<<d[i]<<'\n';
}
for(i=50;i<=74;i++)
{
d[i]=0;
for(j=0;j<=99;j++)
{
d[i]+=ab[j]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"d "<<i<<" "<<d[i]<<'\n';
}
for(i=75;i<=99;i++)
{
d[i]=0;
for(j=0;j<=99;j++)
{
d[i]+=ab[j]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"d "<<i<<" "<<d[i]<<'\n';
}
getch();
for(i=0;i<=24;i++)
{
r[i]=0;
for(j=0,k=99;j<=99,k>=0;j++,k--)
{
r[i]+=d[k]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"r "<<i<<" "<<r[i]<<'\n';
}
for(i=25;i<=49;i++)
{
r[i]=0;
for(j=0,k=99;j<=99,k>=0;j++,k--)
{
r[i]+=d[k]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"r "<<i<<" "<<r[i]<<'\n';
}
for(i=50;i<=74;i++)
{
r[i]=0;
for(j=0,k=99;j<=99,k>=0;j++,k--)
{
r[i]+=d[k]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"r "<<i<<" "<<r[i]<<'\n';
}
for(i=75;i<=99;i++)
{
r[i]=0;
for(j=0,k=99;j<=99,k>=0;j++,k--)
{
r[i]+=d[k]*c[i][j];
}
if((i<=10)||(i>=90))
cout<<"r "<<i<<" "<<r[i]<<'\n';
}
getch();
}
a 0 0.0523094 b 0 9.99172e-38 ab 0 0.0523094
a 1 0.998631 b 1 0.0523094 ab 1 1.05094
a 2 0.998631 b 2 0.0523094 ab 2 1.05094
a 3 0.998631 b 3 0.0523094 ab 3 1.05094
a 4 0.998631 b 4 0.0523094 ab 4 1.05094
a 5 0.998631 b 5 0.0523094 ab 5 1.05094
a 6 0.998631 b 6 0.0523094 ab 6 1.05094
a 7 0.998631 b 7 0.0523094 ab 7 1.05094
a 8 0.998631 b 8 0.0523094 ab 8 1.05094
a 9 0.998631 b 9 0.0523094 ab 9 1.05094
a 10 0.998631 b 10 0.0523094 ab 10 1.05094
a 90 0.998631 b 90 0.0523094 ab 90 1.05094
a 91 0.998631 b 91 0.0523094 ab 91 1.05094
a 92 0.998631 b 92 0.0523094 ab 92 1.05094
a 93 0.998631 b 93 0.0523094 ab 93 1.05094
a 94 0.998631 b 94 0.0523094 ab 94 1.05094
a 95 0.998631 b 95 0.0523094 ab 95 1.05094
a 96 0.998631 b 96 0.0523094 ab 96 1.05094
a 97 0.998631 b 97 0.0523094 ab 97 1.05094
a 98 0.998631 b 98 0.0523094 ab 98 1.05094
a 99 0.998631 b 99 0.0523094 ab 99 1.05094
d 0 18.4343
d 1 18.5751
d 2 18.1257
d 3 18.0041
d 4 19.87
d 5 20.1649
d 6 18.3362
d 7 20.1005
d 8 19.7993
d 9 17.8902
d 10 17.773
d 90 33.0111
d 91 32.5032
d 92 32.6065
d 93 32.6012
d 94 30.6685
d 95 32.254
d 96 32.2927
d 97 30.3188
d 98 29.9838
d 99 30.3375
r 0 462.434
r 1 419.55
r 2 415.115
r 3 440.784
r 4 409.884
r 5 440.974
r 6 480.705
r 7 431.844
r 8 476.978
r 9 458.476
r 10 418.826
r 90 784.097
r 91 801.696
r 92 774.566
r 93 751.677
r 94 778.977
r 95 746.159
r 96 779.603
r 97 773.957
r 98 741.819
r 99 734.959
Висновок: на цій лабораторній роботі ми розділяли цикли, чим ніби то розпаралелювали програму