脉动阵列,其核心概念是让数据在运算单元的阵列中进行流动,减少访存的次数,并且使得结构更加规整,布线更加统一,提高频率。
二维脉动阵列
二维脉动阵列即如下图片所示,阵列了N*M的二维PE单元,单元间有连线用于数据流动,如下是将数据每次向下向右传递。下图中右侧为一个PE计算单元,完成 的一个函数计算,并继续向外传递数据。
二维脉动阵列实现矩阵乘法
矩阵乘法
例子 X ∗ W = Y X * W=Y X∗W=Y
[ X 11 X 12 X 13 X 21 X 22 X 23 X 31 X 32 X 33 X 41 X 42 X 43 ] ∗ [ Y 11 Y 12 Y 13 Y 21 Y 22 Y 23 Y 31 Y 32 Y 33 ] = [ U 11 U 12 U 13 U 21 U 22 U 23 U 31 U 32 U 33 U 41 U 42 U 43 ] \left[\begin{array}{llll} X_{11} & X_{12} & X_{13} \\ X_{21} & X_{22} & X_{23} \\ X_{31} & X_{32} & X_{33} \\ X_{41} & X_{42} & X_{43} \end{array}\right] *\left[\begin{array}{llll} Y_{11} & Y_{12} & Y_{13} \\ Y_{21} & Y_{22} & Y_{23} \\ Y_{31} & Y_{32} & Y_{33} \end{array}\right]=\left[\begin{array}{llll} U_{11} & U_{12} & U_{13} \\ U_{21} & U_{22} & U_{23} \\ U_{31} & U_{32} & U_{33} \\ U_{41} & U_{42} & U_{43} \end{array}\right] ⎣⎢⎢⎡X11X21X31X41X12X22X32X42X13X23X33X43⎦⎥⎥⎤∗⎣⎡Y11Y21Y31Y12Y22Y32Y13Y23Y33⎦⎤=⎣⎢⎢⎡U11U21U31U41U12U22U32U42U13U23U33U43⎦⎥⎥⎤
定义PE计算单元
定义PE单元的连线与计算如下:从上输入Y,从左输入X,然后做累加运算保存到寄存器,向右输出X,向下输出Y
二维脉动阵列矩阵乘运算步骤
将X Y矩阵从二维脉动阵列的左侧和上方输入,然后不断的将每个阵列内部的接受到的数据向下向左继续传递。
\1. 将数据按照如下格式排列好准备向右向下输入,PE阵列单元初始化为0初始值
0 | 0 | Y33 | ||||||
---|---|---|---|---|---|---|---|---|
0 | Y32 | Y23 | ||||||
Y31 | Y22 | Y13 | ||||||
Y21 | Y12 | 0 | ||||||
Y11 | 0 | 0 | ||||||
0 | 0 | 0 | X13 | X12 | X11 | U11 | U12 | U13 |
0 | 0 | X23 | X22 | X21 | 0 | U21 | U22 | U23 |
0 | X33 | X32 | X31 | 0 | 0 | U31 | U32 | U33 |
X43 | X42 | X41 | 0 | 0 | 0 | U41 | U42 | U43 |
\2. 周期1,向右向下移动数据输入到PE阵列单元的输入侧
0 | 0 | Y33 | |||||
---|---|---|---|---|---|---|---|
0 | Y32 | Y23 | |||||
Y31 | Y22 | Y13 | |||||
Y21 | Y12 | 0 | |||||
0 | 0 | 0 | X13 | X12 | U11 = X11*Y11 | U12 | U13 |
0 | 0 | X23 | X22 | X21 | U21 | U22 | U23 |
0 | X33 | X32 | X31 | 0 | U31 | U32 | U33 |
X43 | X42 | X41 | 0 | 0 | U41 | U42 | U43 |
\3. 周期2,向右向下移动数据继续输入数据到PE阵列单元的输入侧,PE阵列中向下想右传输寄存的上一周期输入的数据
0 | 0 | Y33 | ||||
---|---|---|---|---|---|---|
0 | Y32 | Y23 | ||||
Y31 | Y22 | Y13 | ||||
0 | 0 | 0 | X13 | U11 = X11Y11 + X12Y21 | U12 = X11*Y12 | U13 |
0 | 0 | X23 | X22 | U21 = X21*Y11 | U22 | U23 |
0 | X33 | X32 | X31 | U31 | U32 | U33 |
X43 | X42 | X41 | 0 | U41 | U42 | U43 |
\4. 周期3,向右向下移动数据
0 | 0 | Y33 | |||
---|---|---|---|---|---|
0 | Y32 | Y23 | |||
0 | 0 | 0 | U11 = X11Y11 + X12Y21 + X13*Y31 | U12 = X11Y12+X12Y22 | U13 = X11*Y13 |
0 | 0 | X23 | U21 = X21*Y11 + X22 * Y21 | U22 = X21*Y12 | U23 |
0 | X33 | X32 | U31 = X31 * Y11 | U32 | U33 |
X43 | X42 | X41 | U41 | U42 | U43 |
如此一直向下向右移动X,Y数据,直到X43和Y33都已经到达了U43计算单元完成了最后的累加计算,输出整个PE阵列的值即可, 对应的即结果矩阵的每一个值。
OTHER
如上可以观察到我们的X,Y矩阵都是流动进入PE阵列,我们还可以做如下一些改变实现二维脉动的其他计算:
• PE阵列的单元事先有初始值,非0,然后流动数据进入
• 固定一个数据如X,只流动Y进入
• PE计算单元做更复杂的计算
• 流出数据x,y是处理过后的,非流入原始值
脉动阵列的特点:
• 每个PE只与其邻近的PE进行通信,PE之间的通信具有局部性,而且通信是规则的
• 每一个PE都是相同的,但个别也可以不同
• 通过时钟激励统一处理