2. 矩阵乘
  由于矩阵乘是二维数组运算,故它比矩阵加要复杂一些。设A、B和C为三个8×8的二维矩阵。若给定A和B,则C=A*B的64个分量可利用下列公式计算。
  
  如果在SIMD计算机上求解这个问题,则可执行下列FORTRAN程序
  DO 10 I=0,7
  C(I, J)=0
  DO 20 K=0, 7
  20 C(I, J)=C (I, J )+A(I, K)*B(K,J)
  10 CONTINUE
  类似的程序在SISD计算机上要用K,I,J三重循环才能完成,每重循环执行8次,共需512次加乘时间(不考虑其它循环控制指令所需时间)。而在SIMD计算机上执行上面的程序时,如果利用8个处理部件并行计算,则J循环只需一次即可完成,I、K循环照旧。这样,便可使速度提高到8倍,即缩短为64次加乘时间。局部存储器中的数据分布如下:
局部存储器中的数据分布
PEM0 PEM1 PEM2 PEM3 PEM4 PEM5 PEM6 PEM7
M
b00
b10
M
b70
c00
c10
M
c70
a00
a10
M
a70
M
M
b01
b11
M
b71
c01
c11
M
c71
a01
a11
M
a71
M
M
b02
b12
M
b72
c02
c12
M
c72
a02
a12
M
a72
M
M
b03
b13
M
b73
c03
c13
M
c73
a03
a13
M
a73
M
M
b04
b14
M
b74
c04
c14
M
c74
a04
a14
M
a74
M
M
b05
b15
M
b75
c05
c15
M
c75
a05
a15
M
a75
M
M
b06
b16
M
b76
c06
c16
M
c76
a06
a16
M
a76
M
M
b07
b17
M
b77
c07
c17
M
c77
a07
a17
M
a77
M

  在并行处理机上,J循环只需一次。速度提高到8倍。
  PE0:c00=a00b00+a01b10+a02b20……+a07b70
  PE1:c01=a00b01+a01b11+a02b21……+a07b71
       ……
  PE7:c07=a00b07+a01b17+a02b27……+a07b77
  PE0:c10=a10b00+a11b10+a12b20……+a17b70
  PE1:c11=a10b01+a11b11+a12b21……+a17b71
       ……
  PE7:c17=a10b07+a11b17+a12b27……+a17b77
       ……
  PE0:c70=a70b00+a71b10+a72b20……+a77b70
  PE1:c71=a70b01+a71b11+a72b21……+a77b71
       ……
  PE7:c77=a70b07+a71b17+a72b27……+a77b77
图10.9 矩阵乘程序执行流程图
  如果把IlliacIV的64个处理单元全部利用起来并行运算,即把K循环的运算也改为并行,则可进一步提高速度。要做到这一点,需要重新在阵列存储器中恰当分配数据。

  从表面上看,这个程序在每个处理部件内部的执行过程和传统的SISD计算机是一样的,但是由于8个处理部件执行同一指令流,并行操作,故实际解决问题的方式是不同的:第一,控制器执行的指令,表面上是标量指令,但实际上等效于向量指令(如向量取、向量存、向量加、向量乘等)。第二,执行这个程序对于A、B、C向量在处理单元存储器中的分布方案提出了一定的要求。作乘法时,操作数B(K,J)都从本处理部件的PEM中读取;但被乘数A(I,K)对所有处理部件0£J£7都是一样的,它一般都不在本处理部件存储器内。因此,要利用阵列处理机的"广播"功能,把一次循环的公共系数A(I, K)取出后送到控制器,再广播到全部8个处理单元的RGA中去。