由于矩阵乘是二维数组运算,故它比循 开始 环加要复杂一些。设A、B和C为3个8×8 的二维矩阵。若给定A和B,则为计算C=A =0 矩阵乘 B的64个分量,可用下列公式 LIM : =8 其中,0≤还7且0≤j≤7。 c,):=00≤1≤7 在SSD计算机上求解这个问题,可执 行用 FORTRAN语言编写的下列程序 K:=0 DO10I=0,7 DO10J=0,7 LR5.0A10≤7 C(1,J)=0 播送: BCAST A(,K) RGAO: ERGA(K) 0≤J≤7 DO10K=0,7 10C(1,J)=C(1,J)+A(1,K)“B(K,J) 需要经过I、J、K三重循环完成。每重循环 RA0.=6010s≤7 执行8次,总共需要512次乘、加的时间 此外每次还应包括执行循环控制、判别等其 向量加:ADDc(,) BGA()=RGA)+C(L,nosI<7 他操作需花费的时间。而如果在SMD阵列 处理机上运算,则可用8个处理单元并行计 向量存:sToc(,) RGA①)送C(,1)0≤≤7 算矩阵C(I,J的某一行或某一列,即将J循 环或I循环转化成一维的向量处理,从而消 K:=K+1 去了一重循环。 以消去J循环为例,可执行用FOR TRAN语言编写的下列程序 DO10I=0,7 「1:=t+1 C(I,J)=0 DO10K=0,7 0 C(I, J)=C(I, J)+A(I, K)*B(K 让J=0~7各部分同时在PE~PE1上运算, 这样,只需K、I二重循环,速度可提高至8 只需64次乘、加时间。其程序流程图 图6.5矩阵乘程序执行流程图
矩阵乘
A(0,0) A(0,1) A(0,7 A(1,0) A(1,1) A(1,7) A(7,0) A(7,1) A(7,7) B(0,0) B(0,1) B(0,7) B(1,0) B(1,1) B(1,7) B(7,0) B(7,1) B(7,7) C(0,0) C(0,1) C(0,7 C(1,0) C(1,1) C(1,7) C(7,0 c(,1) C(7,7) PEM PEM PEM 7 图6.6矩阵乘的存贮器分配举例
循环 k=0 k=1 =2 PEO AO 0 0 PEl Al 0.1 0.1 0.1 PE2A2 12 0~2 0~2 累加和 PE3 A3 2.3 0~3 0~3 PE4 A4 3.4 1~4 0~4 PE5 A5 4.5 2~5 0~5 Pe6 A6 5.6 3~6 0~6 PEZ A7 4~7 0~7
A0 A1 A2 A3 A4 A5 A6 A7 0 0,1 1,2 2,3 3,4 4,5 5,6 6,7 0 0,1 0~2 0~3 1~4 2~5 3~6 4~7 0 0,1 0~2 0~3 0~4 0~5 0~6 0~7 PE0 PE1 PE2 PE3 PE4 PE5 PE6 PE7 循环 k=0 k=1 k=2 累 加 和