北航并行计算矩阵转置作业.docxVIP

  • 1
  • 0
  • 约3.53千字
  • 约 5页
  • 2019-09-27 发布于广东
  • 举报
矩阵转置并行实现 K算法描述: 若处理器个数为P,且它们的编号依次是0,1, 则将n阶矩阵A分成p 个大小为mxm的子块,m=[n/p]0 p个子块组成一个子块阵列,记其中第i行第 j列的子块为Aij,它含有M(i-l)m+l至第im行中的第(j-l)m+l至第jm列的所有 元索。对每一处理器按行主方式赋以二维下标,记编号为i的处理器的二维下标 为(v,u),其屮V二[i/“], u二imod,将A的子块存入下标为(v,u)表示的对应 处理器中。转置分为两步进行:第一步,子块转置;第二步,处理器内部转置。 为了避免对应子块交换数据是处理器发生死锁,可令下三角块先向与之对应的上 三角子块发送数据,然后从上三角子块接收数据;上三角子块数据先存放在缓冲 区buffer中,然后从与Z对应的卞三角了块接收数据,最后再将缓冲区中的数据 发送给下三角子块,流程图如下所示: #include ,lstdio.hn #include Hstdlib.h #include mpi.h include math.h #define E 0.0001 #define a(x,y) a[x*m+y] #define b(x,y) b[x*m+y] #define A(x,y) A[x*size+y] #define B(x,y) B[x*size+y] #define intsize sizeof(int) #define floatsize sizeof(float) #define charsize sizeof(char) int size’N; int m; int t; float *AZ *B; double starttime; double timel; double time2; int my_rank; int p; MPI_Status status; FILE *fdA; void Environment_Finalize(float *a,float *b) free(a); free(b); int main(int argc, char **argv) int i,j,k,my_rank/group_size; float *a,*b; int u,v; float temp; MPI_lnit(argc,argv); MPI_Comm_size(MPI_COMM_WORLD,group_size); MPI_Comm_rank(MPI_COMM_WORLD,my_rank); p=group_size; if(my_ra nk==0) starttime=MPI_Wtime(); fdA=fope n(,,dataln.txt;,rH); fscanf(fdA,%d %d, size, N); if(size != N) { puts(The in put is error「); exit(O); } A=(float*)malloc(floatsize*size*size); B=(float*)malloc(floatsize*size*size); for(i = 0; i size; i ++) { for(j = 0; j size; j ++) fscanf(fdA, %fz A+i*size+j); } fclose(fdA); } MPI_Bcast(size 丄 MPI _IN T,0,MPI_COMM_WORLD); t=(int)sqrt(p); if (tsize) t=size; if(size%t!=O) for(;;) { t-; if(size%t==O) break; } p=t*t; m=size/t; a=(float *)malloc(floatsize*m*m); b=(float *)malloc(floatsize*m*m); 讦(a==NULL| |b==NULL) printffallocate space fail!); 讦(my_ra nk==0) for(i=0;im;i++) for(j=0;jm;j++) a(U)=A(ij); } 讦(my_ra nk==O) { for(j=l;ip;i++) { v=i/t; u=i%t; for(j=v*m;j(v+l)*m;j++) for(k=u*m;k(u+l)*m;k++) b((j%m)/(k%m))=A(j,k); MPI_Send(bzm*m,MPI_FLOAl;i,i,MPI_COMM_WORLD); } } else if (my_rankvp) MPI_Recv(a,m*m,MPI_FLOAT,0/my_ra nk,MPI_COMM_WORLD,status); timel=MPI_Wtime()

文档评论(0)

1亿VIP精品文档

相关文档