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);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.