close

Вход

Забыли?

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

?

1lab

код для вставкиСкачать
Министерство образования и науки, молодежи и спорта Украины
Севастопольский национальный технический университет
Лабораторная работа №1
Изучение понятий независимости операций (блоков) в последовательных программах, исследования метода приведения к полной параллельной форме при распараллеливании последовательных программ
Выполнил:
Ст. Гр. И-42д
Сычев П.Ю
Проверил:
Кротов К.В
Севастополь
2012
Цель работы:
Изучить понятия независимости операций (блоков) в программе, изучить метод распараллеливания программ путем их приведения к полной параллельной форме
Задание
Осуществить распараллеливание последовательности программ в соответствии с вариантом:
1 вариант:
Найти определитель матрицы размером 4*4.
S1S2S3S4S5S6S7S8S111111100S211111100S311111100S411111100S511111100S611111100S700000010S800000001
S9S10S11S12S13S14S15S16S911111100S1011111100S1111111100S1211111100S1311111100S1411111100S1500000010S1600000001
S17S18S19S20S21S22S23S24S1711111100S1811111100S1911111100S2011111100S2111111100S2211111100S2300000010S2400000001
S25S26S27S28S29S30S31S32S2511111100S2611111100S2711111100S2811111100S2911111100S3011111100S3100000010S3200000001
1S7S82S15S163S23S244S31S32S3311001111111110S70101111111110S8001111111111021111001111110S151110101111110S16111001111111031111111001110S231111110101110S24111111001111041111111111000S311111111110100S321111111110010S330000000000001
Y1Y2Y3Y4S33Y111110Y211110Y311110Y411110S3300001
Код программы:
// lab1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <mpi.h>
#include "iostream"
float a[4][4] = {{4,1,6,2}, {5,6,4,9}, {3,5,4,7},{2,1,4,3}};// исходная матрица
int rank;
int n_p=32;
void start(void);
void S1(void);
void S2(void);
void S3(void);
void S4(void);
void S5(void);
void S6(void);
void S7(void);
void S8(void);
void S9(void);
void S10(void);
void S11(void);
void S12(void);
void S13(void);
void S14(void);
void S15(void);
void S16(void);
void S17(void);
void S18(void);
void S19(void);
void S20(void);
void S21(void);
void S22(void);
void S23(void);
void S24(void);
void S25(void);
void S26(void);
void S27(void);
void S28(void);
void S29(void);
void S30(void);
void S31(void);
void S32(void);
void S33(void);
int main(int argc, char* argv[])
{
// инициализация MPI
MPI_Init(&argc, &argv);
// получаем идентификатор текущего процесса
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
switch(rank) {
case 0:start();break;
case 1:S1();break;
case 2:S2();break;
case 3:S3();break;
case 4:S4();break;
case 5:S5();break;
case 6:S6();break;
case 7:S7();break;
case 8:S8();break;
case 9:S9();break;
case 10:S10();break;
case 11:S11();break;
case 12:S12();break;
case 13:S13();break;
case 14:S14();break;
case 15:S15();break;
case 16:S16();break;
case 17:S17();break;
case 18:S18();break;
case 19:S19();break;
case 20:S20();break;
case 21:S21();break;
case 22:S22();break;
case 23:S23();break;
case 24:S24();break;
case 25:S25();break;
case 26:S26();break;
case 27:S27();break;
case 28:S28();break;
case 29:S29();break;
case 30:S30();break;
case 31:S31();break;
case 32:S32();break;
case 33:S33();break;
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
void start(void)
{
for (int i = 0; i < 4; i++){
for (int j = 0; j < 4; j++)
std::cout<<a[i][j]<<" ";
std::cout<<std::endl;
}
for(int i = 1; i <= n_p; i++) {
MPI_Send(&a, 16, MPI_FLOAT, i, 99, MPI_COMM_WORLD);
std::cout<<"matrix a sended to prc "<<i<<std::endl;
}
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S1(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][1]*a[2][2]*a[3][3];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S2(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[2][1]*a[3][2]*a[1][3];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S3(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][2]*a[2][3]*a[3][1];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S4(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][3]*a[2][2]*a[3][1];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S5(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][2]*a[2][1]*a[3][3];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S6(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[3][2]*a[2][3]*a[1][1];
MPI_Send(&rez, 1, MPI_FLOAT, 7, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S7(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float s1,s2,s3,s4,s5,s6;
MPI_Recv(&s1, 16, MPI_FLOAT, 1, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s2, 16, MPI_FLOAT, 2, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s3, 16, MPI_FLOAT, 3, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s4, 16, MPI_FLOAT, 4, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s5, 16, MPI_FLOAT, 5, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s6, 16, MPI_FLOAT, 6, 99, MPI_COMM_WORLD, &status);
//float rez = a[0][0]*a[1][1]*a[2][2]*a[3][3]+a[2][0]*a[2][1]*a[0][2]+a[0][1]*a[1][2]*a[2][0]-a[0][2]*a[1][1]*a[2][0]-a[0][1]*a[1][0]*a[2][2]-a[2][1]*a[1][2]*a[0][0];
float rez=s1+s2+s3-s4-s5-s6;
MPI_Send(&rez, 1, MPI_FLOAT, 8, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S8(void)
{
MPI_Status status;
float ch;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&ch,1,MPI_FLOAT,7,99,MPI_COMM_WORLD,&status);
float rez=a[0][0]*ch;
MPI_Send(&rez, 1, MPI_FLOAT, 33, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S9(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][0]*a[2][2]*a[3][3];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S10(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[2][0]*a[3][2]*a[1][3];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S11(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][2]*a[2][3]*a[3][0];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S12(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][3]*a[2][2]*a[3][1];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S13(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][2]*a[2][0]*a[3][3];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S14(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[3][2]*a[2][3]*a[1][0];
MPI_Send(&rez, 1, MPI_FLOAT, 15, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S15(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float s9,s10,s11,s12,s13,s14;
MPI_Recv(&s9, 16, MPI_FLOAT, 9, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s10, 16, MPI_FLOAT, 10, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s11, 16, MPI_FLOAT, 11, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s12, 16, MPI_FLOAT, 12, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s13, 16, MPI_FLOAT, 13, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s14, 16, MPI_FLOAT, 14, 99, MPI_COMM_WORLD, &status);
//float rez = a[0][0]*a[1][1]*a[2][2]*a[3][3]+a[2][0]*a[2][1]*a[0][2]+a[0][1]*a[1][2]*a[2][0]-a[0][2]*a[1][1]*a[2][0]-a[0][1]*a[1][0]*a[2][2]-a[2][1]*a[1][2]*a[0][0];
float rez=s9+s10+s11-s12-s13-s14;
MPI_Send(&rez, 1, MPI_FLOAT, 16, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S16(void)
{
MPI_Status status;
float ch;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&ch,1,MPI_FLOAT,15,99,MPI_COMM_WORLD,&status);
float rez=a[0][1]*ch;
MPI_Send(&rez, 1, MPI_FLOAT, 33, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S17(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][20]*a[2][1]*a[3][33];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S18(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[2][0]*a[3][1]*a[1][3];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S19(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][1]*a[2][3]*a[3][0];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S20(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][3]*a[2][1]*a[3][0];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S21(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][1]*a[2][0]*a[3][3];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S22(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[2][3]*a[3][1]*a[1][0];
MPI_Send(&rez, 1, MPI_FLOAT, 23, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S23(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float s17,s18,s19,s20,s21,s22;
MPI_Recv(&s17, 16, MPI_FLOAT, 17, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s18, 16, MPI_FLOAT, 18, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s19, 16, MPI_FLOAT, 19, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s20, 16, MPI_FLOAT, 20, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s21, 16, MPI_FLOAT, 21, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s22, 16, MPI_FLOAT, 22, 99, MPI_COMM_WORLD, &status);
//float rez = a[0][0]*a[1][1]*a[2][2]*a[3][3]+a[2][0]*a[2][1]*a[0][2]+a[0][1]*a[1][2]*a[2][0]-a[0][2]*a[1][1]*a[2][0]-a[0][1]*a[1][0]*a[2][2]-a[2][1]*a[1][2]*a[0][0];
float rez=s17+s18+s19-s20-s21-s22;
MPI_Send(&rez, 1, MPI_FLOAT, 8, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S24(void)
{
MPI_Status status;
float ch;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&ch,1,MPI_FLOAT,23,99,MPI_COMM_WORLD,&status);
float rez=a[0][2]*ch;
MPI_Send(&rez, 1, MPI_FLOAT, 33, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S25(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][0]*a[2][1]*a[3][2];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S26(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[2][0]*a[3][1]*a[1][2];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S27(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][1]*a[2][2]*a[3][0];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S28(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][2]*a[2][1]*a[3][0];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S29(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[1][1]*a[2][0]*a[3][2];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S30(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float rez = a[3][1]*a[2][2]*a[1][0];
MPI_Send(&rez, 1, MPI_FLOAT, 31, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S31(void)
{
MPI_Status status;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
float s25,s26,s27,s28,s29,s30;
MPI_Recv(&s25, 16, MPI_FLOAT, 25, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s26, 16, MPI_FLOAT, 26, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s27, 16, MPI_FLOAT, 27, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s28, 16, MPI_FLOAT, 28, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s29, 16, MPI_FLOAT, 29, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s30, 16, MPI_FLOAT, 30, 99, MPI_COMM_WORLD, &status);
//float rez = a[0][0]*a[1][1]*a[2][2]*a[3][3]+a[2][0]*a[2][1]*a[0][2]+a[0][1]*a[1][2]*a[2][0]-a[0][2]*a[1][1]*a[2][0]-a[0][1]*a[1][0]*a[2][2]-a[2][1]*a[1][2]*a[0][0];
float rez=s25+s26+s27-s28-s29-s30;
MPI_Send(&rez, 1, MPI_FLOAT, 32, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S32(void)
{
MPI_Status status;
float ch;
MPI_Recv(&a, 16, MPI_FLOAT, 0, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&ch,1,MPI_FLOAT,31,99,MPI_COMM_WORLD,&status);
float rez=a[0][3]*ch;
MPI_Send(&rez, 1, MPI_FLOAT, 33, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
}
void S33(void)
{
MPI_Status status;
float s8,s16,s24,s32;
MPI_Recv(&s8, 16, MPI_FLOAT, 8, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s16, 16, MPI_FLOAT, 16, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s24, 16, MPI_FLOAT, 24, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&s32, 16, MPI_FLOAT, 32, 99, MPI_COMM_WORLD, &status);
float rez=s8-s16+s24-s32;
//MPI_Send(&rez, 1, MPI_FLOAT, 33, 99, MPI_COMM_WORLD);
std::cout<<"prc "<<rank<<" finished"<<std::endl;
std::cout<<std::endl<<std::endl<<"matr A="<<rez;
}
Вывод:
В ходе выполнения лабораторной работы были изучены понятия о независимости операциях в последовательных программах, были исследованы методы приведения к полной параллельной форме при распараллеливании последовательных программ.
Документ
Категория
Рефераты
Просмотров
9
Размер файла
36 Кб
Теги
1lab
1/--страниц
Пожаловаться на содержимое документа