一种计算引擎和电子设备的制作方法

文档序号:11864637阅读:223来源:国知局
一种计算引擎和电子设备的制作方法与工艺

本申请涉及运算加速技术领域,特别涉及一种计算引擎和电子设备。



背景技术:

在人工智能领域中,一些类似于字符识别、图像分类、语音识别等技术需要具备复杂算法功能的网络技术来实现,例如深度神经网络(英文:Deep Neural Network,DNN)技术已经成为具有代表性的算法,广泛应用于搜索引擎、智能手机等产品中。

典型的DNN结构如图1所示,DNN结构中具有一个输入层,一个输出层,以及若干个隐藏层,图1中以具有两个隐藏层为例。其中,图1中每一个圆圈代表一个神经元,如输入层4个神经元分别用a1、a2、a3、a4表示。每一个神经元进行着相同的运算操作,即,对前一层传递而来的信号之和求激活函数,激活函数的输出作为该神经元的输出传递到下一层的神经元中。典型的激活函数如sigmoid函数,以图1中神经元z1为例,基于sigmoid函数的神经元的计算过程为:该式中,w是网络的权重参数,表示网络中神经元之间边的权重,b是一个偏移值项。整个网络中的每个神经元都是不断重复上述计算过程,把前一层的信号经过计算传递到下一层。

图1所示的DNN结构是以具有2个隐藏层为例的神经网络,实际应用中,往往会使用更大、更深的网络结构,需要进行大量的乘加运算。传统的采用CPU来对DNN结构中的神经元进行计算无法满足像语音识别等一些实时计算的需求,因此需要采用一些运算加速的方法。

一种现有的运算加速方案采用现场可编程门阵列(英文:Field-Programmable Gate Array,缩写:FPGA)实现,将一个固定的网络结构通过FPGA硬化实现。因为DNN结构每一层的计算,在激活函数之前等效于一个向量乘以一个矩阵的运算,因此,实际在实现DNN计算的过程中,每一层采用的是先向量与矩阵的乘法,再进行激活函数计算的运算流程。

例如,一个采用sigmoid激活函数的固定DNN网络大小是:256-512-512-512-10,即输入层、3个隐藏层、输出层的神经元的个数分别是256、512、512、512和10。则任何一个256维的数据样本作为输入层进入DNN计算后,需要在第一层(即输入层)做一次256向量乘以256*512矩阵的运算,输出一个512向量,然后对输出的512向量中的每一个元素计算sigmoid激活函数,输入到第二层,后面计算依次类推,直至输出层输出。

一种典型的用于计算向量矩阵相乘的硬件结构是乘法、加法阵列。如上面的网络的第一层,计算256向量乘以256*512矩阵,则采用如图2所示的64个乘法以及后续的加法的阵列,一次计算64向量*64向量,式中第一个64向量是256向量中的连续64个数,式中第二个64向量为矩阵第一列的连续64个数,乘法和加法运算分别采用乘法器和加法器执行。第一次运算过程为256向量中第一个64向量与256*512矩阵中第一列的第一个64向量相乘,第二次运算过程为为256向量中第二个64向量与256*512矩阵中第一列的第二个64向量相乘,按照上述方式将整个运算过程分批完成。

上述现有的这种硬件计算架构,对输入乘法器的两个乘数,在下一次计算都无法使用,因此每次都需要数据的导入和导出。综上,这种运算方式对带宽需求大,硬件计算架构的计算性能的瓶颈则受到了输入带宽的限制,无法发挥出其最大的计算性能。



技术实现要素:

本申请实施例提供一种计算引擎和电子设备,用以提高数据利用率,降低带宽需求,提升计算性能。

本申请实施例提供的具体技术方案如下:

一方面,提供一种计算引擎,该计算引擎包括缓存管理模块、匹配分发模块和至少L个计算模块,其中,所述缓存管理模块用于基于两个端口分别接收两个输入量,这两个输入量分别来自于M维输入向量和M×N参数矩阵,具体用于读取M维输入向量中的L个元素值并进行缓存,以及,在M×N参数矩阵中与所述L个元素值对应的子矩阵中依次读取L维行向量并传送至所述匹配分发模块,其中,所述M×N参数矩阵可包括若干个子矩阵,每一个子矩阵均为L阶方阵,M、N、L均为大于1的整数;所述匹配分发模块,用于每接收到所述缓存管理模块传送的一个L维行向量,从所述缓存管理模块中缓存的所述L个元素值中取出与接收到的L维行向量对应的一个元素值,将取出的一个元素值与所述L维行向量中的各个值分别进行匹配,将各个匹配结果分别发送到所述至少L个计算模块中的对应计算模块,其中任意一个匹配结果包含所述取出的一个元素值与一个所述L维行向量中的一个值组成的数据组合;任意一个所述计算模块,用于针对所述匹配分发模块发送的匹配结果进行计算。这样,每次缓存的L个元素值,可以与M×N参数矩阵中与所述L个元素值对应的子矩阵中的所有数据结合进行计算,之后的处理过程将不再使用这L个元素值。即从缓存中读取一次向量的数据,可以连续使用多轮处理过程,实现一次缓存多次计算,发挥数据局部性原理,使得数据利用率最大化,降低了带宽需求,提升了计算性能。

在一个可能的设计中,在执行在M×N参数矩阵中与所述L个元素值对应的子矩阵中依次读取L维行向量的操作时,所述缓存管理模块具体用于:根据所述L个元素值在所述M维输入向量中的列序号范围,在所述M×N参数矩阵中选择与所述列序号范围相同的行序号范围对应的子矩阵集合;在选出的子矩阵集合中按照列序号从小到大的顺序依次选择子矩阵,每选择一个子矩阵,在选出的子矩阵中按照行序号从小到大的顺序依次读取L维行向量。通过上述读取L个元素值对应的L维行向量的处理过程,将向量与矩阵的计算顺序做优化调整,可以将在M×N参数矩阵中与L个元素值对应的所有值都依次读取出来并进行计算,从而充分发挥L个元素值的作用,达到一次读取,多次运算的目的。

在一个可能的设计中,所述匹配分发模块从所述缓存管理模块中缓存的所述L个元素值中取出与接收到的L维行向量对应的一个元素值满足以下条件:取出的所述一个元素值的列序号与所述接收到的L维行向量在所述M×N参数矩阵中的行序号相同。通过这样的配对方式,能够将取出的一个元素值分别与对应的L维行向量中的值进行配对,以便于进一步发送到不同的计算模块中进行并行计算,同样可以达到取一个值参与多个计算的目的。

在一个可能的设计中,所述匹配分发模块还用于,在每一个所述匹配结果中携带所述L维行向量中对应值的列索引信号,所述列索引信号用于指示所述L维行向量中对应值在所述M×N参数矩阵中的列序号。这样,可以根据列索引信号采用取模方式寻找对应的计算模块,不用发送连续的列,可以支持稠密矩阵和稀疏矩阵的计算;基于列索引信号,控制数据分发,实现计算模块负载均衡与高资源利用率。

在一个可能的设计中,所述M×N参数矩阵采用分块二级行列交叉方式进行存储,所述分块二级行列交叉方式是指,将所述M×N参数矩阵分为若干个子矩阵,其中,全部或部分子矩阵为L阶方阵,所有子矩阵采用先行后列的顺序排列,且,在每一个子矩阵中,采用先行后列的顺序进行存储。通过上述存储方式,打破了传统的按照行或者列连续存储矩阵的方式,从而可以实现本申请中计算引擎所执行的方法。

在一个可能的设计中,任意一个所述计算模块用于:将接收到的匹配结果中包含的一个元素值与一个所述L维行向量中的一个值相乘,得到乘积结果;将携带相同的列索引信号的匹配结果对应的乘积结果进行累加,得到累加结果。这样,通过列索引信号将原始数据的格式与计算过程解耦,可以控制参数矩阵同一列数据与相应参数值乘积的连续累加,使得不是每次累加都需要进行局部存储器的存取,而是多次累加一次存取,大大减少了局部存储器的访问次数,降低了运行功耗。

在一个可能的设计中,所述计算模块包括乘法器、加法器、寄存器、比较器和局部存储器,其中:任意一个所述计算模块中的所述乘法器,用于将每次接收到的匹配结果中包含的一个元素值与一个所述L维行向量中的一个值相乘,得到乘积结果;任意一个所述计算模块中的所述比较器,用于在所述乘法器计算之前,比较每次接收到的匹配结果中的列索引信号与上一次接收到的匹配结果中的列索引信号是否相同,获得比较结果;任意一个所述计算模块中的所述加法器,用于在所述比较器获得比较结果为相同时,将所述乘法器获得的乘积结果与所述寄存器中存储的第一临时累加值进行累加计算,按照累加所得结果更新所述第一临时累加值;任意一个所述计算模块中的所述寄存器,用于存储所述加法器输出的所述第一临时累加值;任意一个所述计算模块中的所述局部存储器,用于存储每一个列索引信号对应的第二临时累加值;任意一个所述计算模块中的所述加法器,还用于在所述比较器获得比较结果为不同时,将所述第一临时累加值与所述局部存储器中存储的相应列索引信号对应的第二临时累加值进行累加,并按照所得结果更新所述第二临时累加值;且,所述寄存器还用于在比较器获得比较结果为不同时,将第一临时累加值清零。这样,计算模块通过参数列索引信号控制连续的局部累加,当前后两个列索引信号不同时,累加的临时结果才需要存入局部存储器对应位置中,使得多次连续计算后进行一次局部存储模块访问;因为计算模块以列索引信号来控制连续列数据的局部累加,不是每次累加后的零时结果都需要存入局部存储器中,而是多次累加后才需要一次局部存储器的存取,减少了局部存储器的访问次数,而局部存储器的访问在动态功耗中占很大比例,所以降低了硬件整体的运行功耗。

在一个可能的设计中,所述匹配分发模块用于,将匹配结果中包含的所述L维行向量中的值在所述M×N参数矩阵中的列序号对L进行取模运算,按照取模运算的值确定所述至少L个计算模块对应的计算模块。这样,计算模块的计算也可以支持稀疏数据情况,可以减少实际需要的乘加计算次数,所以降低了计算功耗。

在一个可能的设计中,当所述计算引擎应用于包含若干个层次的运算结构时,所述计算引擎还包括输出控制模块和激活函数计算模块,其中,每一个层次采取的运算方式相同;所述输出控制模块用于根据接收到的每一个所述计算模块获得的所述累加结果,生成新的M维向量;并在判定本次运算为所述运算结构中的最后一层运算时,将所述新的M维向量输出;或者,在判定本次运算非所述运算结构中的最后一层运算时,将所述新的M维向量输入到所述激活函数计算模块;所述激活函数计算模块,用于将所述输出控制模块输入的所述新的M维向量按照预设计算方式进行计算,获得计算结果,将所述计算结果输入至所述缓存管理模块;所述缓存管理模块,还用于将所述计算结果作为新的输入向量。对于多层运算架构,能够逐层计算,每一层的输出结果保存至下一层的输入缓存中,可处理灵活可变的神经网络拓扑结构,充分利用数据局部性原理,提高数据利用率,显著降低了带宽需求的限制。

在一个可能的设计中,所述运算结构为深度神经网络DNN结构。

在一个可能的设计中,所述预设计算方式为激活函数的运算,则:所述激活函数计算模块还用于,将所述激活函数的输入值取值范围均分成若干段,计算所述若干段中的每一段取值范围对应的输出值与输入值的线性函数,并存储每一段的序号与线性函数的线性因子的对应关系,所述线性函数根据所述线性因子唯一确定;在将所述输出控制模块输入的所述新的M维向量按照预设计算方式进行计算,获得计算结果时,所述激活函数计算模块用于,查询所述新的M维向量中的元素值在所述激活函数的输入值取值范围的段的序号,根据查询出的序号以及所述对应关系,确定对应的线性函数的线性因子,根据确定出的线性因子计算所述新的M维向量中的元素值的输出值;并根据所述新的M维向量中的每一个元素值计算所得的输出值生成所述计算结果。这样,采用线性逼近查表法,显著减少了表的空间占用,通过分段线性逼近,可以对各种激活函数进行近似计算,所以可以支持多种激活函数类型。

另一方面,提供一种计算方法,应用于计算引擎,该方法包括:计算引擎读取M维输入向量中的L个元素值并进行缓存,以及,在M×N参数矩阵中与所述L个元素值对应的子矩阵中依次读取L维行向量,其中,所述M×N参数矩阵可包括若干个子矩阵,每一个子矩阵均为L阶方阵,M、N、L均为大于1的整数;所述计算引擎将每一个L维行向量与对应的一个元素值进行匹配,生成匹配结果,其中任意一个匹配结果包含一个元素值与一个所述L维行向量中的一个值组成的数据组合;所述计算引擎针对各个匹配结果进行计算。这样,每次缓存的L个元素值,可以与M×N参数矩阵中与所述L个元素值对应的子矩阵中的所有数据结合进行计算,之后的处理过程将不再使用这L个元素值。即从缓存中读取一次向量的数据,可以连续使用多轮处理过程,实现一次缓存多次计算,发挥数据局部性原理,使得数据利用率最大化,降低了带宽需求。

在一个可能的设计中,所述在M×N参数矩阵中与所述L个元素值对应的子矩阵中依次读取L维行向量,可通过以下方式实现:根据所述L个元素值在所述M维输入向量中的列序号范围,在所述M×N参数矩阵中选择与所述列序号范围相同的行序号范围对应的子矩阵集合;在选出的子矩阵集合中按照列序号从小到大的顺序依次选择子矩阵,每选择一个子矩阵,在选出的子矩阵中按照行序号从小到大的顺序依次读取L维行向量。通过上述读取L个元素值对应的L维行向量的处理过程,将向量与矩阵的计算顺序做优化调整,可以将在M×N参数矩阵中与L个元素值对应的所有值都依次读取出来并进行计算,从而充分发挥L个元素值的作用,达到一次读取,多次运算的目的。

在一个可能的设计中,任一个L维行向量与一个元素值对应需满足以下条件:所述一个元素值的列序号与所述任一个L维行向量在所述M×N参数矩阵中的行序号相同。通过这样的配对方式,能够将取出的一个元素值分别与对应的L维行向量中的值进行配对,以便于进一步发送到不同的计算模块中进行并行计算,同样可以达到取一个值参与多个计算的目的。

在一个可能的设计中,该方法还包括:在每一个所述匹配结果中携带所述L维行向量中对应值的列索引信号,所述列索引信号用于指示所述L维行向量中对应值在所述M×N参数矩阵中的列序号。这样,可以根据列索引信号采用取模方式寻找对应的计算模块,不用发送连续的列,可以支持稠密矩阵和稀疏矩阵的计算;基于列索引信号,控制数据分发,实现计算模块负载均衡与高资源利用率。

在一个可能的设计中,所述计算引擎针对各个匹配结果进行计算,通过以下方式实现:所述计算引擎将接收到的匹配结果中包含的一个元素值与一个所述L维行向量中的一个值相乘,得到乘积结果;所述计算引擎将携带相同的列索引信号的匹配结果对应的乘积结果进行累加,得到累加结果。这样,通过列索引信号将原始数据的格式与计算过程解耦,可以控制参数矩阵同一列数据与相应参数值乘积的连续累加,使得不是每次累加都需要进行局部存储器的存取,而是多次累加一次存取,大大减少了局部存储器的访问次数,降低了运行功耗。

在一个可能的设计中,该方法还包括:所述计算引擎在任意一次计算乘积结果之前,比较每个匹配结果中的列索引信号与上一次匹配结果中的列索引信号是否相同,获得比较结果;在获得比较结果为相同时,将所述乘积结果与第一临时累加值进行累加,按照累加所得结果更新所述第一临时累加值;所述计算引擎在获得比较结果为不同时,将所述第一临时累加值与存储的相应列索引信号对应的第二临时累加值进行累加,并按照累加所得结果更新所述第二临时累加值;且,将第一临时累加值清零。这样,计算模块通过参数列索引信号控制连续的局部累加,当前后两个列索引信号不同时,累加的临时结果才需要存入局部存储器对应位置中,使得多次连续计算后进行一次局部存储模块访问;因为计算模块以列索引信号来控制连续列数据的局部累加,不是每次累加后的零时结果都需要存入局部存储器中,而是多次累加后才需要一次局部存储器的存取,减少了局部存储器的访问次数,而局部存储器的访问在动态功耗中占很大比例,所以降低了硬件整体的运行功耗。

在一个可能的设计中,所述计算引擎应用于包含若干个层次的运算结构,其中,每一个层次采取的运算方式相同,所述方法还包括:所述计算引擎根据接收到的每一个所述累加结果,生成新的M维向量;并,在判定本次运算为所述运算结构中的最后一层运算时,所述计算引擎将所述新的M维向量输出;或者,在判定本次运算非所述运算结构中的最后一层运算时,将所述新的M维向量按照预设计算方式进行计算,获得计算结果,将所述计算结果作为新的输入向量。对于多层运算架构,能够逐层计算,每一层的输出结果保存至下一层的输入缓存中,可处理灵活可变的神经网络拓扑结构,充分利用数据局部性原理,提高数据利用率,显著降低了带宽需求的限制。

在一个可能的设计中,所述运算结构为深度神经网络DNN结构。

在一个可能的设计中,所述预设计算方式为激活函数的运算,所述方法还包括:所述计算引擎将所述激活函数的输入值取值范围均分成若干段,计算所述若干段中的每一段取值范围对应的输出值与输入值的线性函数,并存储每一段的序号与线性函数的线性因子的对应关系,所述线性函数根据所述线性因子唯一确定;所述将所述新的M维向量按照预设计算方式进行计算,获得计算结果,包括:所述计算引擎查询所述新的M维向量中的元素值在所述激活函数的输入值取值范围的段的序号,根据查询出的序号以及所述对应关系,确定对应的线性函数的线性因子,根据确定出的线性因子计算所述新的M维向量中的元素值的输出值;并根据所述新的M维向量中的每一个元素值计算所得的输出值生成所述计算结果。这样,采用线性逼近查表法,显著减少了表的空间占用,通过分段线性逼近,可以对各种激活函数进行近似计算,所以可以支持多种激活函数类型。

再一方面,提供一种电子设备,包括处理器和如上述任一方面设计所述的计算引擎;其中:所述处理器,用于执行一组程序,向所述计算引擎发送用于计算的初始数据;所述计算引擎,用于根据所述处理器发送的初始数据,执行如上述任一方面设计所述的计算引擎的计算,得到计算结果,将所述计算结果返给所述处理器。上述电子设备可以处理灵活可变的网络拓扑结构,无论从网络拓扑的层数、网络拓扑的节点数和网络拓扑的稀疏性上都可以处理,且充分利用数据局部性原理,提高数据利用率,显著降低了带宽的限制。

在一个可能的设计中,所述计算引擎通过现场可编程门阵列FPGA、专用集成电路ASIC、复杂可编程逻辑器件CPLD中的任意一种或任意组合实现。

在一个可能的设计中,所述电子设备还包括存储器,用于存储所述处理器所用的计算机软件指令,其包含用于执行上述方面所述处理器所执行的程序。

本申请实施例提供的一种计算引擎、计算方法和电子设备,通过设计了一种新的向量与矩阵的乘法运算加速的计算方式,使得从缓存中读取一次向量的数据,可以连续使用多轮处理过程,实现一次缓存多次计算,发挥数据局部性原理,使得数据利用率最大化,降低了带宽需求。

附图说明

图1为现有技术中DNN结构示意图;

图2为现有技术中向量矩阵相乘运算阵列示意图;

图3为本申请实施例中电子设备结构示意图;

图4为本申请实施例中计算引擎结构示意图;

图5为本申请实施例中分块二级行列交叉存储方式示意图;

图6为本申请实施例中计算模块的结构示意图;

图7为本申请实施例中计算方法流程图;

图8为本申请实施例中深度神经网络模型各层参数示意图;

图9为本申请实施例中语音识别DNN计算场景执行流程示意图。

具体实施方式

为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

鉴于现有的一些网络技术中的硬件计算架构运行的算法对带宽的需求大,使得硬件计算架构的计算性能受到限制,无法发挥出最大的计算性能,本申请实施例提供了一种计算引擎和计算方法,通过设计一种新的向量与矩阵的乘法运算加速的计算方式,使得从缓存中读取一次向量的数据,可以连续使用多轮处理过程,实现一次缓存多次计算,发挥数据局部性原理,使得数据利用率最大化,降低了带宽需求。

本申请实施例提供的计算引擎、计算方法和电子设备,可以运用于向量与矩阵乘法运算加速的应用场景,应用于任何需要计算向量与矩阵乘法运算的产品中;当然也适用于包含向量与矩阵乘法运算和其他运算的复杂运算的应用场景,例如深度神经网络技术中,包含向量与矩阵乘法运算和激活函数运算的多个层次的运算结构。较佳的,针对深度神经网络技术的运算结构,本申请实施例在向量与矩阵的乘法运算方法的基础上,针对其他运算还设计了一些优化的方法。

下面将结合附图对本申请实施例提供的计算引擎和计算方法做详细说明。

本申请实施例以应用于电子设备为例,参阅图3所示,计算引擎301可被设置在电子设备300中,电子设备300中还包括处理器302,内存303和总线304。具体地,电子设备300中具有一块印制电路板(英文:Printed Circuit Board,缩写:PCB),PCB板上安装有处理器302、内存303,计算引擎301和另外一些终端所需的芯片。其中,内存303可以包括易失性存储器(英文:volatile memory),例如随机存取存储器(英文:random-access memory,缩写:RAM),也可以包括非易失性存储器(英文:non-volatile memory),例如快闪存储器(英文:flash memory),硬盘(英文:hard disk drive,缩写:HDD)或固态硬盘(英文:solid-state drive,缩写:SSD),还可以包括上述种类的存储器的组合。内存303用于缓存电子设备300采集到的数据、输入的向量和参数矩阵、以及计算引擎301的处理结果等。

处理器302可以是中央处理器(英文:central processing unit,缩写:CPU),网络处理器(英文:network processor,缩写:NP)或者CPU和NP的组合。处理器302通过下发一些配置参数控制计算引擎301的处理过程。

计算引擎301可以包括一个硬件芯片,通过硬件芯片进行编程来实现计算过程。上述硬件芯片可以是专用集成电路(英文:application-specific integrated circuit,缩写:ASIC),可编程逻辑器件(英文:programmable logic device,缩写:PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(英文:complex programmable logic device,缩写:CPLD),现场可编程逻辑门阵列(英文:field-programmable gate array,缩写:FPGA),通用阵列逻辑(英文:generic array logic,缩写:GAL)或其任意组合。

处理器302、计算引擎301和内存303通过总线304协议互连。

本申请实施例中对计算引擎301进行了改进,计算方式与现有的计算方式不同。参阅图4所示,本申请实施例中的计算引擎301包括缓存管理模块401、匹配分发模块402和至少L个计算模块403。以计算引擎301计算M维输入向量与M×N参数矩阵相乘运算为例,对计算引擎301及其实施的计算方法进行详细介绍。

缓存管理模块401,用于读取M维输入向量中的L个元素值并进行缓存,以及,在M×N参数矩阵中与L个元素值对应的子矩阵中依次读取L维行向量并传送至匹配分发模块402,其中,所述M×N参数矩阵可分为若干个子矩阵,每一个子矩阵均为L阶方阵,M、N、L均为大于1的整数。

匹配分发模块402,用于每接收到缓存管理模块401传送的一个L维行向量,从缓存管理模块401中缓存的所述L个元素值中取出与接收到的L维行向量对应的一个元素值,将取出的一个元素值与所述L维行向量中的值进行匹配,将各个匹配结果分别发送到上述至少L个计算模块中的对应计算模块403;

任意一个计算模块403,用于针对述匹配分发模块402发送的匹配结果进行计算。

具体来说,缓存管理模块401负责管理数据的缓存和读取过程,在涉及多层M维输入向量与M×N参数矩阵相乘运算的计算场景时,第一层运算时,缓存管理模块401是从处理器302的内存空间中读取的M维输入向量,其他层运算时,缓存管理模块401是从上一层运算的输出缓存中读取的M维输入向量。输出缓存为一个存储模块404,被设置在缓存管理模块401之内或之外均可,本申请实施例假设这个存储模块404被设置为缓存管理模块401之内。对于M×N参数矩阵,不管是一层还是多层运算,每一层运算时缓存管理模块401均是从处理器302的内存空间中读取的M×N参数矩阵。

本申请实施例将M×N参数矩阵的中元素的存储顺序做了优化调整,并不是常规的按照行或者列的连续存储方式来存储。处理器302采用“分块二级行列交叉“方式重组M×N参数矩阵的存储方式。为方便理解,本申请实施例中以下以M、N均为1024为例,即M×N参数矩阵为1024×1024参数矩阵。则如图5所示,1024×1024参数矩阵分成1024个子矩阵,每一行、每一列均有32个子矩阵。每一个子矩阵均为32×32的方阵。如图5中所示,存储顺序按照子矩阵先行后列的顺序,假设每一个子矩阵用一个自然数编号,第一行中数字编号1、2、3…32对应的子矩阵按照从左到右的顺序存储,然后第二行从第33号子矩阵开始,到64号子矩阵,再然后按照此规律一直到最后一行即32行的子矩阵存储完毕。其中,每一个子矩阵中包含32×32个元素,子矩阵中的元素也是按照先行后列的顺序依次存储,子矩阵中元素的存储方式的示意图如图5中右边的方形图。

在执行M维输入向量与M×N参数矩阵相乘运算时,缓存管理模块401首先读取M维输入向量中的L个元素值并缓存在存储模块404里,利用L个元素值,与M×N参数矩阵中与这L个元素值对应的部分子矩阵做运算。其中,M中包含整数个L。例如,M取值1024,L取值为32,1024维输入向量中包含32个子输入向量,每一个子输入向量有32个元素值。

具体地,缓存管理模块401在读取数据时,具体执行操作:

根据L个元素值在M维输入向量中的列序号范围,在M×N参数矩阵中选择与列序号范围相同的行序号范围对应的子矩阵集合;

在选出的子矩阵集合中按照列序号从小到大的顺序依次选择子矩阵,每选择一个子矩阵,在选出的子矩阵中按照行序号从小到大的顺序依次读取L维行向量。

1024维输入向量中包含1024个元素值,按自然数编号,这1024个元素值的列序号为1、2、3……1024。假设读取1024维输入向量中的前32个元素组成32个元素值,则这32个元素值在1024维输入向量中的列序号范围为[1-32],在1024×1024参数矩阵中选择与列序号范围为[1-32]相同的行序号范围[1-32]对应的子矩阵集合,即1024×1024参数矩阵中前32行的元素组成的子矩阵,即如图5中第一行数字编号1、2、3…32对应的子矩阵集合。在这个子矩阵集合中按照列序号从小到的顺序依次选择子矩阵,即按照第一行数字编号的顺序从左到右依次选择子矩阵。每选择一个子矩阵,在选出的子矩阵中按照行序号从小到大的顺序依次读取32维行向量。例如,先选择图5中编号为1的子矩阵,在编号为1的子矩阵中,先行后列的顺序依次读取,也就是一行一行的选择32维行向量进行读取。

以上介绍了缓存管理模块401是如何读取向量以及矩阵的数据的。匹配分发模块402用于将接收到的数据进行匹配,并分发给对应的计算模块403。匹配分发模块402从缓存管理模块401中缓存的L个元素值中取出与接收到的L维行向量对应的一个元素值满足以下条件:取出的一个元素值的列序号与接收到的L维行向量在所述M×N参数矩阵中的行序号相同。

举例介绍,具体地,如图5的示意图所示,第一次操作:匹配分发模块402接收到缓存管理模块401输出的第1个子矩阵中的第1行的32维行向量,匹配分发模块402从存储模块404中缓存的前32个元素值中取出第1个元素值,与上述第1个子矩阵中的第1行的32维行向量中的每一个元素进行配对,生成32对数据,将生成的32对数据分别发送到对应的计算模块403进行计算。第二次操作:匹配分发模块402接收到缓存管理模块401输出的第1个子矩阵中的第2行的32维行向量,匹配分发模块402从存储模块404中缓存的前32个元素值中取出第2个元素值,与上述第1个子矩阵中的第2行的32维行向量中的每一个元素进行配对,生成32对数据,将生成的32对数据分别发送到对应的计算模块403进行计算。以此类推,匹配分发模块402可以将第1个子矩阵中第3行至第32行32维行向量分别与缓存的前32个元素值中的第3个向量至第32个元素值分别进行配对,并分发到计算模块403进行计算。

本申请实施例中,在匹配分发模块402在匹配分发数据时进行了优化。匹配分发模块402在每一个匹配结果中携带L维行向量中对应值的列索引信号,列索引信号用于指示L维行向量中对应值在M×N参数矩阵中的列序号。举例来说,上述第一次操作中,在32对数据的匹配结果中,分别携带32维行向量中对应值的列索引信号,即1、2、……、32。

并且,匹配分发模块402将匹配结果中包含的L维行向量中的值在M×N参数矩阵中的列序号对L进行取模运算,按照取模运算的值确定所述至少L个计算模块对应的计算模块403。

举例来说,匹配分发模块402按照配对的数据中元素值在1024×1024参数矩阵中的列序号j对32取模运算的值来确定计算模块403的序号,上述第一次操作中,匹配分发模块402从存储模块404中缓存的前32个元素值中取出第1个元素值,与第1个子矩阵中的第1行的32维行向量中的第1个元素进行配对,由于第1个子矩阵中的第1行的32维行向量中的第1个元素在1024×1024参数矩阵中的列序号j为1,对32取模运算后的值是1,则配对后的数据发送到序号为1的计算模块403。这样做的好处是,若配对数据中的元素值为0,则可以不向计算模块403发送,也就是发往计算模块403的数据不一定是连续的,也可以是间隔跳跃的,只需要根据列序号就可以发送到正确对应的计算模块403,这使得匹配分发模块402可以处理稀疏的参数矩阵,即很多项为0的参数矩阵。

每一个计算模块403针对每次接收到的匹配结果按照预设的第一计算方式进行计算,获得乘积结果;将携带相同的列索引信号的匹配结果对应的乘积结果,按照预设的第二计算方式进行计算,获得累加结果。具体为,每一个计算模块403将接收到的匹配结果中包含的一个元素值与一个L维行向量中的一个值相乘,得到乘积结果;将携带相同的列索引信号的匹配结果对应的乘积结果进行累加,得到累加结果。

参阅图6所示,任意一个计算模块403包括乘法器601、加法器602、寄存器603、比较器604和局部存储器605,其中:

任意一个计算模块中的乘法器601,用于将每次接收到的匹配结果中包含的一个元素值与一个所述L维行向量中的一个值相乘,得到乘积结果。

任意一个计算模块中的比较器604,用于在述乘法器601计算之前,1比较每次接收到的匹配结果中的列索引信号与上一次接收到的匹配结果中的列索引信号是否相同,获得比较结果;上一次接收到的匹配结果中的列索引信号可以存储在如图6所示的部件606中,部件606可以为寄存器。

任意一个计算模块中的加法器602,用于在比较器604获得比较结果为相同时,将乘积结果与寄存器603中存储的第一临时累加值进行累加,按照累加所得结果更新第一临时累加值;

任意一个计算模块中的寄存器603,用于存储加法器602输出的第一临时累加值;

任意一个计算模块中的局部存储器605,用于存储每一个列索引信号对应的第二临时累加值;

任意一个计算模块中的加法器602,还用于在比较器604获得比较结果为不同时,将第一临时累加值与局部存储器605中存储的相应列索引信号对应的第二临时累加值进行累加计算,并按照累加所得结果更新第二临时累加值;且,所述寄存器603还用于在比较器604获得比较结果为不同时,将第一临时累加值清零。

举例来说,在计算图5中第1个子矩阵的32行的32维行向量时,匹配分发模块402需要每次向32个对应的计算模块403发送配对数据,一共发送32次,32个对应的计算模块403中的每一个计算模块403在接收到一对配对数据时,计算模块403中的乘法器601将配对数据的两个乘数相乘,获得一个乘积,并且由于每一次接收到的匹配结果中携带的列索引信号均相同,所以比较器604获得比较结果均为相同,则加法器602将乘积与存储在寄存器603中的第一临时累加值按照相加,按照将相加后的值更新第一临时累加值。这样,前32次运算后,寄存器603中存储的第一临时累加值为列索引信号相同的32个乘积的累加结果。

32个对应的计算模块403第33次分别接收到的匹配结果是,图5中第2个子矩阵中的第一行32维行向量分别与32个元素值中的第1个元素值匹配的结果,那么任意一个计算模块403接收的匹配结果中携带的列索引信号则与上次接收到的列索引信号不相同,即比较器604获得比较结果均为不同,这种情况下:加法器602将寄存器603中存储的第一临时累加值与局部存储器605中相应列索引信号对应的第二临时累加值相加,并按照相加结果更新第二临时累加值。其中,局部存储器605中存储着每一列对应的累加值,称为第二临时累加值。并且,寄存器603将第一临时累加值清零,开始新一轮的累加。后续执行过程跟第一轮过程相同。直到将图5中第2个子矩阵中的32行32维行向量全部运算完毕,以及,后续将图5中第3个至第32个子矩阵中的数据全部运算完毕,则在32个计算模块403的局部存储器605中存储着1024列对应的第二临时累加值。

这样,从1024维输入向量中取出的前32个元素值,可以执行32轮处理过程,且后续这前32个元素值不再继续参与运算,充分发挥了数据局部性原理,一次缓存多次计算,使数据利用率最大化,降低了带宽需求。

并且,由于匹配分发模块402分发的匹配结果中包含了列索引信号,可以根据列索引信号采用取模方式寻找对应的计算模块403,不用发送连续的列,可以处理稀疏的参数矩阵。通过列索引信号将原始数据的格式(例如稀疏或稠密)与计算过程解耦,每一个计算模块403不需要关注原来的数据是什么顺序到来或者在原来参数矩阵中是什么位置,只需要根据列索引信号就可以将累加值找到其在局部存储器605中相应的临时存储位置。

因此本申请实施例通过列索引信号的引入,既可以控制存储位置的确定,使得可以支持稠密矩阵和稀疏矩阵的计算,让计算过程与存储过程解耦,又可以控制参数矩阵同一列数据与相应参数值乘积的连续累加,使得不是每次累加都需要进行局部存储器的存取,而是多次累加一次存取(例如上例中的32次累加),大大减少了局部存储器的访问次数,降低了运行功耗。

若计算引擎301的运算涉及到多个层次,例如在深度神经网络技术,包含向量与矩阵乘法运算和激活函数运算的多个层次的运算结构。较佳的,计算引擎301还包括输出控制模块405和激活函数计算模块406。

输出控制模块405用于根据接收到的每一个计算模块403获得的累加结果,生成新的M维向量;并,在判定本次运算为运算结构中的最后一层运算时,将新的M维向量输出;或者,在判定本次运算非运算结构中的最后一层运算时,将新的M维向量输入到激活函数计算模块406;

激活函数计算模块406,用于将输出控制模块405输入的新的M维向量按照预设计算方式进行计算,获得计算结果,将计算结果输入至缓存管理模块401。

每一个计算模块403输出的累加结果为M×N参数矩阵中的列序号相同的所有元素与对应的M维向量中的元素进行相乘后的乘积累加的结果,输出控制模块405根据接收到的每一个计算模块403输出的累加结果,按照列索引信号按顺序生成新的M维向量,并判断本次累加结果是否为多个层次运算结构中的最后一层,若是,则将新的M维向量作为最后运算结果向外输出给处理器302;若不是,则将新的M维向量输入到激活函数计算模块406按照预设计算方式进行计算,获得计算结果,输入至缓存管理模块401,缓存管理模块401将计算结果作为下一层运算的输入向量,与来自处理器302的参数矩阵进行运算。

上述预设计算方式为激活函数的运算,则:

激活函数计算模块406还用于,将激活函数的输入值取值范围均分成若干段,计算若干段中的每一段取值范围对应的输出值与输入值的线性函数,并存储每一段的序号与线性函数的线性因子的对应关系,其中,线性函数根据所述线性因子唯一确定;

在将输出控制模块405输入的新的M维向量按照预设计算方式进行计算,获得计算结果时,激活函数计算模块406用于,查询新的M维向量中的元素值在激活函数的输入值取值范围的段的序号,根据查询出的序号以及所述对应关系,确定对应的线性函数的线性因子,根据确定出的线性因子计算新的M维向量中的元素值的输出值;并根据新的M维向量中的每一个元素值计算所得的输出值生成该计算结果。

例如,激活函数以sigmoid函数为例,输出控制模块405将新的M维向量输入到激活函数计算模块406,

Sigmoid函数的形式如下:Sigmoid函数的计算用硬件逻辑实现非常复杂,需要指数计算和除法,实现逻辑会非常消耗逻辑资源。如果采用现有的直接查表模式,把输入输出存储成表格,则需要很大的存储空间来存储表格数据。在本申请实施例中,查表法创新性地采用线性逼近的方法计算sigmoid函数。将sigmoid的x的取值范围固定为[-32,32],然后均分为K段,对其中任何一段,采用y=a*x+b的线性函数来近似h(x)。均分为K段以后,我们可以知道任何一段的起始两个端点的坐标,假设为(x1,y1),(x2,y2),那么可以求出a和b:a=(f(x2)-f(x1))/(x2-x1),b=f(x1)–a*x1。因此,上述的查表计算,只需要根据x的范围,查出a和b的值计算出线性计算的结果即可,而表中存储K对(a,b)的值即可,显著减少了表的空间占用。

本申请实施例中上述线性查表计算的方式,可以但不限于sigmoid函数,对于其他非线性激活函数,都可以采取一样的方法,只需要事先对存储表进行配置就可以支持各种类型的激活函数形式,实现灵活可配。

基于上述提供的计算引擎的同一发明构思,本申请实施例还提供了一种计算方法,参阅图7所示,该方法的流程包括:

步骤701:计算引擎读取M维输入向量中的L个元素值并进行缓存,以及,在M×N参数矩阵中与L个元素值对应的子矩阵中依次读取L维行向量,其中,M×N参数矩阵可分为若干个子矩阵,每一个子矩阵均为L阶方阵,M、N、L均为大于1的整数;

步骤702:计算引擎将每一个L维行向量与对应的一个元素值进行匹配,生成匹配结果;

步骤703:计算引擎针对各个匹配结果进行计算。

可选的,在M×N参数矩阵中与L个元素值对应的子矩阵中依次读取L维行向量,包括:

根据L个元素值在M维输入向量中的列序号范围,在M×N参数矩阵中选择与列序号范围相同的行序号范围对应的子矩阵集合;

在选出的子矩阵集合中按照列序号从小到大的顺序依次选择子矩阵,每选择一个子矩阵,在选出的子矩阵中按照行序号从小到大的顺序依次读取L维行向量。

可选的,任一个L维行向量与一个元素值对应需满足以下条件:一个元素值的列序号与任一个L维行向量在M×N参数矩阵中的行序号相同。

可选的,该方法还包括:

在每一个匹配结果中携带L维行向量中对应值的列索引信号,列索引信号用于指示L维行向量中对应值在M×N参数矩阵中的列序号。

可选的,计算引擎针对各个匹配结果进行计算,包括:

计算引擎将接收到的匹配结果中包含的一个元素值与一个所述L维行向量中的一个值相乘,得到乘积结果;

计算引擎将携带相同的列索引信号的匹配结果对应的乘积结果进行累加,得到累加结果。

可选的,该方法还包括:

计算引擎在任意一次计算乘积结果之前,比较每个匹配结果中的列索引信号与上一次匹配结果中的列索引信号是否相同,获得比较结果;

计算引擎在比较器获得比较结果为相同时,将乘积结果与第一临时累加值进行累加计算,按照累加所得结果更新第一临时累加值;

计算引擎在比较器获得比较结果为不同时,将第一临时累加值与存储的相应列索引信号对应的第二临时累加值进行累加计算,并按照累加所得结果更新第二临时累加值;且,将第一临时累加值清零。

可选的,该方法还包括:

计算引擎根据接收到的每一个累加结果,生成新的M维向量;并,

计算引擎将新的M维向量输出;或者,将新的M维向量按照预设计算方式进行计算,获得计算结果,将计算结果作为新的输入向量。

可选的,预设计算方式为激活函数的运算,方法还包括:计算引擎将激活函数的输入值取值范围均分成若干段,计算若干段中的每一段取值范围对应的输出值与输入值的线性函数,并存储每一段的序号与线性函数的线性因子的对应关系,线性函数根据线性因子唯一确定;

将新的M维向量按照预设计算方式进行计算,获得计算结果,包括:

计算引擎查询新的M维向量中的元素值在激活函数的输入值取值范围的段的序号,根据查询出的序号以及对应关系,确定对应的线性函数的线性因子,根据确定出的线性因子计算新的M维向量中的元素值的输出值;并根据新的M维向量中的每一个元素值计算所得的输出值生成上述计算结果。

综上,本申请实施例提供的计算引擎和计算方法,采用分块二级行列交叉顺序重组参数矩阵存储方式;匹配分发模块通过参数列索引信号,控制数据分发;计算模块通过参数列索引信号控制连续的局部累加,当前后两个列索引信号不同时,累加的临时结果才需要存入局部存储器对应位置中,使得多次连续计算后进行一次局部存储模块访问。采用线性逼近查表法支持激活函数计算;对于深度神经网络技术中多层运算架构,能够逐层计算,每一层的输出结果保存至下一层的输入缓存中。通过以上方法,本申请实施例提供的计算引可处理灵活可变的神经网络拓扑结构(包括层数、节点数、稀疏性等各个结构模式),可以支持多种激活函数类型的计算;充分利用数据局部性原理,提高数据利用率,显著降低了带宽需求的限制;基于列索引信号,控制数据分发,实现PE负载均衡与高资源利用率。

下面结合图3所示的电子设备300语音识别DNN计算场景,对本申请实施例提供的计算引擎和计算方法做进一步详细说明。

电子设备300通过总线304下发语音帧数据、DNN训练参数和DNN配置参数给计算引擎301,计算引擎301根据输入数据内容完成DNN计算并将计算结果返回电子设备300中的处理器302。

假设,计算引擎301中的深度神经网络模型包括1层输入层、3层隐藏层和1层输出层。输入层、所有隐藏层,以及输出层都是稠密的数据(包括稠密向量和稠密矩阵),因此需要对所有数据都进行运算。各层参数如图8所示,其中第1层至第2层的参数矩阵规模为320×1024,第2层至第3层和第3层至第4层的参数矩阵规模为1024×1024,第4层至第5层的参数矩阵规模为1024×2004。

如图8中,第1层到第4层,每一层到其下一层需要进行一轮DNN计算,包括矩阵乘向量的计算,以及激活函数的计算。

缓存管理模块401,用于管理每轮DNN计算的数据来源。当为第一层计算时,输入向量和矩阵参数均来自于处理器302的内存空间;当为非第一层计算时,输入向量参数来自于上一层计算输出至存储模块404中的结果,参数矩阵来自于处理器302的内存空间。

匹配分发模块402,用于将输入向量和参数矩阵进行优化匹配,并将配对后的数据有序地送入不同的计算模块403进行乘加操作,本实施例中有32个计算模块403,计算模块403可以是一个处理引擎。

每一个计算模块403完成神经网络的计算操作,即并行执行的向量-矩阵乘加运算。

输出控制模块405用于控制每层DNN计算的数据输出流向。当为最后一层DNN计算时,则将每一个计算模块403的计算结果直接送回给处理器302。当为非最后一层DNN计算时,则将每一个计算模块430的计算结果经过激活函数查表计算后送至存储模块404,作为下一层DNN计算时的输入向量使用。

下面介绍详细的执行步骤,执行流程示意图如图9所示。

在执行计算之前,处理器302通过寄存器603配置通道向DNN配置空间配置DNN计算相关参数,包括网络层数,输入向量规模,参数矩阵规模,输入向量的存储地址,参数矩阵的存储地址和偏移向量的存储地址等。DNN配置空间全局可见。激活函数以sigmoid函数为例,激活函数计算模块406中的Sigmoid表项初始化,因为Sigmoid函数计算通过查表的方式来实现。寄存器603可以是寄存器。

Step1:缓存管理模块401从DNN配置空间中获取输入向量的存储地址、第1层计算参数矩阵的存储地址和第1层计算偏移向量的存储地址。缓存管理模块401根据第1层计算偏移向量的存储地址读回第1层计算偏移向量值,并将该值写入数据各计算模块403对应的局部存储器605中,作为局部存储器605的初始值。其中,计算模块403在写入局部存储器605的操作时,需要与局部存储器605中写入前的值作累加后再写入。缓存管理模块401根据输入向量的存储地址读取输入向量,并写入至存储模块404。缓存管理模块401根据第1层参数矩阵的存储地址按顺序读取参数矩阵数据,并输入至匹配分发模块,一次读取1*32规模的参数矩阵。

Step2:

匹配分发模块402从存储模块404中取出输入向量第1列元素值(图6中的x_i)与从缓存管理模块401送入的第一个1×32(第一行前32个数值)规模的参数矩阵值(图7的A_ij)进行匹配操作,将配对后的值同时带上参数矩阵的列索引信号((图7的j))分别一一送至32个计算模块403对应的先入先出队列(英文:First Input First Output,缩写:FIFO),由计算模块403逐个进行计算操作。后面匹配分发模块402逐一从存储模块404中取出输入向量的第2至32列元素值,分别与从缓存管理模块401送入的第2至32个1*32(第2行至第32行的每行前32个数值)规模的参数矩阵值进行匹配分发操作。数据的分发是根据参数的列索引j对32取模进行分发,即:分发的计算模块403的序号=j%32。因此并不一定要求输入的参数是第1到第32列连续的,之间有间隔跳跃也是可以处理的,这一点也使得匹配分发模块402可以处理稀疏的参数矩阵,即很多项是0,而0不需要参与计算。

以上过程作为一轮匹配分发处理。而输入向量的第1列至第32列需要与参数矩阵的第1行至第32行的所有数据进行乘加操作,如图8中所示,第二层有1024个节点,因此存储模块404中的第1组输入向量(第1列至第32列)需要进行32轮匹配分发处理。由此可得,对第1组输入向量(第1列至第32列)的缓存可以保持32轮处理过程,在此之后则不再需要重新对其进行计算,充分发挥了数据局部性原理,一次缓存多次计算,最大化数据利用率,降低了带宽需求。

Step3:

每个计算模块403从其对应的FIFO中接收到数据便开始进行向量乘加操作。每个计算模块403计算前判断当前输入参数矩阵的列索引信号与上一次计算时输入参数矩阵的列索引信号是否相同。若相同,则将当前计算值与寄存器603中存储的上一累加值相加并保持在寄存器603中;若不相同,则将当前寄存器603中存储的累加值与局部存储器605中的该列的临时累加值相加后再写回至局部存储器605中该列对应的位置,同时将当前寄存器603中的累加值清零并开始新一轮的乘加操作。当计算至参数矩阵最后一行时,则输出每列的计算结果值并送至输出控制模块405。

Step4:

输出控制模块405判断当前层是否为DNN计算最后一层,若是,则将每一个计算模块403输入的计算结果值直接送回给处理器302;若不是,则将每一个计算模块403输入的计算结果值送至激活函数计算模块406进行Sigmoid函数查表计算,得到经过Sigmoid归一化处理后的结果值。Sigmoid函数计算完成后的数据写入存储模块404作为下一层DNN计算的输入向量。Sigmoid函数的形式如下:上述查表法创新性地采用线性逼近的方法计算sigmoid函数。根据x的范围,查出a和b的值计算出线性计算的结果。

第1层DNN计算完成后依次开始第2层至第4层的DNN计算。与第1层DNN计算不同的是,第2层至第4层的DNN计算的输入向量不需要通过缓存管理模块401从处理器302的内存空间中读取,而是直接从存储模块404中读取。

本申请实施例中,因为DNN逐层计算,通过每一层的输出结果保存到下一层的输入缓存中,所以DNN的层数可以灵活可变。因为采用分块二级行列交叉顺序存储参数矩阵,通过计算过程按照块顺序(先行后列)执行,每一个小块数据很小(如32*32),所以每一层的节点数数量大小可变。因为匹配分发模块402下发的数据,是由两个乘数,一个列索引信号组成的,通过列索引信号将外部数据流与计算模块内部的计算过程解耦,每一个计算模块不需要关注数据是如何顺序到来或在原始参数矩阵的位置,而只需要将乘-加后的结果根据列索引找到相应的零时缓存位置存储到局部存储器中即可,所以不论是稠密还是稀疏的网络结构(即参数矩阵),都可以支持。因为采用线性逼近查表法,通过分段线性逼近,可以对各种激活函数进行近似计算,所以可以支持多种激活函数类型。因为每一个数据维度都会和参数矩阵中的一整行数据进行计算,通过一次缓存多次数据分发计算,充分提高数据利用率,所以降低带宽需求限制。因为匹配分发模块基于列索引信号平均地将数据分发到计算模块中,计算模块之间都有均衡的计算数据,所以满足计算模块负载均衡与高资源利用率。因为计算模块通过列索引信号,就可以完全独立控制乘法-加法-存取等所有内部操作,完全不需要依赖外部控制,所以每个计算模块都是相互独立的。因为参数或者数据任何一方是0的情况,不会对计算结果造成影响,通过匹配分发模块过滤掉0的数据或者参数(也就是不放入FIFO),而计算模块的计算也可以支持稀疏数据情况,就可以减少实际需要的乘加计算次数,所以降低了计算功耗。因为计算模块以列索引信号来控制连续列数据的局部累加,不是每次累加后的零时结果都需要存入局部存储器中,而是多次累加后才需要一次局部存储器的存取,减少了局部存储器的访问次数,而局部存储器的访问在动态功耗中占很大比例,所以降低了硬件整体的运行功耗。

计算模块的结构内部有独享的分布式局部存储器,每个计算模块内部计算的临时结果缓存完全发生在计算模块内部的分布式局部存储器中,计算模块之间不冲突,可以并行读取。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例的精神和范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1