中易网

怎么用MPI实现高斯列主元消去法的并行化

答案:1  悬赏:80  
解决时间 2021-01-15 19:41
  • 提问者网友:王者佥
  • 2021-01-14 19:44
怎么用MPI实现高斯列主元消去法的并行化
最佳答案
  • 二级知识专家网友:煞尾
  • 2021-01-14 20:59
有些麻烦 我也不会

#include "stdio.h"
#include "stdlib.h"
#include "mpi.h"
#include "math.h"
#define a(x,y) a[x*M+y]
#define b(x) b[x]
#define A(x,y) A[x*M+y]
#define B(x) B[x]
#define floatsize sizeof(float)
#define intsize sizeof(int)
int M;
int N;
int m;
float *A;
float *B;
double starttime;
double time1;
double time2;
int my_rank;
int p;
int l;
MPI_Status status;

void fatal(char *message)
{
printf("%s\n",message);
exit(1);
}

void Environment_Finalize(float *a,float *b,float *x,float *f)
{
free(a);
free(b);
free(x);
free(f);
}

int main(int argc, char **argv)
{
int i,j,t,k,my_rank,group_size;
int i1,i2;
int v,w;
float temp;
int tem;
float *sum;
float *f;
float lmax;
float *a;
float *b;
float *x;
int *shift;
FILE *fdA,*fdB;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&group_size);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
p=group_size;

if (my_rank==0)
{
starttime=MPI_Wtime();

fdA=fopen("dataIn.txt","r");
fscanf(fdA,"%d %d", &M, &N);
if (M != N-1)
{
printf("the input is wrong\n");
exit(1);
}

A=(float *)malloc(floatsize*M*M);
B=(float *)malloc(floatsize*M);

for(i = 0; i < M; i++)
{
for(j = 0; j < M; j++)
{
fscanf(fdA,"%f", A+i*M+j);
}
fscanf(fdA,"%f", B+i);
}
fclose(fdA);
}

MPI_Bcast(&M,1,MPI_INT,0,MPI_COMM_WORLD);
m=M/p;
if (M%p!=0) m++;

f=(float*)malloc(sizeof(float)*(M+1));
a=(float*)malloc(sizeof(float)*m*M);
b=(float*)malloc(sizeof(float)*m);
sum=(float*)malloc(sizeof(float)*m);
x=(float*)malloc(sizeof(float)*M);
shift=(int*)malloc(sizeof(int)*M);

if (a==NULL||b==NULL||f==NULL||sum==NULL||x==NULL||shift==NULL)
fatal("allocate error\n");

for(i=0;ishift[i]=i;


if (my_rank==0)
{
for(i=0;ifor(j=0;ja(i,j)=A(i*p,j);

for(i=0;ib(i)=B(i*p);
}

if (my_rank==0)
{
for(i=0;iif ((i%p)!=0)
{
i1=i%p;
i2=i/p+1;

MPI_Send(&A(i,0),M,MPI_FLOAT,i1,i2,MPI_COMM_WORLD);
MPI_Send(&B(i),1,MPI_FLOAT,i1,i2,MPI_COMM_WORLD);
}
}
else
{
for(i=0;i{
MPI_Recv(&a(i,0),M,MPI_FLOAT,0,i+1,MPI_COMM_WORLD,&status);
MPI_Recv(&b(i),1,MPI_FLOAT,0,i+1,MPI_COMM_WORLD,&status);
}
}

time1=MPI_Wtime();

for(i=0;ifor(j=0;j{
if (my_rank==j)
{
v=i*p+j;
lmax=a(i,v);
l=v;

for(k=v+1;kif (fabs(a(i,k))>lmax)
{
lmax=a(i,k);
l=k;
}

if (l!=v)
{
for(t=0;t{
temp=a(t,v);
a(t,v)=a(t,l);
a(t,l)=temp;
}

tem=shift[v];
shift[v]=shift[l];
shift[l]=tem;
}

for(k=v+1;ka(i,k)=a(i,k)/a(i,v);

b(i)=b(i)/a(i,v);
a(i,v)=1;

for(k=v+1;kf[k]=a(i,k);
f[M]=b(i);


MPI_Bcast(&f[0],M+1,MPI_FLOAT,my_rank,MPI_COMM_WORLD);

MPI_Bcast(&l,1,MPI_INT,my_rank,MPI_COMM_WORLD);
}
else
{
v=i*p+j;
MPI_Bcast(&f[0],M+1,MPI_FLOAT,j,MPI_COMM_WORLD);
MPI_Bcast(&l,1,MPI_INT,j,MPI_COMM_WORLD);

if (l!=v)
{
for(t=0;t{
temp=a(t,v);
a(t,v)=a(t,l);
a(t,l)=temp;
}

tem=shift[v];
shift[v]=shift[l];
shift[l]=tem;
}
}

if (my_rank<=j)
for(k=i+1;k{
for(w=v+1;wa(k,w)=a(k,w)-f[w]*a(k,v);
b(k)=b(k)-f[M]*a(k,v);
}

if (my_rank>j)
for(k=i;k{
for(w=v+1;wa(k,w)=a(k,w)-f[w]*a(k,v);
b(k)=b(k)-f[M]*a(k,v);
}
}

for(i=0;isum[i]=0.0;

for(i=m-1;i>=0;i--)
for(j=p-1;j>=0;j--)
if (my_rank==j)
{
x[i*p+j]=(b(i)-sum[i])/a(i,i*p+j);

MPI_Bcast(&x[i*p+j],1,MPI_FLOAT,my_rank,MPI_COMM_WORLD);

for(k=0;ksum[k]=sum[k]+a(k,i*p+j)*x[i*p+j];
}
else
{
MPI_Bcast(&x[i*p+j],1,MPI_FLOAT,j,MPI_COMM_WORLD);

if (my_rank>j)
for(k=0;ksum[k]=sum[k]+a(k,i*p+j)*x[i*p+j];

if (my_rankfor(k=0;k<=i;k++)
sum[k]=sum[k]+a(k,i*p+j)*x[i*p+j];
}

if (my_rank!=0)
for(i=0;iMPI_Send(&x[i*p+my_rank],1,MPI_FLOAT,0,i,MPI_COMM_WORLD);
else
for(i=1;ifor(j=0;jMPI_Recv(&x[j*p+i],1,MPI_FLOAT,i,j,MPI_COMM_WORLD,&status);

if (my_rank==0)
{
printf("Input of file \"dataIn.txt\"\n");
printf("%d\t%d\n", M, N);
for(i=0;i{
for(j=0;jprintf("%f\n",B(i));
}
printf("\nOutput of solution\n");
for(k=0;k{
for(i=0;i{
if (shift[i]==k) printf("x[%d]=%f\n",k,x[i]);
}
}
}

time2=MPI_Wtime();

if (my_rank==0)
{
printf("\n");
printf("Whole running time = %f seconds\n",time2-starttime);
printf("Distribute data time = %f seconds\n",time1-starttime);
printf("Parallel compute time = %f seconds\n",time2-time1);
}

MPI_Finalize();
Environment_Finalize(a,b,x,f);
return(0);
}

1. compile:
mpicc gauss.c -o gauss

2. run:
mpirun -np 4 gauss

3. result:
Input of file "dataIn.txt"
4 5
1.000000 4.000000 -2.000000 3.000000 6.000000
2.000000 2.000000 0.000000 4.000000 2.000000
3.000000 0.000000 -1.000000 2.000000 1.000000
1.000000 2.000000 2.000000 -3.000000 8.000000

Output of solution
x[0]=1.000000
x[1]=2.000000
x[2]=0.000000
x[3]=-1.000000

Whole running time = 0.011314 seconds
Distribute data time = 0.002518 seconds
Parallel compute time = 0.008796 seconds追问亲这是全主元高斯消去,我要的是列主元高斯消去!!!!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息