close

Вход

Забыли?

вход по аккаунту

?

TPV1

код для вставкиСкачать
Министерство образования и науки, молодежи и спорта Украины
Севастопольский национальный технический университет
Кафедра ИС
Лабораторная работа №1
Изучение понятий независимости операций (блоков) в последовательных программах. Исследования метода приведения программы к полной параллельной форме при распараллеливании последовательных программ
Выполнил: ст. гр. И-42д
Сычев П.Ю
Проверил: Кротов К.В.
Севастополь
2012
ЦЕЛЬ РАБОТЫ: изучить понятие независимости операций (блоков) в программе, исследовать метод распараллеливания программ путем их приведения к полной параллельной форме.
Умножение матриц:
c1,1 = a1,1xb1,1+a1,2xb2,1+a1,3xb3,1
c1,2 = a1,1xb1,2+a1,2xb2,2+a1,3xb3,2
c1,3 = a1,1xb1,3+a1,2xb2,3+a1,3xb3,3
c2,1 = a2,1xb1,1+a2,2xb2,1+a2,3xb3,1
c2,2 = a2,1xb1,2+a2,2xb2,2+a2,3xb3,2
c2,3 = a2,1xb1,3+a2,2xb2,3+a2,3xb3,3
c3,1 = a3,1xb1,1+a3,2xb2,1+a3,3xb3,1
c3,2 = a3,1xb1,2+a3,2xb2,2+a3,3xb3,2
c3,3 = a3,1xb1,3+a3,2xb2,3+a3,3xb3,3
S1 - a11xb11S5 - a1,1xb1,2S9 - a1,1xb1,3
S2 - a12xb21S6 - a1, 2xb2,2S10 - a1,2xb2,3
S3 - a13xb31S7 - a1,3xb3,2S11 - a1,3xb3,3
S4 - S1 + S2 + S3S8 - S4 + S5 + S6S12 - S9 + S10 + S11
S13 - a2,1xb1,1S17 - a2,1xb1,2S21 - a2,1xb1,3
S14 - a2,2xb2,1S18 - a2,2xb2,2S22 - a2,2xb2,3
S15 - a2,3xb3,1S19 - a2,3xb3,2S23 - a2,3xb3,3
S16 - S13 + S14 + S15S20 - S17 + S18 + S19S24 - S21 + S22 + S23
S25 - a3,1xb1,1S29 - a3,1xb1,2S33 - a3,1xb1,3
S26 - a3,2xb2,1S30 - a3,2xb2,2S34 - a3,2xb2,3
S27 - a3,3xb3,1S31 - a3,3xb3,2S35 - a3,3xb3,3
S28 - S25 + S26 + S27S32 - S29 + S30 + S31S36 - S33 + S34 + S35
S37 - вывод результата
Определим зависимости между операторами (на примере одного элемента матрицы)
C(S1)R(S4) = a11xb11, следовательно S4 находится в сильной зависимости от S1
C(S2)R(S4) = a12xb21 следовательно S4 находится в сильной зависимости от S2
C(S3)R(S4) = a13xb31, следовательно S4 находится в сильной зависимости от S3
C(S4)R(S37) = c1,1 , следовательно S37 находится в сильной зависимости от S4
S1 -> S4; S2 -> S4; S3 -> S4; S4 -> S37;
Для остальных элементов зависимости определяются аналогично
Проверка приводимости к ППФ
1. S1 и S5 - независимы;
2. Между ними имеется промежуточный оператор S4;
3. N1(S1, S5) = { S37} P(S4) = {S37}
N2(S1,S5) = {S4, S8} S4 N2
N1(S1, S5) P(S4) S1S2S3S4S11110S21110S31110S40001 S1 Y1 Y1
S2 S4 S3 S4
S5 - a11xb12
S6 - a12xb22
S7 - a13xb32
S8 - S5 + S6 + S7
S9 - a11xb13
S5 -> S8; S6 -> S8; S7 -> S8; S8 -> S37;
Проверка приводимости к ППФ
1. S5 и S9 - независимы;
2. Между ними имеется промежуточный оператор S6;
3. N1(S5, S9) = { S37} P(S8) = {S37}
N2(S5,S9) = {S8, S12} S8 N2
N1(S5, S9) P(S6) S5 Y2 Y2
S6 S8 S7 S8
S5S6S7S8S51110S61110S71110S80001
S9 - a11xb13
S10 - a12xb23
S11 - a13xb33
S12 - S9 + S10 + S11
S13 - a21xb11
S9 -> S12; S10 -> S12; S11 -> S12; S12 -> S37;
Проверка приводимости к ППФ
1. S9 и S13 - независимы;
2. Между ними имеется промежуточный оператор S12;
3. N1(S9, S13) = { S37} P(S10) = {S37}
N2(S9,S13) = {S12, S16} S10 N2
N1(S5, S9) P(S6) S9 Y3 Y3
S10 S12 S11 S12
S9S10S11S12S91110S101110S111110S120001
S13S14S15S16S131110S141110S151110S160001 S13 Y4 Y4
S14 S16 S15 S16
S17S18S19S20S171110S181110S191110S200001
S17 Y5 Y5
S18 S20 S19 S20
S21S22S23S24S211110S221110S231110S240001
S21 Y6 Y6
S22 S20 S23 S24
S25S26S27S28S251110S261110S271110S280001
S25 Y7 Y7
S26 S28 S27 S28
S29S30S31S32S291110S301110S311110S320001
S29 Y8 Y8
S30 S32 S31 S32
S33S34S35S36S331110S341110S351110S360001
S33 Y9 Y9
S34 S36 S35 S36
Y1 Y10 Y10
Y2 S37
Y3
Y4
Y5
Y6
Y7
Y8
Y9
S37
Y1Y2Y3Y4Y5Y6Y7Y8Y9S37Y11111111110Y11111111110Y11111111110Y11111111110Y11111111110Y11111111110Y11111111110Y11111111110Y11111111110S370000000001
Рисунок 1 - Представление ППФ
Код программы
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "mpi.h"
using namespace std;
int ranked;
int a[3][3] = {{1, 2, 3},
{4, 5, 6},
{7, 8, 9}},
b[3][3] = {{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
int pairs [2][27];
int main(int argc, char* argv[])
{
int result[3][3];
MPI_Init(&argc, &argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&ranked);
int numprocs;
MPI_Group sums_grp, wrld_grp;
MPI_Comm sums_comm;
int ranks[10];
for (int i=28; i<=37; i++)
ranks[i-28]=i;
MPI_Comm_group(MPI_COMM_WORLD, &wrld_grp);
MPI_Group_incl(wrld_grp, 10, ranks, &sums_grp);
MPI_Comm_create(MPI_COMM_WORLD, sums_grp, &sums_comm);
int count=0;
int mult;
int buf[2];
int d;
if (ranked==0)
{
for (int i=0; i<3; i++)//делим на пары нашу матрицу
for (int j=0; j<3; j++)
for (int k=0; k<3; k++)
{
pairs[0][count]=a[j][i];
pairs[1][count]=b[i][k];
cout<<pairs[0][count]<<" ";
cout<<pairs[1][count]<<endl;
count++;
}
for (int i=0; i<27; i++)//выделям необходимую пару и отправляем на умножение
{
buf[0]=pairs[0][i];
buf[1]=pairs[1][i];
MPI_Send(&buf, 2, MPI_INT, i+1, 99, MPI_COMM_WORLD);
}
}
if (ranked>0 && ranked<28)//получаем наши 27 пар и перемножаем их (по 3 на 1 элемент)
{
MPI_Recv(&buf, 2, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
mult=buf[0]*buf[1];
int proc;
proc=28+((ranked-1)%9);
cout<<ranked<<" - "<<proc<<" "<<mult<<endl;
MPI_Send(&mult, 1, MPI_INT, proc, 99, MPI_COMM_WORLD);
}
if (ranked>=28 && ranked<=36)//принимаем перемноженные пары и складываем (получаем 1 элемент необходимой нам матрицы)
{
int a,b,c;
int proc;
proc=ranked-27;
MPI_Recv(&a, 1, MPI_INT, proc, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&b, 1, MPI_INT, proc+9, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&c, 1, MPI_INT, proc+18, 99, MPI_COMM_WORLD, &status);
d=a+b+c;
cout<<"d for"<<ranked<<" - "<<d<<endl;
MPI_Gather(result, 9, MPI_INT, &d, 9, MPI_INT, 37, sums_comm);
}
if (ranked == 37)//печатаем матрицу
{
MPI_Gather(result, 9, MPI_INT, &d, 9, MPI_INT, 37, sums_comm);
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
cout<<result[i][j]<<endl;
getch();
}
MPI_Finalize();
return 0;
}
Выводы
В ходе лабораторной работы были изучены понятия независимости операций (блоков) в программе, исследованы методы распараллеливания программ путем их приведения к полной параллельной форме.
Документ
Категория
Рефераты
Просмотров
7
Размер файла
55 Кб
Теги
tpv1
1/--страниц
Пожаловаться на содержимое документа