#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); /* 0号处理机将M广播给所有处理机 */ m=M/p; if (M%p!=0) m++; f=(float*)malloc(sizeof(float)*(M+1)); /* 各处理机为主行元素建立发送和接收缓冲区(M+1) */ a=(float*)malloc(sizeof(float)*m*M); /* 分配至各处理机的子矩阵大小为m*M */ b=(float*)malloc(sizeof(float)*m); /* 分配至各处理机的子向量大小为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;ilmax) { lmax=a(i,k); l=k; } if (l!=v) /* 列交换 */ { for(t=0;tj) for(k=i;k=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;kj) for(k=0;k