Paper title:Non-Blocking Simultaneous Multithreading:Embracing the Resiliency of Deep Neural Networks
Publication:MACRO’20
这篇文章是提出了一个可以在运行时进行加速的方法,争对的是量化后的INT8矩阵,文中提出在模型的推理中,因为RELU的使用等原因,模型中常常会出现很多的零值,对INT8也会有高四位为零或第四位为零的情况,如下图:
在这些主流模型中,只有大约20%的运算是纯8bit8bit的,其它要么有高四位零第四位零,要么全部是0。
争对这种情况,本文提出了一种方法,以向量内积为例:
O
=
∑
i
=
0
K
w
i
x
i
=
∑
i
=
0
K
/
2
−
1
w
i
x
i
+
∑
i
=
K
/
2
K
−
1
x
i
w
i
O=\sum_{i=0}^{K}w_ix_i=\sum_{i=0}^{K/2-1}w_ix_i+\sum_{i=K/2}^{K-1}x_iw_i
O=i=0∑Kwixi=i=0∑K/2−1wixi+i=K/2∑K−1xiwi
只要把右边的两个式子并行做,这样不就能并行了吗,顺便也能说我们这是多线程呀。
这张图就是大抵流程,中间的后文中没有使用就是把左转化成了右。
但是原来的两个88的乘法该怎么办呢,现在只有一个乘法器,这就是本文体系结构的重点。
先直接给他的体系结构的设计和使用的对应算法吧,我觉得足够简单直白了。
您要是愿意看,我估计看个几分钟就能看懂,不行的话就看看下面这张。
这个对应了算法中的{if all are non-zero}的else情况,使用移位计算8*8乘法。
x
0
x_0
x0设为低四位,
x
1
x_1
x1设为高四位,
w
w
w直接原封不动的传进来,毕竟这个乘法器其实是两个(5,8)乘法器组合而成的嘛,于是输出就是
y
=
x
[
0
,
3
]
∗
w
+
x
[
4
,
7
]
∗
w
∗
16
y=x_{[0,3]}*w+x{[4,7]}*w*16
y=x[0,3]∗w+x[4,7]∗w∗16
如果每个数都是非零的,那么不好意思,对8*8的运算,你必须要缩减到4*8。具体方法呢,又分两种情况,如果一个数前四位不全是0(不是0000 ****),那保留的就必定是前四位,然后根据第五位决定一下四舍五入,对应算法中的
i
f
(
M
S
B
(
x
i
)
!
=
0000
)
if(MSB(x_i)!=0000)
if(MSB(xi)!=0000)
如果前四位全是0,那就保留后四位运算啦,就是这样。
至于提出的SySMT就十分十分经典,基本没变。不过提出了一个重排挺有意思的,因为我懒得看Evaluation我就没仔细看重拍的效果了,以上。