一种支持动态精度的DNN加速器及其实现方法转让专利

申请号 : CN201811646257.9

文献号 : CN109711542B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘龙军杨少飞孙宏滨李宝婷郑南宁

申请人 : 西安交通大学

摘要 :

一种支持动态精度的DNN加速器及其实现方法,包括突触存储SBin、输入神经元存储NBin、输出神经元存储NBout以及S‑PIP阵列,S‑PIP阵列包括128*8个S‑PIP,突触存储SBin从DRAM中缓存128个卷积核,每个卷积核中突触值缓存到每个S‑PIP中的突触寄存器SR中,作为S‑PIP的输入;输入神经元存储NBin从DRAM中缓存8个神经元窗,每个神经元窗包含16个神经元值,每个神经元窗中的神经元值作为S‑PIP的输入;每个S‑PIP的计算结果输出到输出神经元存储NBout,输出神经元存储NBout缓存到DRAM。本发明提高了卷积层和全连接层的加速比,同时降低了神经元存储带宽。

权利要求 :

1.一种支持动态精度的DNN加速器的实现方法,其特征在于,

DNN加速器结构在卷积层上的计算:DNN加速器中的所有S-PIP计算同步执行;首先将分解的2比特突触从缓存中送入不同S-PIP阵列中的列中的SR,其次将分解为2比特的神经元送入到S-PIP阵列中的行中的BIP中,并和来自SR的突触进行乘积计算,然后将乘积结果移位累加,最终经过激活值函数单元输送到输出神经元存储NBout;

DNN加速器在池化层上计算:一个完整的卷积窗口的卷积计算结果通过Psum2输出作为max模块的一个输入,输出神经元存储NBout反馈的i_nbout作为max模块的另外一个输入;

每完成一次完整卷积窗口的计算时进行一次池化窗口计数,然后max模块对两个输入值进行比较,其中的较大值暂时作为最大值,当计数达到池化窗口大小时,将最大值输出到输出神经元存储NBout;

DNN加速器结构用在全连接层上的计算:神经元位宽设置为16位,包括以下几个步骤:

1)从DRAM中缓存突触和神经元数据到突触存储SBin和输出神经元存储NBout,在第一周期中,首先将第一个128组分解的突触中的(s,s-1)bit存储在第一S-PIP列的SR中;之后将第一个神经元窗口的(n,n-1)bit送到第一S-PIP列的BIP中进行计算,n为神经元的位宽,每个窗口16个神经元;其中s为突触的位宽,一组突触的数目为16;

2)第二个周期,首先将第二个128组分解的突触的(s,s-1)bit送入第二S-PIP列的SR中,其次将第二个神经元窗的(n,n-1)bit送入到第二S-PIP列中的BIP中进行计算,同时,将第一个神经元窗的(n-2,n-3)bit送入到第一S-PIP列的BIP中,保存在第一S-PIP列中的SR中的突触(s,s-1)bit在本周期保持不变;

3)之后的S-PIP列中的计算按照步骤1)和步骤2)中的方式依次类推;8个周期后,在第一S-PIP列中,第一个128组突触的(s,s-1)bit数据和第一个神经元窗口的神经元完成乘积计算,在剩余7个S-PIP列中,不同的128突触的(s,s-1)bit数据和神经元仍然按照步骤1)和步骤2)中方式进行计算,其中,第8个128组突触的(s,s-1)bit和第8个神经元窗的(n,n-1)bit开始计算;

4)第9个周期,首先将第一个周期送入的第一个128组突触的(s-2,s-3)bit送入第一S-PIP列中,其次将第一个神经元窗的(n,n-1)bit重新送入第一S-PIP列中的BIP中;重复步骤

1)到步骤3)的过程;第8个128组突触的(s-2,s-3)bit和第8个神经元窗开始计算,直到(Es/

2)*8个周期后将第一个神经元窗的16个神经元和第一个128组突触计算结束,剩余的S-PIP列中继续计算直到计算完所有数据;其中,Es为突触位宽;

5)在步骤4)中计算得到的结果送入第二S-PIP列中进行累加,依次类推,经过(Es/2)*8+8个周期后,最终的8个神经元窗和128组突触的乘加结果沿S-PIP阵列的每一行输出到输出神经元存储NBout。

2.根据权利要求1所述的一种支持动态精度的DNN加速器的实现方法,其特征在于,步骤4)中奇数位宽的突触/神经元扩展为偶数位宽的突触/神经元,突触位宽为Es,神经元位宽为En,Es和En均是偶数。

说明书 :

一种支持动态精度的DNN加速器及其实现方法

技术领域

[0001] 本发明涉及一种支持动态精度的DNN加速器及其实现方法。

背景技术

[0002] 当前定点计算中存在很多冗余位,这些冗余位带来的无效计算导致了定点位宽加速器性能的下降。量化是去除这些冗余位的有效手段,目前有很多针对DNN(深度神经网络)进行量化的算法如QNN,Dorefa-net,WRPN,TWN,XNOR-Net,在尽可能减小准确性损失的同时极大的降低了突触和神经元的位宽。同时这些算法表明,在不同网络模型之间对突触和神经元可以采用不同的位宽尺度进行计算。Judd et al.提出了一种既能将准确性下降保持在很小的水平又能减少神经元位宽的策略,这种策略甚至可以在没有准确性损失的情况下降低神经元的位宽。该策略提出在同一网络的不同层之间对神经元可以采用不同的位宽。
[0003] 之前的大多数加速器研究存在one fits all问题,一种加速器通常按照最坏情况来对量化后的DNN进行计算。采用了并行计算的策略需要突触和神经元的位宽在整个网络中保持固定。
[0004] 一些/极少数先进的加速器设计注意到了这个问题,提出了可变位宽加速器的设计,既能支持不同量化尺度的DNN模型,又能支持同一网络模型中不同层的神经元或突触位宽可变的情况。比如,STR逐位串行输入神经元,同时并行输入固定位宽的突触,这种策略解决了在同一网络不同层中采用不同位宽的神经元所带来的灵活性。Loom在STR的基础上更进一步,通过输入和突触两者都逐位串行输入计算的方式,同时支持网络中可变的突触和神经元位宽,这种方式通过大幅提升突触带宽来提高性能。以上方法虽然采用了不同计算方式来提升灵活性,但是加速比性能不够突出。
[0005] 在之前出现的变位宽加速器中,Stripes,Tartan,Loom更重视位宽的灵活性而采用了串行设计,这种方式降低了并行计算所带来的益处。Bit Fusion采用2的幂的位宽设计来支持加速器位宽的灵活性,对8bit及其以下的神经元\突触采用并行计算,引入补码计算乘法,这种设计会增加计算和控制逻辑代价。

发明内容

[0006] 发明的目的在于提出一种支持动态精度的DNN加速器及其构建方法。
[0007] 为实现上述目的,本发明采用如下的技术方案:
[0008] 一种支持动态精度的DNN加速器,包括突触存储SBin、输入神经元存储NBin、输出神经元存储NBout以及S-PIP阵列,S-PIP阵列包括128*8个S-PIP,突触存储SBin从DRAM中缓存128个卷积核,每个卷积核中突触值缓存到每个S-PIP中的突触寄存器SR中,作为S-PIP的一个输入;输入神经元存储NBin从DRAM中缓存8个神经元窗,每个神经元窗包含16个神经元值,每个神经元窗中的神经元值作为S-PIP的一个输入;每个S-PIP的计算结果输出到输出神经元存储NBout,输出神经元存储NBout缓存到DRAM中。
[0009] 本发明进一步的改进在于,在S-PIP阵列中,沿同一行的S-PIP共享一个共同的32bit突触总线,沿同一列的S-PIP共享一个共同的32bit神经元总线。
[0010] 本发明进一步的改进在于,每个S-PIP包括16个BIP,一个32bit宽的突触寄存器SR,16个NEG模块,一个16输入的加法树,2个累加移位模块PSum1与累加移位模块PSum2,以及max模块;S-PIP的输入来自于突触存储SBin中的卷积核和输入神经元存储NBin中的神经元窗,其中,每个卷积核包含16个突触,每个神经元窗包含16个神经元;S-PIP的计算结果输出到输出神经元存储NBout。
[0011] 本发明进一步的改进在于,BIP由与门,半加器和全加器组成,用于完成2bit无符号数的乘法计算;突触寄存器SR用于缓存来自卷积核中的16个被分解为不同数量组合的2bit的突触数据;每个BIP的结果通过NEG模块根据每一对突触和对应的神经元的乘积结果所对应的符号位,进行带符号的2的补码计算,并将计算结果输入到加法树,加法树对补码计算结果进行加计算,并将计算结果输送到累加移位模块PSum1;累加移位模块PSum1将加法树输出的计算结果进行累加移位,并将累加移位的结果输出到2选1多路选择器,当进行卷积层计算时,2选1多路选择器将累加移位模块PSum1结果输出到累加移位模块PSum2;当进行全连接层计算时,2选1多路选择器将上一S-PIP列中的部分和输出到累加移位模块PSum2。
[0012] 本发明进一步的改进在于,累加移位模块PSum1和累加移位模块Psum2中使用2bit移位;为兼容最坏情况,S-PIP的突触和神经元位宽均采用16bit,因此突触和神经元buffer的深度设置为8。
[0013] 本发明进一步的改进在于,累加移位模块PSum2的另一个输入为Nb,Nb用于判断突触-神经元对的计算数目是否超过窗口大小;如果超过,则将来自输出神经元存储NBout的部分和与当前的累加移位模块PSum2的计算结果进行累加,并将累加结果输出到输出神经元存储NBout。
[0014] 本发明进一步的改进在于,当NEG模块的输入最高有效位为1时,加法树从部分和中减去对应于MSB的突触和神经元的BIP结果。
[0015] 一种支持动态精度的DNN加速器的实现方法,DNN加速器结构在卷积层上的计算:DNN加速器中的所有S-PIP计算同步执行;首先将分解的2比特突触从缓存中送入不同S-PIP阵列中的列中的SR,其次将分解为2比特的神经元送入到S-PIP阵列中的行中的BIP中,并和来自SR的突触进行乘积计算,然后将乘积结果移位累加,最终经过激活值函数单元输送到输出神经元存储NBout;
[0016] DNN加速器在池化层上计算:一个完整的卷积窗口的卷积计算结果通过Psum2输出作为max模块的一个输入,输出神经元存储NBout反馈的i_nbout作为max模块的另外一个输入;每完成一次完整卷积窗口的计算时进行一次池化窗口计数,然后max模块对两个输入值进行比较,其中的较大值暂时作为最大值,当计数达到池化窗口大小时,将最大值输出到输出神经元存储NBout;
[0017] DNN加速器结构用在全连接层上的计算:神经元位宽设置为16位,包括以下几个步骤:
[0018] 1)从DRAM中缓存突触和神经元数据到突触存储SBin和输出神经元存储NBout,在第一周期中,首先将第一个128组分解的突触中的(s,s-1)bit存储在第一S-PIP列的SR中;之后将第一个神经元窗口的(n,n-1)bit(n为神经元的位宽,每个窗口16个神经元)送到第一S-PIP列的BIP中进行计算;其中s为突触的位宽,一组突触的数目为16;
[0019] 2)第二个周期,首先将第二个128组分解的突触的(s,s-1)bit送入第二S-PIP列的SR中,其次将第二个神经元窗的(n,n-1)bit送入到第二S-PIP列中的BIP中进行计算,同时,将第一个神经元窗的(n-2,n-3)bit送入到第一S-PIP列的BIP中,保存在第一S-PIP列中的SR中的突触(s,s-1)bit在本周期保持不变;
[0020] 3)之后的S-PIP列中的计算按照步骤1)和步骤2)中的方式依次类推;8个周期后,在第一S-PIP列中,第一个128组突触的(s,s-1)bit数据和第一个神经元窗口的神经元完成乘积计算,在剩余7个S-PIP列中,不同的128突触的(s,s-1)bit数据和神经元仍然按照步骤1)和步骤2)中方式进行计算,其中,第8个128组突触的(s,s-1)bit和第8个神经元窗的(n,n-1)bit开始计算;
[0021] 4)第9个周期,首先将第一个周期送入的第一个128组突触的(s-2,s-3)bit送入第一S-PIP列中,其次将第一个神经元窗的(n,n-1)bit重新送入第一S-PIP列中的BIP中;重复步骤1)到步骤3)的过程;第8个128组突触的(s-2,s-3)bit和第8个神经元窗开始计算,直到(Es/2)*8个周期后将第一个神经元窗的16个神经元和第一个128组突触计算结束,剩余的S-PIP列中继续计算直到计算完所有数据;
[0022] 5)在步骤4)中计算得到的结果送入第二S-PIP列中进行累加,依次类推,经过(Es/2)*8+8个周期后,最终的8个神经元窗和128组突触的乘加结果沿S-PIP阵列的每一行输出到输出神经元存储NBout。
[0023] 本发明进一步的改进在于,步骤4)中奇数位宽的突触/神经元扩展为偶数位宽的突触/神经元,突触位宽为Es,神经元位宽为En,Es和En均是偶数。
[0024] 与现有技术相比,本发明具有的有益效果:
[0025] 本发明在选择计算位宽的问题上提升加速器的效率和弹性,提出了DNN加速器,即一种可变位宽DNN加速器架构,它将神经元\突触的位宽分解为不同长度的2bit数据,2bit数据串行输入进行计算,2bit突触和2bit神经元的乘法采用原码。本发明具有以下优点:
[0026] (1)加速比:在相同的输入数据量和相同的计算吞吐量同时准确性保持为100%的情形下,平均而言,本发明相对于DaDianNao,Stripes和Loom在主要网络模型的卷积层上分别获得了2.42×,1.24×,1.78×的性能提升,在全连接层上相对于Stripes和Loom分别获得了1.42×和1.7×的加速。
[0027] (2)带宽及存储:和Stripes,Loom相比,DNN加速器的神经元存储带宽降低了一半,但是计算带宽保持不变,突触的存储带宽保持不变,计算带宽是loom的2倍,突触的存储规模和loom相同;相对于DaDianNao提高了片上的突触存储规模,减少了片外的突触读取;在匹配DaDianNao的计算峰值带宽的情况下,DNN加速器的神经元存储相对于Loom减少了1/2。

附图说明

[0028] 图1是本发明中加速器DNN加速器的整体结构图。
[0029] 图2是本发明中加速器DNN加速器的组成单元S-PIP(Serial-Parallel Inner Product)结构图。
[0030] 图3是本发明中S-PIP的组成单元BIP(Basic Inner Product)结构图。
[0031] 图4是本发明中P-SIP处理2个4bit操作数和另外2个4bit操作数的乘加运算的结构示意图。
[0032] 图5是本发明中P-SIP在4个时钟周期内处理2个4bit操作数和另外2个4bit操作数乘加运算的过程示意图。

具体实施方式

[0033] 下面结合附图和实施例对本发明作更详细的说明。
[0034] 本发明中的*表示相乘。
[0035] 参见图1,本发明的支持动态精度的DNN加速器包括突触存储SBin、输入神经元存储NBin、输出神经元存储NBout以及S-PIP阵列,S-PIP阵列包括128*8个S-PIP,突触存储SBin从DRAM中缓存128个卷积核,从filter0到filter127,其中每个卷积核包含16个突触,每个filter中突触值缓存到每个S-PIP中的SR(突触寄存器,突触寄存器为32比特宽)中,作为S-PIP的一个输入。输入神经元存储NBin从DRAM中缓存8个神经元窗,从window0到window7,每个神经元窗包含16个神经元值,每个神经元窗中的神经元值作为S-PIP的一个输入。每个S-PIP的计算结果输出到输出神经元存储NBout,输出神经元存储NBout缓存到DRAM中。输出神经元存储NBout的输出经过激活函数单元即图中的f得到激活值,将激活值反馈到S-PIP中,通过累加,得到一个完整的卷积核和对应的输入神经元之间的卷积结果。
[0036] 在S-PIP阵列中,沿同一行的S-PIP共享一个共同的32bit突触总线,即16*2bit,沿同一列的S-PIP共享一个共同的32bit神经元总线。
[0037] 参见图2,每个S-PIP(Serial-Parallel Inner Product)包括16个BIP(Basic Inner Product),一个32bit宽的SR(突触寄存器),16个NEG模块,一个16输入的加法树和2个累加移位模块PSum1与PSum2,同时还包括了max模块。S-PIP的输入来自于突触存储SBin中的Filter(卷积核)和突触存储NBin中的Window Lane(神经元窗),每个Filter包含16个突触,每个Window Lane包含16个神经元;S-PIP的计算结果输出到输出神经元存储NBout。
[0038] 参见图3,BIP由与门,半加器和全加器组成,主要用于完成2bit无符号数的乘法计算。突触寄存器SR用于缓存来自Filter中的16个被分解为不同数量组合的2bit的突触数据。每个BIP的结果通过NEG模块处理后发送到16输入的加法树。NEG模块根据每一对突触和对应的神经元的乘积结果所对应的符号位,进行带符号的2的补码计算,并将计算结果输入到加法树,加法树对补码计算结果进行加计算,并将计算结果输送到累加移位模块PSum1;累加移位模块PSum1将加法树输出的计算结果进行累加移位,具体过程为:对16个突触中的某2bit数据和16个神经元的乘积结果累加移位;并将累加移位的结果输出到2选1多路选择器,当进行卷积层计算时,2选1多路选择器将累加移位模块PSum1结果输出到累加移位模块PSum2;当进行全连接层计算时,2选1多路选择器将上一S-PIP列中的部分和输出到累加移位模块PSum2。
[0039] 累加移位模块PSum2对接收到的结果进行累加移位,当进行卷积层计算时,累加移位模块PSum2对PSum1的输出数据进行累加移位,当进行全连接层计算时,累加移位模块PSum2对上一S-PIP列中的部分和进行累加。累加移位模块PSum1和Psum2中使用2bit移位。为兼容最坏情况,S-PIP的突触和神经元位宽均采用16bit,因此突触和神经元buffer的深度被设置为8。为了支持超过16个输入值的卷积窗口,从NBout读回数据以初始化Psum2中的累加器并和PSum2的输出结果累加得到一个完整的卷积窗的卷积计算结果,Nb作为累加移位模块PSum2的另一个输入(一个输入为累加移位模块PSum1的输出结果),用于判断突触-神经元对的计算数目是否超过窗口大小。如果超过,则将来自输出神经元存储NBout的部分和与当前的累加移位模块PSum2的计算结果进行累加,并将累加结果输出到输出神经元存储NBout。
[0040] 当NEG模块的输入MSB(最高有效位)为1时,即NEG模块的输入为负数时,加法树必须从部分和中减去对应于MSB的突触和神经元的BIP结果。
[0041] S-PIP中不同突触和神经元位宽的数据被分解为不同数量的2bit的数据组合,被分解的2bit数据通过BIP计算得到的结果最终被融合得到高位宽数据进行乘加计算的正确结果。这种数据分解方式扩展了计算的灵活性,避免了所有数据均采用统一位宽进行计算的情况。
[0042] S-PIP阵列同步工作处理突触和神经元花费时间的具体计算过程为:突触位宽度表示为Es,神经元位宽度表示为En,两者均用偶数表示。在En/2周期后,Psum1的结果被级联到Psum2中以进行累加和移位。在(Es×En)/4个周期之后,得到由16个突触和16个神经元乘加结果。
[0043] 本发明的支持动态精度的DNN加速器的实现方法如下:
[0044] DNN加速器每个周期完成总计256*16*16bit的计算。
[0045] DNN加速器结构在卷积层上的计算过程为:在进行卷积计算时,DNN加速器中的所有S-PIP计算同步执行;首先将分解的2比特突触从缓存中送入不同S-PIP阵列中的列中的SR,其次将分解为2比特的神经元送入到S-PIP阵列中的行中的BIP(基本内积)中,并和来自SR的突触进行乘积计算,然后将乘积结果移位累加,最终经过激活值函数单元输送到输出神经元存储NBout。
[0046] 在DNN加速器的结构中,突触的峰值计算带宽为128×16位,神经元的峰值计算带位宽为128位。在一个卷积层的计算中,同一卷积核中的一个突触在多个神经元窗口之间共享,并且同一神经元窗口中的一个神经元在不同卷积核中的突触之间共享。DNN加速器使用8个神经元窗口,每个窗口包含16个神经元,同时使用了128组突触,每个突触包含16个突触数据,完成这些数据的计算共花费(Es×En)/4×4个周期。
[0047] DNN加速器结构用在全连接层上的计算过程为:在全连接层计算中,神经元位宽设置为16位,突触位宽可变,不影响分类精度。
[0048] DNN加速器在池化层上计算过程为:S-PIP中引入了max模块,max模块用于确定最大值池化值。一个完整的卷积窗口的卷积计算结果通过Psum2输出作为max模块的一个输入,输出神经元存储NBout反馈回来的i_nbout作为max模块的另外一个输入。每完成一次完整卷积窗口的计算时进行一次池化窗口计数,然后max模块对两个输入值进行比较,其中的较大值暂时作为最大值,当计数达到池化窗口大小时,将最大值输出到输出神经元存储NBout。
[0049] 全连接层的计算过程主要包括以下几个步骤:
[0050] 1)从DRAM中缓存突触和神经元数据到突触存储SBin和输出神经元存储NBout,在第一周期中,首先将第一个128组分解的突触中的(s,s-1)bit(s为突触的位宽,每组包含16个突触)存储在第一S-PIP列的SR中。之后将第一个神经元窗口的(n,n-1)bit(n为神经元的位宽,每个窗口16个神经元)送到第一S-PIP列的BIP中进行计算。
[0051] 2)第二个周期,首先将第二个128组分解的突触的(s,s-1)bit送入第二S-PIP列的SR中,其次将第二个神经元窗的(n,n-1)bit送入到第二S-PIP列中的BIP中进行计算,同时,将第一个神经元窗的(n-2,n-3)bit送入到第一S-PIP列的BIP中,保存在第一S-PIP列中的SR中的突触(s,s-1)bit在本周期保持不变。
[0052] 3)之后的S-PIP列中的计算按照步骤1)和步骤2)中的方式依次类推;8个周期后,在第一S-PIP列中,第一个128组突触的(s,s-1)bit数据和第一个神经元窗口的神经元(16bit)完成乘积计算,在剩余7个S-PIP列中,不同的128突触的(s,s-1)bit数据和神经元仍然按照步骤1)和步骤2)中方式进行计算,其中,第8个128组突触的(s,s-1)bit和第8个神经元窗的(n,n-1)bit开始计算。
[0053] 4)第9个周期,首先将第一个周期送入的第一个128组突触的(s-2,s-3)bit送入第一S-PIP列中,其次将第一个神经元窗的(n,n-1)bit重新送入第一S-PIP列中的BIP中。重复步骤1)到步骤3)的过程即第一个128组突触的(s-2,s-3)bit和第一个神经元窗口的16bit神经元做乘积计算,其余的S-PIP列仍然采用上述步骤1)到步骤2)进行计算,其中,第8个128组突触的(s-2,s-3)ibt和第8个神经元窗开始计算。直到(Es/2)*8个周期后将第一个神经元窗的16个神经元和第一个128组突触计算结束,即第一S-PIP列的计算结束,剩余的S-PIP列中继续计算直到计算完所有数据。
[0054] 5)在步骤4)中计算得到的结果送入第二S-PIP列中进行累加,依次类推,经过(Es/2)*8+8个周期后,最终的8个神经元窗和128组突触的乘加结果沿S-PIP阵列的每一行输出。
[0055] 步骤5)中的计算方式相当于将全连接层的计算结果分解在一行中不同S-PIP单元中,因此,不同组突触需要以交错的方式送入SBin,即将分解的相同位(如高2bit)的数据存储在一起,在计算时加载至某一S-PIP列中的SR中,同时其他S-PIP仍然列进行不同神经元窗中的神经元和对应的128组突触的乘加计算。和卷积计算方式相比,这里仅需要修改控制方式。
[0056] 在S-PIP阵列中,每行的S-PIP级联在一起,并且一个S-PIP的输出通过多路复用器作为下一个S-PIP的输入。该级联将上一列的结果级联到本列和本列的输出结果做累加,主要用于全连接层,同时用于反馈卷积的部分和结果以进行累加得到完整的卷积结果。以提高S-PIP阵列中计算单元的利用率。
[0057] 为了便于理解支持动态精度的DNN加速器在卷积层和全连接层上的计算方式,下面通过一个简单的实施例进行说明。
[0058] 图3是S-PIP的组成单元BIP(Basic Inner Product),2个2bit无符号的操作数x1x0和y1y0作为输入。有符号数的处理过程中,符号位被取出单独进行计算,符号位被送入S-PIP中的NEG模块中进行判断。原来的符号位被0代替,这样得到完全的无符号数以便于在BIP中进行计算。
[0059] 图4是S-PIP处理2个4bit操作数a3a2a1a0,b3b2b1b0和2个4bit操作数c3c2c1c0,d3d2d1d0的乘加运算的结构,这个结构作为一个简单例子对DNN加速器中的基本单元S-PIP的工作方式进行了说明。4bit的操作数被分解为两个2位操作数作为BIP的输入。每个操作数中的符号位被分开用XOR计算,并且计算得到的MSB的结果将在shift-add单元的NEG模块中判断以支持2的补码。
[0060] 图5是P-SIP在4个时钟周期内处理2个4bit操作数a3a2a1a0,b3b2b1b0和2个操作数c3c2c1c0,d3d2d1d0的过程,4个周期的过程如下,
[0061] 1)周期0,操作数0a2,0b2首先被送入寄存器AR和BR中,其次BIP0和BIP1分别将0a2,0b2与0c2,0d2相乘;最终2个BIP的被结果馈入移位添加单元进行累加。
[0062] 2)在周期1,操作数0a2和0b2分别保持在寄存器中不变,同时操作数c1c0,d1d0在buffer中分别移位到操作数0c2和0d2,操作数0c2和0d2在buffer中被移位到操作数c1c0,d1d0。之后BIP0和BIP1分别将c1c0,d1d0与0a2,0b2相乘,最终2个BIP的计算结果在移位加单元中累加。
[0063] 3)在周期2,首先操作数a1a0,b1b0被送入寄存器AR,BR中覆盖之前的数据,其次操作数0c2和0d2在buffer中被移位到操作数c1c0,d1d0。BIP0和BIP1分别将a1a0,b1b0与0c2,0d2相乘,最终2个BIP的乘积结果被累加。
[0064] 4)在周期3,操作数a1a0和b1b0保持不变,同时操作数c1c0,d1d0在buffer中分别移位到0c2和0d2,之后BIP0和BIP1分别将a1a0,b1b0与c1c0,d1d0相乘,最终2个BIP的乘积结果被累加。
[0065] 经过上述4个周期,得到的结果即为2个操作数a3a2a1a0,b3b2b1b0和2个操作数c3c2c1c0,d3d2d1d0分别对应做乘加的结果。
[0066] BIP要得到正确的结果,需要按照数据位宽分解为不同数量的2bit值,因此,奇数位宽的突触/神经元需要被扩展为偶数位宽的突触/神经元,即在位宽为奇数的突触/神经元符号位后增加一个0值。位宽分别表示为Es和En的突触和神经元(Es和En分别是偶数)。
[0067] 本发明具有以下优点:
[0068] (1)加速比:在相同的输入数据量和相同的计算吞吐量同时准确性保持为100%的情形下,平均而言,本发明相对于DaDianNao,Stripes和Loom的加速比计算公式分别为256/((Es*En/4)*4),(16*Pn)/((Es*En/4)*4),(Ps*Pn*2)/((Es*En/4)*4),其中Ps,Pn表示突触和神经元的实际位宽。根据计算公式,本发明在主要网络模型的卷积层上相对于DaDianNao,Stripes和Loom分别获得了2.42×,1.24×,1.78×的性能提升。本发明在全连接层上相对于Stripes和Loom的加速比计算公式分别为64/((Es*16/4)+8),(2*((Es*16/4)+8))/(Ps*16+16),根据计算公式,本发明在主要网络模型上的全连接层上相对于Stripes和Loom分别获得了1.42×和1.7×的加速。
[0069] (2)带宽及存储:和Stripes,Loom相比,DNN加速器的神经元存储带宽降低了一半,突触的存储带宽保持不变,计算带宽是loom的2倍,突触的存储规模和loom相同”但是计算带宽保持不变;提高了片上的突触存储规模,减少了片外的突触读取;在匹配DaDianNao的计算峰值带宽的情况下,本发明的DNN加速器的突触存储相对于Loom减少了1/2。
[0070] 通常可变精度加速器由全串行,全并行和串行并行计算单元实现。但是,太多的并行单元可能会导致计算无效位。而过多的串行单元可能会失去并行性带来的加速优势。因此,本发明提出了一种灵活的支持动态精度的DNN加速器,它利用低位串行—并行组合计算单元实现DNN加速器的高效率和弹性。将不同的粒度精度(从32位到3位神经元/突触宽度)分解为2位用于串行计算,而2位精度是并行计算的。DNN加速器在低位并行性上保持其并行化加速优势,并在高位串行保持其计算灵活性。图像分类数据集上的实验结果表明,DNN加速器相比于DaDianNao,Stripes在准确性没有损失的情况下在卷积层上性能提升2.43X,1.24X,相比于DaDianNao,在全连接层上性能提升1.42X。