Распараллеливание На Mpich

  • Автор темы Painka
  • Дата начала
P

Painka

#1
Подскажите, пожалуйста, как

необходимо распараллелить такую задачку:
y1=a[0][0] + a[0][1]*x1 + a[0][2]*x2 + a[0][3]*x3;
y2=a[1][0] + a[1][1]*x1 + a[1][2]*x2 + a[1][3]*x3;
y3=a[2][0] + a[2][1]*x1 + a[2][2]*x2 + a[2][3]*x3;
y4=a[3][0] + a[3][1]*x1 + a[3][2]*x2 + a[3][3]*x3;

подобрать отпимальные значения х1, х2, х3.
0< = x1<= 2
0<= x2 <=5
0<= x3 <= 20

критерий оптимизации: у4 минимальный, при этом 1050<= y1 <=1110, 20<= y2 <=40, 4<= y3 <=8

вот то что у меня получилось, но без распараллеливания. Буду рада любой помощи)))

<!--shcode--><pre><code class='"необходимо распараллелить такую задачку:
y1=a[0'>[0] + a[0][1]*x1 + a[0][2]*x2 + a[0][3]*x3;
y2=a[1][0] + a[1][1]*x1 + a[1][2]*x2 + a[1][3]*x3;
y3=a[2][0] + a[2][1]*x1 + a[2][2]*x2 + a[2][3]*x3;
y4=a[3][0] + a[3][1]*x1 + a[3][2]*x2 + a[3][3]*x3;

подобрать отпимальные значения х1, х2, х3.
0< = x1<= 2
0<= x2 <=5
0<= x3 <= 20

критерий оптимизации: у4 минимальный, при этом 1050<= y1 <=1110, 20<= y2 <=40, 4<= y3 <=8

вот то что у меня получилось, но без распараллеливания. Буду рада любой помощи)))
C++:
// consist.cpp : Defines the entry point for the console application.
//

Код C++

#include "stdafx.h"
#include <mpi.h>
#include <conio.h>
#include <iostream>

using namespace std;


int main(int argc, char** argv)
{	  
int size, rank;

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

double x1, x2, x3, x4, y1, y2, y3, y4;

double a[4][4]={1030, 4, 5, 9,
20, -5, 10, 10,
1, 0.5, -0.5, 2,
1.2, 0.1, 0.5, 1.2 };
double b[3][2]={1050, 1110,
20, 40, 
4, 8};

double *mas=new double[4];
//mas[0]=1; mas[1]=2; mas[2]=3; mas[3]=4;
double min=999999;

for(x1=0; x1<=2; x1=x1+2/(rank+1))
for(x2=0; x2<=5; x2=x2+5/(rank+1))
for(x3=0; x3<=20; x3=x3+20/(rank+1))
{

y1=a[0][0] + a[0][1]*x1 + a[0][2]*x2 + a[0][3]*x3;

if((b[0][0]<=y1) && (y1<=b[0][1]))
{y2=a[1][0] + a[1][1]*x1 + a[1][2]*x2 + a[1][3]*x3;
cout<<y2<<endl;
}
else 
continue;

if((b[1][0]<=y2) &&( y2<=b[1][1]))
{y3=a[2][0] + a[2][1]*x1 + a[2][2]*x2 + a[2][3]*x3;
//cout<<y3<<endl;
}
else continue;

if((b[2][0]<=y3) && (y3<=b[2][1]))
{{y4=a[3][0] + a[3][1]*x1 + a[3][2]*x2 + a[3][3]*x3;
//cout<<y4<<endl;
}
if(y4<min){
min=y4;
mas[0]=x1; mas[1]=x2; mas[2]=x3;mas[3]=y4;
cout<<x1<<" "<<x2<<" "<<y4<<endl;
}

}else continue;
}

cout<<rank<<endl;
for(int i=0; i<4;i++)
{cout<<endl;
printf("%f ", mas[i]);}
delete[]mas;
MPI_Finalize();
cout<<"bye"<<endl;
//getch();

return 0;
}