Параллельное программирование. Решение системы уравнений методом Гаусса., страница 2

for(j=0;j<n;j++)mt[i][j]*=fl;       

for(ii=rank+1;ii<size;ii++){

MPI_Send(mt[i],n,MPI_FLOAT,ii,15,MPI_COMM_WORLD);

MPI_Send(&f[i],1,MPI_FLOAT,ii,16,MPI_COMM_WORLD);

}

for(ii=i+1;ii<k;ii++){

fl=mt[ii][kk+i];

f[ii]-=f[i]*fl;

for(j=0;j<n;j++)mt[ii][j]-=mt[i][j]*fl;

}

}

/*---------------------------obratn--------------------------*/ 

for(i=n-1;i>=(kk+k);i--){

MPI_Recv(&sf,1,MPI_FLOAT,MPI_ANY_SOURCE,17,MPI_COMM_WORLD,&st);

for(ii=0;ii<k;ii++){

fl=mt[ii][i];

f[ii]-=sf*fl;

}

}

for(i=k-1;i>=0;i--){

for(ii=0;ii<rank;ii++){

MPI_Send(&f[i],1,MPI_FLOAT,ii,17,MPI_COMM_WORLD);

}

for(ii=i-1;ii>=0;ii--){

fl=mt[ii][kk+i];

f[ii]-=f[i]*fl;

}

}

stop=time(0);

/*-------------------print---------------------------------*/

printf("\nMy rank is %d time=%d",rank,stop-start);

for(j=0;j<k;j++)  printf("\n%f",f[j]);

MPI_Finalize();

return(0);

}

Программа 2

#include <mpi.h>

#include <stdio.h>

#include <time.h>

main(int argc,char **argv){

int rank,size,ii,jj,i2,kk,kk2,i,j,k,j1,a,b,d,n=16;

float **mt,*x,*f,*s,fl,sf;

FILE *fv,*fm,*fs;

time_t start,stop;

MPI_Status st;

MPI_Init(&argc,&argv);// Initialisation MPI

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

fv=fopen("vect.dat","r");

fm=fopen("matr.dat","r");

fs=fopen("size.dat","r");

fscanf(fs,"%d",&n);

close(fs);

a=n/size;

b=n%size;

if(rank<b)k=a+1;

else k=a;

x=(float *)malloc(sizeof(float)*n);

f=(float *)malloc(sizeof(float)*n);

s=(float *)malloc(sizeof(float)*n);

mt=(float **)malloc(sizeof(float*)*k);

for(i=0;i<k;i++)mt[i]=(float *)malloc(sizeof(float)*n);

/*--------------------------------------------------------*/ 

for(i=0;i<rank;i++){

fscanf(fv,"%f",&fl);

for(j=0;j<n;j++)fscanf(fm,"%f",&fl);

}

for(i=0;i<k;i++){

fscanf(fv,"%f",&f[i]);

for(j=0;j<n;j++)fscanf(fm,"%f",&mt[i][j]);

for(ii=0;ii<size-1;ii++){

fscanf(fv,"%f",&fl);

for(j=0;j<n;j++)fscanf(fm,"%f",&fl);

}

}

close(fv);

close(fm);

start=time(0);

/*---------------------prjamoy-----------------------------*/         

for(i=0;i<n;i++){

d=i%size;

if(i<rank){

MPI_Recv(s,n,MPI_FLOAT,d,i,MPI_COMM_WORLD,&st);

MPI_Recv(&sf,1,MPI_FLOAT,d,i+n,MPI_COMM_WORLD,&st);

for(ii=0;ii<k;ii++){

fl=mt[ii][i];

f[ii]-=sf*fl;

for(j=0;j<n;j++)mt[ii][j]-=s[j]*fl;

}

}else{

if(d==rank){

ii=i/size;

fl=1.0/mt[ii][i];      

f[ii]*=fl;

for(j=0;j<n;j++)mt[ii][j]*=fl;

for(i2=0;i2<size;i2++){

if((i2!=rank)){

MPI_Send(mt[ii],n,MPI_FLOAT,i2,i,MPI_COMM_WORLD);

MPI_Send(&f[ii],1,MPI_FLOAT,i2,i+n,MPI_COMM_WORLD);

}

}

for(i2=ii+1;i2<k;i2++){

fl=mt[i2][i];

f[i2]-=f[ii]*fl;

for(j=0;j<n;j++)mt[i2][j]-=mt[ii][j]*fl;

}

}else{

MPI_Recv(s,n,MPI_FLOAT,d,i,MPI_COMM_WORLD,&st);

MPI_Recv(&sf,1,MPI_FLOAT,d,i+n,MPI_COMM_WORLD,&st);

ii=i/size;

if(rank<d)ii++;

for(i2=ii;i2<k;i2++){

fl=mt[i2][i];

f[i2]-=sf*fl;

for(j=0;j<n;j++)mt[i2][j]-=s[j]*fl;

}

}

}

}

/*---------------------------obratn--------------------------*/ 

for(i=n-1;i>=0;i--){

d=i%size;

ii=i/size;

if(d==rank){

for(i2=0;i2<size;i2++){

if((i2!=rank)){

MPI_Send(&f[ii],1,MPI_FLOAT,i2,i+2*n,MPI_COMM_WORLD);

}

}

for(i2=ii-1;i2>=0;i2--){

fl=mt[i2][i];

f[i2]-=f[ii]*fl;

}

}else{

MPI_Recv(&sf,1,MPI_FLOAT,d,i+2*n,MPI_COMM_WORLD,&st);

for(i2=0;i2<=ii;i2++){

fl=mt[i2][i];

f[i2]-=sf*fl;

}

}

}

stop=time(0);

/*-------------------------- print---------------------------*/

printf("\nMy rank is %d time=%d",rank,stop-start);

for(j=0;j<k;j++)  printf("\n%f",f[j]);

MPI_Finalize();

return(0);

}