北航并行计算矩阵相乘作业.docxVIP

  • 6
  • 0
  • 约4.52千字
  • 约 7页
  • 2019-09-27 发布于广东
  • 举报
矩阵相乘并行实现 1.算法描述: 设有如下矩阵相乘: C=AxB 口子矩 ,的n其中A, B分别是mxk和kxn矩阵,C是mxn矩阵。若处理器个数为p 它们的编号依次是0」,…,则设可将矩阵A、B、C分成p个大小为mxm 块,其中 A=(Aij)mXm, B=(Bij)mXm,和 C=(Cij)mxm,其中 A「ij, Bij 和 Cij 是 nX 阵。同时假设机一 口子矩 ,的n 定义对角块矩阵= dtag (曙)=饥讥血屮讼 J,贝I」 V—1 MT V—1 ?TL7 其中彳述肪宓订X0, 打利用此关系式,将节点编 号从一维映射到二维,数据#灯,弘,C订存放在P艸,可得到下面的在处理机爲曲c 结点上的算法。该算法数据交量 DTAp = m X 2 X: n2 + (w — 1} X 2 X n2 = 2{2m — 1J?2 = 4m2n2/Jy— 2m2n2/-p 算法流程如下: 流程图如下所示: 读取矩阵 获取矩阵行列数 将行列数广播给所有处理器 I 由主进程把数据发送给所有处理器 I 主进程读取自己的子方阵 对子方阵进行相乘处理 各子方阵把结果发给主进程 I 主进程接到处理结果 I 主进程输出进程结果 2、程序代码: #include stdlib.h #include string.h #inelude mpi.h #include time.h #include stdio.h #inelude math.h float **A, **B, **C; float *a, *b, *c, *tmp_a, *tmp_b; int dg=1000, dl, dl2,p, sp; int my_rank, my_row, my_col; MPI_Status status; int get_index(int row, int col, int sp) { return ((row+sp)%sp)*sp + (col+sp)%sp; void random_A_B() { int ij; srand((unsigned int)time(NULL)); for(i=0; idg; i++) for(j=O; jdg; j++) { A[i][j] = rand(); B[i][j] = rand(); C[i][j]=O.O; } } void scatter_A_B() { int i,j,k,l; int p」min,p」max,p_jmin,p_jmax; for(k=0; kp; k++) { p_jmin = (k % sp ) * dl; p_jmax = (k % sp + 1) * dl-1; p」min = (k ?(k % sp))/sp * dl; pjmax = ((k ?(k % sp))/sp +1) *dl -1; 1 = 0; for(i=p_imin; iv二p_imax; i++) { for(j=p」min; j=pjmax; j++) { tmp_a[l] = A[i][j]; tmp_b[l] = B[i][j]; I++; } } if(k==O) { memcpy(a, tmp_a, dl2 * sizeof(float)); memcpy(b, tmp_b, dl2 * sizeof(float)); } else { MPI_Send(tmp_a, dl2, MPI_FLOA1; k, 1, MPI_COMM_WORLD); MPI_Send(tmp_b, dl2, MPI_FLOA1; k, 2, MPI_COMM_WORLD); } } void init_alignment() { MPI_Sendrecv(a, dl2, MPI_FLOA1; get」ndex(my_row,my_col?my_row,sp), 1, tmp_a, dl2, MPI_FLOAT, get_index(my_row,my_col+my_row,sp), 1, MPI_COMM_WORLD, status); memcpy(a, tmp_a? dl2 * sizeof(float)); MPI_Sendrecv(b, dl2, MPI_FLOA1; getjndex(my_row-my_col,my_col,sp), 1, tmp_b, dl2, MPI_FLOAE get」ndex(my_row+my_col,my_col,sp), 1, MPI_COMM_WORLD, status); memcpy(b, tmp_b, dl2 * sizeof(float)); } void main_shift() { int for(l=0; lsp; I++) { for(i=0; idl;

文档评论(0)

1亿VIP精品文档

相关文档