1.优点
对于普通并行,数据同时到达,如果最大化共享,即16个PE的输入图像数据是同一份,那么很明显,必须在数据进入乘法器之前,同时将数据复制多份,分发给16个PE,或者说,同一份数据,需要同时驱动给16个PE。这会导致布局布线能力并且考验晶体管的驱动能力,导致频率降低。而脉动阵列一个乘法器只需要驱动相邻的乘法器,延迟大幅度降低, 频率可以达到很高。
普通并行一个PE中的16个mul是同时计算的,那么,卷积的filter的尺寸大小,会强烈影响计算效率。
假设一个卷积需要的乘法计算次数为N,
如果N<16,那么一个PE可以一次就算出结果,但是会有16-N个mul资源浪费。可见N越小,越浪费。
如果N=16,那么最好了,PE不仅能够一次算出结果,还没有mul浪费。
如果N>16,那么不好意思,一次只能算16个乘法,剩下的N-16,留着下次再算,或者调用其他PE去计算。但是这样就会增加不同PE间的连接关系,控制逻辑非常复杂,造成设计难度增大。
所以,DianNao和NVDLA的扁平化结构,对filter的尺寸是非常敏感的。
而对于脉动阵列,它不受filter尺寸的大小的限制,不会有资源的浪费。
2.运算
这是一般矩阵的计算过程,对于卷积计算,需要把卷积矩阵转化为普通矩阵
X=[
1 2
3 4]
h= [
5 6
7 8]
其中,X是卷积核。
1 X的每一行生成一个小矩阵
第一行[1 2],
首先插入1,得[1 0],补的0的数量等于H的列数-1。这里,h的列数是2,故补2-1=1个0。
再右移一位插入2,得出第二行,得[10
2 1]
再右移一位得出第三行,得
[
1 0
2 1
0 2]。把这个等于H0。
第二行[3 4],同理得
H1=[
3 0
4 3
0 4]。
观察这个过程,明显是将上一行右移再插入新的值到第一个列从而得出下一行。
我们可以假设第0行是[0
0],最后一行是[0 0]。
[
0 0
3 0
4 3
0 4
0 0
]就可以看到规律。
2 算出Toeplitz矩阵
A= [
H0 O
H1 H0
O H1],其中O是一个由若干个0组成的小矩阵。
这个例子中,
A=
[
1 0 0 0
2 1 0 0
0 2 0 0
3 0 1 0
4 3 2 1
0 4 0 2
0 0 3 0
0 0 4 3
0 0 0 4
]
3 将h变为列向量,按照行的顺序来,得
[
5
6
7
8
]
4 将Toeplitz矩阵和列向量相乘,得
[
5
16
12
22
60
40
21
52
32
]
整理为矩阵得,
[
5 16 12
22 60 40
21 52 32
]。
下面来验证一下,
首先将卷积核旋转180度,得
[
4 3
2 1
]
从左上开始,滑动算点积,得
5*1= 5,
5*2+ 6*1 = 16,
6*2= 12,
5*3+7*1=22,
5*4+6*3+7*2+8*1=60,
。。。。。。
正确!!!