掌桥专利:专业的专利平台
掌桥专利
首页

一种支持存内CNN的中间缓存调度电路装置

文献发布时间:2023-06-19 18:37:28


一种支持存内CNN的中间缓存调度电路装置

技术领域

本发明涉及复用CNN调度运算技术领域,尤其涉及一种支持存内CNN的中间缓存调度电路装置。

背景技术

大数据时代下,现有的计算结构在面对数据密集型的应用时,会因为大量的数据搬运和带宽的限制带来能耗和延迟上的提高,使得数据上的向量并行受制于存储器读写带宽。为了解决访存和数据搬运造成的能耗和延迟,存内计算突破了传统冯诺依曼瓶颈,实现了存储单元与逻辑单元的融合,是实现智能计算的主要技术路线之一。学界提出了基于SRAM的算术逻辑运算电路,在存储器中实现算术逻辑运算。现有基于SRAM的算术逻辑运算电路因为计算模式比较单一,在面对外界输入和存储单元之间运算的场景时,电路的性能会受到限制,当前的存内计算技术主要面临着硬件资源复用等问题。

卷积神经网络是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量,也可以减少网络的参数个数,缓解模型的过拟合问题。卷积核是卷积层的重要组成部分。特征提取器是卷积核的本质,其主要作用是自动提取输入信号的深层信息。卷积层由多个特征面组成,每个特征面由多个神经元组成,它的每一个神经元通过卷积核与上一层特征面的局部区域相连。上一层的特征图被一个可学习的卷积核进行卷积,然后通过一个激活函数,就可以得到输出特征图。每个神经元局部连接上一层的神经元,并且共享权值,然后输出数据里的每个神经元通过共享权重去卷积图像后再加上共享偏置得到的,如果没有用共享权值,那么一个神经元需要对应一个卷积核一个偏置,而现在是每个神经元对应的是同一个卷积核同一个偏置,使得参数量大幅下降,适合于存内的数据复用。RS(Row Stationary)行复用的数据流,目的是对所有类型数据(权重,像素,部分和)在寄存器文件级别最大化复用和累积的整体能量效率。这与权重固定或输出固定的数据流不同,后者仅针对权重和部分和分别进行优化。

本设计在大规模存内并行运算的基础上实现向量阵列处理器形式的架构,并对控制逻辑与存取逻辑进行优化,实现支持存内向量处理单元形式的CNN调度运算单元。

发明内容

鉴于上述的分析,本发明实施例旨在提供一种支持存内CNN的部分复用中间缓存调度电路,用以解决现有访存和数据搬运造成的能耗和延迟的问题。

一方面,本发明实施例提供了一种支持存内CNN的中间缓存调度电路装置,包括控制逻辑单元和缓存调度电路单元;所述缓存调度单元包括运算逻辑单元、第一加法器、控制器和中间FIFO缓存单元;

所述控制逻辑单元,用于根据时钟信号和外部输入的有效标志信号输出选择信号和使能信号;

所述运算逻辑单元,用于对输入数组的元素和卷积核的权重进行卷积运算,输出对应的卷积结果至选择器;

所述第一加法器,用于基于使能信号,对所述卷积结果和所述中间FIFO缓存单元输出的数据进行加和,输出加和结果至选择器或基于使能取反信号输出加和结果至所述缓存调度电路单元的输出端;

所述选择器,用于基于所述选择信号,选择输出所述卷积结果或所述加和结果;

所述中间FIFO缓存单元,用于根据所述使能信号选择是否将选择器输出的数据写入所述中间FIFO缓存单元以及选择是否输出所存储的数据。

进一步的,所述运算逻辑单元包括cin个乘法器和一个第二加法器;

第i个所述乘法器用于进行Ai与Wi的乘法运算;其中,Ai为元素中的第i个值,Wi为权重中的第i个值;

所述第二加法器,用于得到cin个所述乘法器输出结果的加和,将所述加和结果作为对应的卷积结果输出。

进一步的,根据缓存运算逻辑确定输入运算逻辑单元的元素和卷积核的权重;所述有效标志信号用于控制运算逻辑单元是否写入元素、卷积核的权重;所述有效标志信号为0时,不写入,为1时写入。

进一步的,所述缓存运算逻辑包括按行依次调取输入数组中的每一列元素,并根据该元素与卷积核的移动关系,得到该元素对应的若干卷积结果;其中,卷积核的每一个元素为权重。

进一步的,当所述缓存调度电路进行n*n卷积核大小的运算,所述中间FIFO缓存单元的存储大小为n。

进一步的,所述使能信号包括FIFO读使能信号和FIFO写使能信号;

FIFO读使能信号用于控制中间FIFO缓存单元读出数据;

FIFO写使能信号用于控制中间FIFO缓存单元写入数据或输出至中间缓存调度电路单元的输出端。

进一步的,设置选择信号为sel,FIFO读使能信号为rd_en,FIFO写使能信号为wr_en;当用于进行3*3大小卷积核的运算,有效标志信号为1时,控制逻辑单元输出的选择信号和使能信号包括三个阶段:

起始阶段:第一周期:sel=0,rd_en=0,wr_en=1;

第二周期:sel=1,rd_en=1,wr_en=1;

第三周期:sel=0,rd_en=0,wr_en=1;

循环阶段:第四周期:sel=0,rd_en=1,wr_en=0;

第五周期:sel=1,rd_en=1,wr_en=1;

第六周期:sel=0,rd_en=0,wr_en=1;

结束阶段:最后一个周期:sel=0,rd_en=1,wr_en=0;

进一步的,所述数据选择信号sel为0时,控制选择器选择卷积结果到中间FIFO缓存单元,所述数据选择信号sel为1时,控制选择器选择卷积结果和中间FIFO缓存单元中最前面的数据之和到中间FIFO缓存单元;

所述FIFO读使能信号rd_en为1时,中间FIFO缓存单元进行一次读操作,将中间FIFO缓存单元最前面的数据输出至第一加法器,使卷积结果和该读取数据经加法器输入至选择器,FIFO读使能信号rd_en为0时,中间FIFO缓存单元不读取;

所述FIFO写使能信号wr_en为1时,中间FIFO缓存单元进行一次写操作,将输入的数据写入到中间FIFO缓存单元最后,FIFO写使能信号wr_en为0时,中间FIFO缓存单元不写入,此时写使能取反~wr_en=1有效,标志第一加法器输出结果至缓存调度电路单元的输出端有效。

进一步的,中间缓存调度电路单元的数量为1个,所述中间缓存调度电路单元分时接收各个运算周期的元素和权重,并由所述输出端依次输出各个运算周期的计算结果datah;其中,h为计算周期的序数;在每个运算周期里包括三组相邻元素对应卷积的卷积结果和。

进一步的,所述中间缓存调度电路单元的数量为3个;3个所述中间缓存调度电路单元的输入端分别输入卷积核的三行权重以及均输入第一行的元素,3个所述中间缓存调度电路单元并行完成,并由对应的输出端依次输出对应的各个运算周期的计算结果datah1、datah2、datah3;其中,1-3为中间缓存调度电路单元的序数。

与现有技术相比,本发明至少可实现如下有益效果之一:

1、本申请基于存内向量处理单元的形式,部分卷积运算过程在memory中进行,减少了存储单元与外部计算之间的总线,节省了memory和处理器之间的总线带宽,且带宽并不会对内部的并行计算带来限制,在中间缓存调度电路装置中可以充分利用卷积向量的可配置性,通过在多个周期实现对任意长度参数的卷积支持。

2、简化了中间缓存的调度逻辑,通过先入先出的FIFO策略与简单的循环逻辑控制,减少了采用SRAM或者寄存器堆当作中间缓存的控制复杂度。

本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为本申请中间缓存电路架构图;

图2为卷积加速模块实现模型图;

图3为本申请存内CNN的中间缓存调度整体架构图;

图4为缓存运算逻辑计算图;

图5为现有的SIMD方式计算图;

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。

本发明的一个具体实施例,公开了一种支持存内CNN的中间缓存调度电路装置,如图1所示,包括控制逻辑单元和缓存调度电路单元;所述缓存调度单元包括运算逻辑单元、第一加法器、控制器和中间FIFO缓存单元;

所述控制逻辑单元,用于根据时钟信号和外部输入的有效标志信号输出选择信号和使能信号;

所述运算逻辑单元,用于对输入数组的元素和卷积核的权重进行卷积运算,输出对应的卷积结果至选择器;

所述第一加法器,用于基于使能信号,对所述卷积结果和所述中间FIFO缓存单元输出的数据进行加和,输出加和结果至选择器或基于使能取反信号输出加和结果至所述缓存调度电路单元的输出端;

所述选择器,用于基于所述选择信号,选择输出所述卷积结果或所述加和结果;

所述中间FIFO缓存单元,用于根据所述使能信号选择是否将选择器输出的数据写入所述中间FIFO缓存单元以及选择是否输出所存储的数据。

具体的,所述中间FIFO缓存单元是先入先出队列,简化了调度的策略。

具体的,如图3所示,包含本申请控制逻辑单元和中间缓存调度电路单元的memory存内单元还包括memory存储单元;输入数组和卷积核在进入memory存内中后先在中间缓存调度电路单元中进行计算,运算逻辑分为起始阶段、循环阶段和结束阶段;中间缓存调度电路单元输出的data值输入到memory存储单元,由memory存储单元进行存储并取卷积核行大小的相应列进行相加再存储;即从运算逻辑单元到中间FIFO缓存单元,在从中间FIFO缓存单元进入memory存储单元,不用出整个memory存内单元,减小了memory存内单元和处理器之间总线带宽。

进一步的,所述运算逻辑单元包括cin个乘法器和一个第二加法器;

第i个所述乘法器用于进行Ai与Wi的乘法运算;其中,Ai为元素中的第i个值,Wi为权重中的第i个值;i∈[1,cin];

所述第二加法器,用于得到cin个所述乘法器输出结果的加和,将所述加和结果作为对应的卷积结果输出。

进一步的,如图4所示,根据缓存运算逻辑确定输入运算逻辑单元的元素和卷积核的权重;所述有效标志信号用于控制运算逻辑单元是否写入元素、卷积核的权重;所述有效标志信号为0时,不写入,为1时写入。

具体的,缓存运算逻辑是为了减少输入数组中元素A的搬移,选择使用一个中间FIFO缓存单元,单边变化卷积核权重W,进而得到输入数组的一行元素与卷积核的一行权重的卷积结果。

具体的,以缓存运算逻辑输入元素和权重的规律为:

第一周期输入值:第一行第一列元素和第一行第一列权重;

第二周期输入值:第一行第二列元素和第一行第二列权重;

第三周期输入值:第一行第二列元素和第一行第一列权重;

第四周期输入值:第一行第三列元素和第一行第三列权重;

第五周期输入值:第一行第三列元素和第一行第二列权重;

第六周期输入值:第一行第三列元素和第一行第一列权重;

。。。

倒数第三周期输入值:第一行倒数第二列元素和第一行第三列权重;

倒数第二周期输入值:第一行倒数第二列元素和第一行第二列权重;

倒数第一周期输入值:第一行倒数第一列元素和第一行第三列权重;

从第七周期开始,每隔3个周期元素输入值向右移动一个,权重以第四周期到第六周期的输入方式为一个循环。

进一步的,所述缓存运算逻辑包括按行依次调取输入数组中的每一列元素,并根据该元素与卷积核的移动关系,得到该元素对应的若干卷积结果;其中,卷积核的每一个元素为权重。

具体的,所述一个逻辑运算单元的输入和卷积结果输出表示为:

其中,A为一个元素,W为一个权重。

进一步的,当所述缓存调度电路进行n*n卷积核大小的运算,所述中间FIFO缓存单元的存储大小为n。

进一步的,所述使能信号包括FIFO读使能信号和FIFO写使能信号;

FIFO读使能信号用于控制中间FIFO缓存单元读出数据;

FIFO写使能信号用于控制中间FIFO缓存单元写入数据或输出至中间缓存调度电路单元的输出端。

进一步的,设置选择信号为sel,FIFO读使能信号为rd_en,FIFO写使能信号为wr_en;当用于进行3*3大小卷积核的运算,有效标志信号为1时,控制逻辑单元输出的选择信号和使能信号包括三个阶段:

起始阶段:第一周期:sel=0,rd_en=0,wr_en=1;

第二周期:sel=1,rd_en=1,wr_en=1;

第三周期:sel=0,rd_en=0,wr_en=1;

循环阶段:第四周期:sel=0,rd_en=1,wr_en=0;

第五周期:sel=1,rd_en=1,wr_en=1;

第六周期:sel=0,rd_en=0,wr_en=1;

结束阶段:最后一个周期:sel=0,rd_en=1,wr_en=0;

循环阶段的控制信号以第四周期到第六周期为一个循环。

进一步的,所述数据选择信号sel为0时,控制选择器选择卷积结果到中间FIFO缓存单元,所述数据选择信号sel为1时,控制选择器选择卷积结果和中间FIFO缓存单元中最前面的数据之和到中间FIFO缓存单元;

所述FIFO读使能信号rd_en为1时,中间FIFO缓存单元进行一次读操作,将中间FIFO缓存单元最前面的数据输出至第一加法器,使卷积结果和该读取数据经加法器输入至选择器,FIFO读使能信号rd_en为0时,中间FIFO缓存单元不读取;

所述FIFO写使能信号wr_en为1时,中间FIFO缓存单元进行一次写操作,将输入的数据写入到中间FIFO缓存单元最后,FIFO写使能信号wr_en为0时,中间FIFO缓存单元不写入,此时写使能取反~wr_en=1有效,标志第一加法器输出结果至缓存调度电路单元的输出端有效。

具体的,控制逻辑单元输出的选择信号和使能信号控制选择器和中间FIFO缓存单元的具体情况为:

起始阶段:第一周期:sel=0,rd_en=0,wr_en=1,~wr_en=0;此时,所述运算逻辑单元输出卷积结果①,经选择器选择,并写入中间FIFO缓存单元;

第二周期:sel=1,rd_en=1,wr_en=1,~wr_en=0;此时,所述运算逻辑单元输出卷积结果②输入所述第一加法器,所述中间FIFO缓存单元读出存储的数据①和卷积结果②经所述第一加法器加和输出①+②至所述选择器,所述选择器选择加和结果①+②,所述中间FIFO缓存单元写入加和结果①+②;

第三周期:sel=0,rd_en=0,wr_en=1,~wr_en=0;此时,所述运算逻辑单元输出的卷积结果③经选择器选择,并写入中间FIFO缓存单元;

循环阶段:第四周期:sel=0,rd_en=1,wr_en=0,~wr_en=1;此时,所述运算逻辑单元输出的卷积结果④输入第一加法器,所述中间FIFO缓存单元读出存储的数据①+②和卷积结果④经所述第一加法器加和输出①+②+④至所述缓存调度电路单元的输出端;

第五周期:sel=1,rd_en=1,wr_en=1,~wr_en=0;此时,所述运算逻辑单元输出的卷积结果⑤输入所述第一加法器,所述中间FIFO缓存单元读出存储的数据③和卷积结果⑤经所述第一加法器加和输出③+⑤至所述选择器,所述选择器选择加和结果③+⑤,所述中间FIFO缓存单元写入加和结果③+⑤;

第六周期:sel=0,rd_en=0,wr_en=1,~wr_en=0;此时,所述运算逻辑单元输出的卷积结果⑥经选择器选择,并写入中间FIFO缓存单元;

结束阶段:最后一个周期:sel=0,rd_en=1,wr_en=0,~wr_en=1;此时,所述运算逻辑单元输出的卷积结果

循环阶段的控制信号以第四周期到第六周期为一个循环。

在一个可能的实施方式中,中间缓存调度电路单元的数量为1个,所述中间缓存调度电路单元分时接收各个运算周期的元素和权重,并由所述输出端依次输出各个运算周期的计算结果datah;其中,h为计算周期的序数;在每个运算周期里包括三组相邻元素对应卷积的卷积结果和。

具体的,如图1所示,中间缓存调度单路单元数量为1个时,支持存内CNN的中间缓存调度电路装置为部分复用策略;所述一个运算周期的计算结果data表示输入数组和卷积核每个步长下完整卷积结果的1/3,将该完整卷积结果输入至memory存储单元,在memory存储单元中存储;

当输入数组中的一行元素依次调取结束后,开始输入输入数组第二行的元素和卷积核对应行的权重,并将结果依次输入memory存储单元;当三行元素均卷积结束,在memory存储单元中将对应列的数据进行加和得到输入数组与卷积核在行方向上的第一行卷积结果;

卷积核在列方向按步长为1下移一格,根据上述方式得到输入数组与卷积核在行方向上的第二行卷积结果;以此类推。

具体的,在采用部分复用策略时,可以复用的数据包括:

input_map*cin*kernel_row+cin*kernel_size*cout*input_map;

当采用3*3大小的卷积核时,可以简化成:

input_map*cin*3+cin*9*cout*input_map;

其中,input_map为输入数组的大小,cin为输入元素和权重的通道数,kernel_row为卷积核行,kernel_size为卷积核的大小;cout为输入数组与卷积核的输出通道数;

在存储阶段可以复用的数据包括:

1*1*cout*output_map*kernel_row;

当采用3*3大小的卷积核时,可以简化成:

cout*output_map*3;

其中,output_map为输入数组和卷积核卷积后得到的新的数组的大小。

在另一种可能的实施方式中,所述中间缓存调度电路单元的数量为3个;3个所述中间缓存调度电路单元的输入端分别输入卷积核的三行权重和以及均输入第一行的元素,3个所述中间缓存调度电路单元并行完成,并由对应的输出端依次输出对应的各个运算周期的计算结果datah1、datah2、datah3;其中,1-3为中间缓存调度电路单元的序数。

具体的,中间缓存调度单路单元数量为3个时,支持存内CNN的中间缓存调度电路装置为完全复用策略;对第一行元素做卷积时,仅用到一个中间缓存调度电路单元,其输入端输入第一行元素和第一行权重;对第二行元素做卷积时,用到两个中间缓存调度电路单元,第1个中间缓存调度电路单元的输入端输入第二行元素和第一行权重,第2个中间缓存调度电路单元的输入端输入第二行元素和第二行权重;对第三行元素做卷积时,用到三个中间缓存调度电路单元,第1个中间缓存调度电路单元的输入端输入第三行元素和第一行权重,第2个中间缓存调度电路单元的输入端输入第三行元素和第二行权重,第3个中间缓存调度电路单元的输入端输入第三行元素和第三行权重;从第三行元素开始,每一行元素同时被三个中间缓存调度电路单元分别和三行权重卷积;对倒数第二行元素做卷积时,用到2个中间缓存调度电路单元,第1个中间缓存调度电路单元的输入端输入倒数第二行元素和第三行权重,第2个中间缓存调度电路单元的输入端输入第二行元素和第二行权重;对倒数第一行元素做卷积时,仅用到一个中间缓存调度电路单元,其输入端输入倒数第一行元素和第三行权重;

进行每一行元素的卷积时,所用到的中间缓存电路单元同时进行输出对应的各个运算周期的计算结果至memory存储单元,即同时计算输入数组的一行元素与卷积核每行权重的卷积,以后不在需要重复读取输入数组的该行元素;在memory存储单元中将对应列的数据进行加和得到输入数组与卷积核的卷积结果。

具体的,在采用完全复用策略时,可以复用的数据包括:

input_map*cin+cin*kernel_size*cout*input_map*kernel_row;

当采用3*3大小的卷积核时,可以简化成:

input_map*cin+cin*9*cout*input_map*3;

在存储阶段可以复用的数据包括:

1*1*cout*output_map;

当采用3*3大小的卷积核时,可以简化成:

cout*output_map*3。

具体的,完全复用策略相对于部分复用策略更加完全的复用了输入数组,完全复用策略只需读取一次输入数组的行元素,减少了在计算完成后重复回来读取的取数功耗,并且并行计算能够减少在运算逻辑单元的计算时间;部分复用策略需要分多次读取输入数组的行元素,在计算完一行元素后重复回来读取行元素,相较于完全服用策略增大了读取数距的功耗;但是完全复用相对于部分复用策略也存在缺点:完全复用策略的中间FIFO缓存单元大小需要kernel_size*1*1*cout,在3*3的卷积核中约等于9*cout;而部分复用策略中间FIFO缓存单元大小仅需要kernel_row*1*1*cout,在3*3的卷积核中约等于3*cout;因此完全复用策略中中间FIFO缓存单元的容量面积比部分复用策略增加了三倍。在具体实现中可以根据应用电路的需要在面积与功耗中间进行权衡。

具体的,上述支持存内CNN的中间缓存调度电路装置中仅描述了一个卷积核与输入数组的卷积缓存装置,实际应用中不局限于一个卷积核,如图1和图2所示,多个卷积核可共享一个输入数组,当有cout个卷积核时,输入数组和cout个卷积核的输出通道为cout,即有cout个中间缓存调度电路装置。

具体的,输入数组的大小为input_col*incup_row*cin,卷积核大小为kernel_row*kernel_rcol*cin,cout个卷积核共享1个输入数组,得到新的数组为output_col*outcup_row*cout。

与现有技术相比,本实施例提供的调度方案通过增加中间缓存减少了数据多次访存所带来的功耗与延时,利用存内技术大规模提高访存的并行性,通过并行的方法增大数据计算效率。并且本方案简化了中间缓存的调度逻辑,通过先入先出的FIFO策略与简单的循环逻辑控制,减少了采用SRAM或者寄存器堆当作中间缓存的控制复杂度。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

技术分类

06120115636945