卷积运算装置及方法与流程

文档序号:15144122发布日期:2018-08-10 20:14阅读:242来源:国知局

本发明属于计算机领域,尤其涉及一种卷积运算装置及方法。



背景技术:

当前计算机领域有越来越多的算法涉及到矩阵运算,包括人工神经网络算法和图形的渲染算法。与此同时,作为矩阵运算中的一个重要组成部分,子矩阵运算也越来越频繁的出现在各种计算任务中。所以对于那些面向解决矩阵运算问题的方案,必须同时考虑子矩阵运算实现的效率和难度。

在现有技术中一种进行子矩阵运算的已知方案是使用通用处理器,该方法通过通用寄存器堆和通用功能部件来执行通用指令,从而执行子矩阵运算。然而,该方法的缺点之一是单个通用处理器多用于标量计算,在进行子矩阵运算时运算性能较低。而使用多个通用处理器并行执行时,通用处理器之间的相互通讯又有可能成为性能瓶颈,同时,实现子矩阵运算的代码量也大于正常的矩阵运算。

在另一种现有技术中,使用图形处理器(gpu)来进行子矩阵计算,其中,通过使用通用寄存器堆和通用流处理单元执行通用simd(singleinstructionmultipledata,单指令多数据流)指令来进行子矩阵运算。然而,上述方案中,gpu片上缓存太小,在进行大规模子矩阵运算时需要不断进行片外数据搬运,片外带宽成为了主要性能瓶颈。

在另一种现有技术中,使用专门定制的矩阵运算装置来进行子矩阵计算,其中,使用定制的寄存器堆和定制的处理单元进行子矩阵运算。然而,目前已有的专用矩阵运算装置受限于寄存器堆,子矩阵数据通常具有特定的规模,不能够灵活地支持不同长度的子矩阵运算。

综上所述,现有的不管是片上多核通用处理器、片间互联通用处理器(单核或多核)、还是片间互联,图形处理器都无法进行高效的子矩阵运算,并且这些现有技术在处理子矩阵运算问题时存在着代码量大,受限于片间通讯,片上缓存不够,支持的子矩阵规模不够灵活等问题。



技术实现要素:

基于此,本发明提供一种卷积运算装置及方法,通过配合卷积指令,能够满足不同规模子矩阵数据的卷积运算过程,高效地实现卷积指令等运算。

一种卷积运算方法,所述方法包括如下步骤:

获取卷积指令;

根据所述卷积指令从存储单元中获取卷积核矩阵数据;

从待卷积矩阵的起始位置开始,获取所述卷积核矩阵数据在当前位置的子矩阵数据;

执行卷积计算操作,所述卷积计算操作包括:对所述卷积核矩阵数据和所述卷积核矩阵数据在所述当前位置的子矩阵数据进行对位相乘运算获得多个元素,并对多个所述元素进行累加求和运算,获得所述当前位置的卷积结果;

根据所述卷积指令中给定的位移参数,将所述卷积核矩阵数据从所述当前位置移动至下一位置,并获取所述下一位置对应的子矩阵数据,之后返回执行卷积计算操作的步骤,直至完成所述待卷积矩阵数据的卷积计算,获得结果矩阵。

在其中一个实施例中,从待卷积矩阵的起始位置开始,获取所述卷积核矩阵数据在当前位置的子矩阵数据的步骤包括:

从所述待卷积矩阵的起始位置开始,根据所述卷积指令从寄存器单元中获取所述卷积核矩阵数据在所述当前位置对应的子矩阵信息;

根据所述当前位置对应的子矩阵信息从所述存储单元中获取所述卷积核矩阵数据在所述当前位置的子矩阵数据;

其中,所述子矩阵信息包括子矩阵数据在所述存储单元中的起始地址、子矩阵数据的行宽、子矩阵数据的列宽以及行间隔,其中,行间隔是指子矩阵数据相邻两行间,上一行的行末数据到下一行的行首数据的数据间隔。

在其中一个实施例中,在获取卷积指令的步骤之前,所述方法还包括如下步骤:

通过io指令将待卷积的矩阵数据和卷积核矩阵数据存储至存储单元的指定地址。

在其中一个实施例中,获取卷积指令的步骤之后还包括:

对获取的卷积指令进行译码;

判断所述卷积指令与前一子矩阵运算指令是否访问相同的子矩阵数据,若是,则将所述卷积指令存储在指令队列中,等待前一子矩阵运算指令执行完毕后,再执行根据所述卷积指令从存储单元中获取卷积核矩阵数据的步骤。

在其中一个实施例中,所述方法还包括如下步骤:

通过io指令将卷积后的结果矩阵存储至所述存储单元。

在其中一个实施例中,所述卷积指令包括操作码和至少一个操作域,其中,所述操作码用于指示所述卷积指令的功能,操作域用于指示所述卷积指令的数据信息;

所述卷积指令的数据信息包括寄存器单元的编号,从而能够根据寄存器单元的编号访问对应的寄存器单元,从而获取子矩阵信息。

在其中一个实施例中,所述待卷积矩阵数据为n×y×x的矩阵,所述卷积核数据为n×h×w的矩阵;

或者,所述待卷积矩阵数据为y×x的矩阵,所述卷积核数据为x的一维数组;

其中,n为待卷积矩阵数据的特征图像数,y为特征图像长,x为特征图像宽。

同时,本发明还提供了一种卷积运算装置,所述装置用于根据卷积指令从待卷积矩阵数据中获取子矩阵数据,并根据所述子矩阵数据执行卷积运算,所述装置包括:

存储单元,用于存储待卷积的矩阵数据;

寄存器单元,用于存储子矩阵信息;

子矩阵运算单元,用于获取卷积指令;根据所述卷积指令从存储单元中获取卷积核矩阵数据;从待卷积矩阵的起始位置开始,获取所述卷积核矩阵数据在当前位置的子矩阵数据;执行卷积计算操作,所述卷积计算操作包括:对所述卷积核矩阵数据和所述卷积核矩阵数据在所述当前位置的子矩阵数据进行对位相乘运算获得多个元素,并对多个所述元素进行累加求和运算,获得所述当前位置的卷积结果;根据所述卷积指令中给定的位移参数,将所述卷积核矩阵数据从所述当前位置移动至下一位置,并获取所述下一位置对应的子矩阵数据,之后返回执行卷积计算操作的步骤,直至完成所述待卷积矩阵数据的卷积计算,获得结果矩阵。

在其中一个实施例中,所述子矩阵运算单元用于从待卷积矩阵的起始位置开始,获取所述卷积核矩阵数据在当前位置的子矩阵数据时,所述子矩阵运算单元进一步用于从所述待卷积矩阵的起始位置开始,根据所述卷积指令从寄存器单元中获取所述卷积核矩阵数据在所述当前位置对应的子矩阵信息;并根据所述当前位置对应的子矩阵信息从所述存储单元中获取所述卷积核矩阵数据在所述当前位置的子矩阵数据;

其中,所述子矩阵信息包括子矩阵数据在所述存储单元中的起始地址、子矩阵数据的行宽、子矩阵数据的列宽以及行间隔,其中,行间隔是指子矩阵数据相邻两行间,上一行的行末数据到下一行的行首数据的数据间隔。

在其中一个实施例中,还包括用于获取所述卷积指令,并对所述卷积指令进行处理的指令处理单元,所述指令处理单元包括:

取指模块,用于获取所述卷积指令;

译码模块,用于对获取的所述卷积指令进行译码;

指令队列,用于对译码后的所述卷积指令进行顺序存储;

依赖关系处理模块,用于在所述子矩阵运算单元获取卷积指令前,判断所述卷积指令与前一子矩阵运算指令是否访问相同的子矩阵数据,若是,则将所述卷积指令存储在指令队列中,等待前一子矩阵运算指令执行完毕后,再根据所述卷积指令从存储单元中获取卷积核矩阵数据。

在其中一个实施例中,所述存储单元还用于存储卷积后的结果矩阵;

所述装置还包括输入输出单元,所述输入输出单元用于将待卷积的矩阵数据和卷积核矩阵数据存储至存储单元的指定地址,所述输入输出单元还用于从所述存储单元中获取卷积后的结果矩阵。

在其中一个实施例中,所述存储单元为高速暂存存储器。

在其中一个实施例中,所述子矩阵运算单元包括子矩阵加法部件、子矩阵乘法部件、大小比较部件、非线性运算部件和子矩阵标量乘法部件,所述子矩阵加法部件、子矩阵乘法部件、大小比较部件、非线性运算部件和子矩阵标量乘法部件形成多流水级结构;

所述多流水级结构包括第一流水级、第二流水级和第三流水级,其中,所述子矩阵加法部件和子矩阵乘法部件处于第一流水级,大小比较部件处于第二流水级,非线性运算部件和子矩阵标量乘法部件处于第三流水级。

本发明提供的卷积运算方法及装置,可以根据卷积指令从存储单元中获取卷积核矩阵数据以及该卷积核矩阵数据在待卷积矩阵的当前位置的子矩阵数据,之后,可以根据卷积核矩阵数据和当前位置的子矩阵数据进行卷积运算,获得结果矩阵,该卷积运算方法能够支持不同规模的子矩阵数据,提升包含大量矩阵计算任务的执行性能,同时提高了卷积指令等运算的运算效率。进一步地,本发明中的卷积指令能够支持不同矩阵长度,使用灵活方便。

附图说明

图1是本申请一实施例提供的子矩阵运算装置的示意图;

图2是本申请一实施例提供的指令集格式示意图;

图3是本申请中一个子矩阵的示意图;

图4是本申请另一实施例提供的子矩阵运算装置的示意图;

图5是本申请实施例提供的子矩阵运算方法执行子矩阵乘子矩阵指令时的流程图;

图6是本申请实施例中矩阵数据和子矩阵数据的示意图;

图7是本申请实施例提供的子矩阵运算装置执行卷积神经网络运算的流程图。

具体实施方式

本申请实施例提供了一种子矩阵运算装置及方法,包括存储单元、寄存器单元和子矩阵运算单元,存储单元中存储有子矩阵数据,寄存器单元中存储有子矩阵信息,子矩阵运算单元可以根据子矩阵运算指令在寄存器单元中获取子矩阵信息,然后,根据该子矩阵信息在存储单元中获取相应的子矩阵数据,接着,根据获取的子矩阵数据进行子矩阵运算,得到子矩阵运算结果。本申请实施例的存储单元可以为高速暂存存储器,通过将参与计算的子矩阵数据暂存在高速暂存存储器上,使得子矩阵运算过程中可以更加灵活有效地支持不同宽度的数据,提升包含大量子矩阵计算任务的执行性能。其中高速暂存存储器可以通过各种不同存储器件,如静态ram(sram)、动态ram(dram)、增强动态ram(edram)、忆阻器、3d-dram和非易失存储等实现。

图1是本申请实施例提供的子矩阵运算装置的示意图,如图1所示,该子矩阵运算装置包括存储单元、寄存器单元和子矩阵运算单元。其中,存储单元用于存储矩阵数据;寄存器单元用于存储子矩阵信息,在具体应用中,可以由多个寄存器单元组成一个寄存器堆,每个寄存器单元存储有不同的子矩阵信息,需要说明书的是,子矩阵信息均为标量数据。可选地,子矩阵信息可以包括子矩阵数据在存储单元中的起始地址(start_addr)、子矩阵数据的行宽(iter1)、子矩阵数据的列宽(iter2)以及行间隔(stride1),其中,行间隔是指子矩阵数据相邻两行间,上一行的行末数据到下一行的行首数据的数据间隔。

如图3所示,矩阵数据实际在存储单元中是以一维的方式存储的,子矩阵的起始地址即图3中子矩阵左上角元素的地址,子矩阵的行宽即图3中子矩阵每一行元素的个数,子矩阵的列宽即图3中子矩阵每一列元素的个数,子矩阵的行间距即图3中子矩阵上一行最后一个元素到下一行第一个元素之间的地址间距。该子矩阵运算装置在实际读取子矩阵数据时,只需要从子矩阵数据在存储单元中的起始位置start_addr开始,每读取iter1个数据后跳过stride1个数据再读取iter1个数据,重复iter2次即可获得完整的子矩阵数据。这样,通过上述方式获得的子矩阵数据可以是规模不定的矩阵数据,即子矩阵数据的行宽、列宽以及行间隔中的一个或多个可以是不固定的。相对于现有技术中,子矩阵规模固定的运算装置,本申请实施例的装置获取的子矩阵运算装置,能够支持不同规模的子矩阵数据,提升了包含大量矩阵计算任务的执行性能。

子矩阵运算单元用于获取子矩阵运算指令,并根据该子矩阵运算指令从寄存器单元中获取子矩阵信息,然后,根据该子矩阵信息从存储单元中的矩阵数据中获取子矩阵数据,接着,根据获取的子矩阵数据进行子矩阵运算,得到子矩阵运算结果。可选地,该子矩阵运算可以包括卷积运算、张量运算、子矩阵乘向量运算、向量乘子矩阵运算、子矩阵对位乘法运算、子矩阵加法运算及子矩阵减法运算等以及子矩阵搬运运算等等。本申请实施例中,每个子矩阵运算可以通过子矩阵运算指令实现,且子矩阵运算指令具有特定的指令格式。

图2是本申请实施例提供的指令集格式示意图,如图2所示,指令集采用load/store结构,子矩阵运算单元不会对内存中的数据进行操作。子矩阵指令集采用超长指令集架构(verylonginstructionword),同时,指令集采用定长指令,使得子矩阵运算装置在上一条子矩阵运算指令的译码阶段就可以对下一条子矩阵运算指令进行取值。可选地,子矩阵运算指令可以包括操作码和多个操作域,其中,操作码用于指示该子矩阵运算指令的功能,操作域用于指示该子矩阵运算指令的数据信息,数据信息为寄存器单元的编号或者立即数,子矩阵运算单元可以根据寄存器单元的编号访问对应的寄存器单元,从而获取子矩阵信息。或者,子矩阵运算单元也可以直接将立即数作为子矩阵数据进行相应的子矩阵运算。

需要说明的是,针对不同功能的运算指令,子矩阵运算指令的操作码也不同,具体地,在本申请实施例提供的一套指令集中,包含有不同功能的子矩阵运算指令:

子矩阵乘向量指令(smmv),根据该指令,装置从高速暂存存储器的指定起始地址,根据指令中子矩阵的行宽、列宽和行间距取出指定的子矩阵数据,同时取出向量数据,在子矩阵运算单元中进行矩阵乘向量的乘法运算,并将结果写回至高速暂存存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。

向量乘子矩阵指令(vmsm),根据该指令,装置从高速暂存存储器的指定地址取出向量数据,同时根据指令中的子矩阵起始地址、子矩阵的行宽和列宽以及子矩阵的行间距取出指定的子矩阵,在矩阵单元中进行向量乘子矩阵的乘法运算,并将结果写回至高速暂存存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。

子矩阵乘标量指令(smms),根据该指令,装置从高速暂存存储器的指定地址,根据指令中的子矩阵的行宽和列宽以及子矩阵的行间距,取出指定的子矩阵数据,从标量寄存器堆的指定地址中取出指定的标量数据,在子矩阵运算单元中进行子矩阵乘标量的运算,并将结果写回至高速暂存存储器的指定地址,需要说明的是,标量寄存器堆不仅存储有子矩阵的各种数据信息(包括起始地址、行宽、列宽和行间距),还存有标量数据本身。

张量运算指令(tens),根据该指令,装置从高速暂存存储器取出指定的两块子矩阵数据,在子矩阵运算单元中对两子矩阵数据进行张量运算,并将计算结果写回至高速暂存存储器的指定地址。

子矩阵加法指令(sma),根据该指令,装置从高速暂存存储器取出指定的两块子矩阵数据,在子矩阵运算单元中对两子矩阵数据进行加法运算,并将计算结果写回至高速暂存存储器的指定地址。

子矩阵减法指令(sms),根据该指令,装置从高速暂存存储器取出指定的两块子矩阵数据,在子矩阵运算单元中对两子矩阵数据进行减法运算,并将计算结果写回至高速暂存存储器的指定地址。

子矩阵乘法指令(smm),根据该指令,装置从高速暂存存储器取出指定的两块子矩阵数据,在子矩阵运算单元中对两子矩阵数据进行对位乘法运算,并将计算结果写回至高速暂存存储器的指定地址。

卷积指令(conv),根据该指令,实现用卷积核对矩阵进行卷积滤波。装置从高速暂存存储器取出指定的卷积核矩阵,从待卷积矩阵存储的起始地址开始,对当前位置下卷积核覆盖的子矩阵数据进行滤波,即在子矩阵运算单元中对卷积核和子矩阵进行对位乘法运算,并对得到的矩阵进行元素求和,得到当前位置的滤波结果,将结果写回至高速暂存存储器的指定地址。然后根据指令中给定的位移参数,在待卷积矩阵上移动至下一位置,重复上面的运算,直到移动至结束位置。

子矩阵搬运指令(smmove),根据该指令,装置将高速暂存存储器中存储的指定子矩阵存至高速暂存存储器的另一处地址。

进一步,子矩阵运算装置还包括指令处理单元,用于获取子矩阵运算指令,并对该子矩阵运算指令进行处理后,提供给子矩阵运算单元。具体地,如图4所示,指令处理单元可以包括取指模块、译码模块、指令队列及依赖关系处理单元,其中,取指模块用于获取子矩阵运算指令,译码模块用于对获取的子矩阵运算指令进行译码,指令队列用于对译码后的子矩阵运算指令进行顺序存储,依赖关系处理单元用于在子矩阵运算单元获取子矩阵运算指令前,判断该子矩阵运算指令与前一子矩阵运算指令是否访问相同的子矩阵数据,若是,则将该子矩阵运算指令存储在指令队列中,等待前一子矩阵运算指令执行完毕后,再将所述指令队列中的该子矩阵运算指令提供给所述子矩阵运算单元,否则,直接将该子矩阵运算指令提供给所述子矩阵运算单元。

进一步,存储单元还用于存储子矩阵运算结果,优选地,可采用高速暂存存储器作为存储单元。另外,本发明还包括输入输出单元,其与存储单元直接连接,输入输出单元用于将矩阵数据存储于存储单元,或者,从存储单元中获取子矩阵运算结果。

进一步,子矩阵运算单元还可以包括子矩阵加法部件、子矩阵乘法部件、大小比较部件、非线性运算部件和子矩阵标量乘法部件。进一步地,子矩阵运算单元为多流水级结构,多流水级结构包括第一流水级、第二流水级和第三流水级,其中,子矩阵加法部件和子矩阵乘法部件处于第一流水级,大小比较部件处于第二流水级,非线性运算部件和子矩阵标量乘法部件处于第三流水级。

本领域的技术人员可以理解的是,当该子矩阵运算单元执行卷积指令时,上述的子矩阵运算装置即作为卷积运算装置,此时卷积运算装置与上述的子矩阵运算装置具有相同的结构,此处不再赘述卷积运算装置的结构,具体可参见上文中的描述。

本申请实施例还提供一种子矩阵运算方法,包括:

s1,存储矩阵数据;

s2,存储子矩阵信息;

s3,获取子矩阵运算指令,并根据该子矩阵运算指令获取子矩阵信息,然后,根据该子矩阵信息从存储的矩阵数据中获取子矩阵数据,接着,根据获取的子矩阵数据进行子矩阵运算,得到子矩阵运算结果。

进一步,在步骤s3之前,还包括:

获取子矩阵运算指令;

对获取的子矩阵运算指令进行译码;

判断该子矩阵运算指令与前一子矩阵运算指令是否访问相同的子矩阵数据,若是,则将该子矩阵运算指令存储在指令队列中,等待前一子矩阵运算指令执行完毕后,再将执行所述步骤s3,否则,直接执行步骤s3。

进一步,步骤s3还包括,存储子矩阵运算结果。

进一步,上述方法还包括:步骤s4,获取存储的子矩阵运算结果。

进一步,子矩阵运算包括子矩阵加法运算、子矩阵乘法运算、大小比较运算、非线性运算和子矩阵标量乘法运算。进一步地,采用多流水级结构进行子矩阵运算,多流水级结构包括第一流水级、第二流水级和第三流水级,其中,在第一流水级进行子矩阵加法运算和子矩阵乘法运算,在第二流水级进行大小比较运算,在第三流水级进行非线性运算和子矩阵标量乘法运算。

例如,图4是本发明实施例提供的子矩阵运算装置的示意图,如图4所示,装置包括取指模块、译码模块、指令队列、标量寄存器堆(即寄存器单元)、依赖关系处理单元、指令队列、子矩阵运算单元、高速暂存器(即存储单元)、io内存存取模块(输入输出单元),其中:

取指模块用于从指令序列中取出下一条将要执行的指令,并将该指令传给译码模块;

译码模块用于对获取的指令进行译码,并将译码后指令传给指令队列;

考虑到不同指令在包含的标量寄存器上有可能存在依赖关系,指令队列用于缓存译码后的指令,当依赖关系被满足之后发送指令;

标量寄存器堆能够提供装置在运算过程中所需的多个标量寄存器;

依赖关系处理单元用于处理指令与前一条指令可能存在的存储依赖关系。子矩阵运算指令会访问高速暂存存储器,前后指令可能会访问同一块存储空间。为了保证指令执行结果的正确性,该指令如果被检测到与之前的指令的数据存在依赖关系,该指令必须在指令队列内等待至依赖关系被消除。

指令队列是一个有序队列,与之前指令在数据上有依赖关系的指令被存储在该队列内直至存储关系被消除;

子矩阵运算单元,该模块负责装置的所有子矩阵运算,包括但不限于子矩阵加法操作、子矩阵加标量操作、子矩阵减法操作、子矩阵减标量操作、子矩阵乘法操作、子矩阵乘标量操作、子矩阵除法(对位相除)操作、子矩阵与操作和子矩阵或操作,子矩阵运算指令被送往该运算单元执行。

高速暂存存储器,该模块是矩阵数据专用的暂存存储装置,能够支持不同大小的矩阵数据;

io内存存取模块,该模块用于直接访问高速暂存存储器,负责从高速暂存存储器中读取数据或写入数据。

例如,图5是本申请实施例提供的子矩阵运算装置执行子矩阵乘向量执行的流程图,如图5所示,执行子矩阵乘向量指令的过程包括:

s1,取指模块取出该条子矩阵乘向量指令,并将该指令送往译码模块。

s2,译码模块对指令译码,并将指令送往指令队列。

s3,在指令队列中,该子矩阵乘向量指令需要从标量寄存器堆中获取指令中操作域所对应的标量寄存器里的数据,包括输入向量地址、输入向量长度、输入子矩阵地址、输入子矩阵行宽、输入子矩阵列宽、输入子矩阵行间距、输出向量地址、输出向量长度。

s4,在取得需要的标量数据后,该指令被送往依赖关系处理单元。依赖关系处理单元分析该指令与前面的尚未执行结束的指令在数据上是否存在依赖关系。该条指令需要在指令队列中等待至其与前面的未执行结束的指令在数据上不再存在依赖关系为止。

s5,依赖关系不存在后,该条子矩阵乘向量指令被送往子矩阵运算单元。子矩阵运算单元根据所需数据的位置信息从高速暂存器中取出需要的子矩阵和向量数据,然后在子矩阵运算单元中完成乘法运算。

s6,运算完成后,将结果写回至高速暂存存储器的指定地址。

本领域的技术人员可以理解的是,向量乘子矩阵指令的执行过程与上述子矩阵乘向量指令的流程类似,其不同之处仅在于乘数与被乘数的位置变化。

可选地,该子矩阵运算方法还可以用于根据卷积运算指令从待卷积矩阵数据中获取子矩阵数据,并根据子矩阵数据执行卷积运算。具体地,该卷积运算方法可以包括如下步骤:

获取卷积指令;具体地,子矩阵运算单元可以获取卷积指令。进一步地,指令处理单元的取指模块可以读取卷积指令,指令处理单元的译码模块可以对获取的卷积指令进行译码,指令处理单元的依赖关系处理单元可以判断该卷积指令与前一子矩阵运算指令是否访问相同的子矩阵数据,若是,则将该卷积指令存储在指令队列中,等待前一子矩阵运算指令执行完毕,之后,指令处理单元可以将该卷积指令传送至子矩阵运算单元,根据卷积指令从存储单元中获取卷积核矩阵数据。

根据卷积指令从存储单元中获取卷积核矩阵数据;本申请实施例中,可以通过io指令将待卷积的矩阵数据和卷积核矩阵数据存储在存储单元的指定地址。当子矩阵运算单元获取到卷积指令后,其可以根据该卷积指令从存储单元中获取卷积核矩阵数据。

从待卷积矩阵的起始位置开始,获取卷积核矩阵数据在当前位置的子矩阵数据;可选地,子矩阵运算单元可以从待卷积矩阵的起始位置开始,根据卷积指令从寄存器单元中获取所述卷积核矩阵数据在所述当前位置对应的子矩阵信息,之后,子矩阵运算单元可以根据当前位置对应的子矩阵信息从存储单元中获取卷积核矩阵数据在当前位置的子矩阵数据。其中,子矩阵信息包括子矩阵数据在存储单元中的起始地址、子矩阵数据的行宽、子矩阵数据的列宽、以及行间隔,其中,行间隔是指子矩阵数据相邻两行间,上一行的行末数据到下一行的行首数据的数据间隔。

执行卷积计算操作,该卷积计算操作包括:对卷积核矩阵数据和卷积核矩阵数据在当前位置的子矩阵数据进行对位相乘运算获得多个元素,并对多个元素进行累加求和运算,获得当前位置的卷积结果。也就是说,本申请实施例中,子矩阵运算单元采用对位相乘求和法进行卷积运算。

根据卷积指令中给定的位移参数,将卷积核矩阵数据从当前位置移动至下一位置,并获取下一位置对应的子矩阵数据,之后返回执行卷积计算操作的步骤,直至完成待卷积矩阵数据的卷积计算,获得结果矩阵。具体地,子矩阵运算单元可以重复上述的位移步骤及卷积计算操作,直至获得结果矩阵,之后,可以将该结果矩阵存储至片外。

具体地,图6为本发明实施例提供的子矩阵运算单元进行卷积神经网络运算的方法的流程图,该方法主要由子矩阵运算指令实现。卷积神经网络的运算特征是:对于n×y×x规模的特征图像输入(其中n是输入特征图像数,y是特征图像长,x是特征图像宽),有n×h×w规模的卷积核,卷积核在输入图像上不断移动,在每个位置卷积核与自己所覆盖的输入图像的数据进行卷积运算,得到输出图像上对应的一个点的值。针对这种运算特征,卷积神经网络可以由一条子矩阵卷积指令循环实现。在实际的存储中,如图6所示,数据存储时在图像个数的维度上展开,输入数据图像由n×y×x的三维数组变成y×(x×n)的二维矩阵,相同地,卷积核数据变成h×(w×n)的二维矩阵。如图7所示,实现卷积神经网络的过程包括:

s1,通过io指令将待卷积的矩阵数据和卷积核矩阵数据存至矩阵专用高速暂存存储器的指定地址;

s2,译码器取出conv运算指令,根据该指令,子矩阵运算单元从高速暂存存储器中读取卷积核矩阵数据和该卷积核在输入图像起始位置的子矩阵数据。

s3,两矩阵数据在子矩阵运算单元中进行对位相乘和元素累加求和的运算,并写回结果。然后子矩阵运算单元继续读入卷积核,同时根据指令中位移参数得到的下一个待卷积的子矩阵的起始地址,读取数据。

s4,在conv指令执行过程中,上面过程不断循环,直到完成卷积核在待卷积矩阵最后一个位置上的卷积运算。

s5,通过io指令将卷积后的结果矩阵存至片外。

需声明,本实施例采用了一种更加高效的方法实现卷积运算,即将三维的输入图像和卷积核均展开成二维形式,实际上,这不是本发明的装置和方法实现卷积运算的唯一方式,一种更通用的方法是对输入的每一张二维图像,与对应的卷积核中的一个面通过子矩阵指令执行卷积运算,得到输出结果的一个部分和,最终的卷积结果是所有的二维图像和与之相对应的卷积核中的面进行卷积运算得到的部分和的累加。故,子矩阵运算指令可以以多种方式实现卷积操作。

综上所述,本发明提供子矩阵运算装置,并配合相应的子矩阵运算指令集,能够很好地解决当前计算机领域越来越多的算法包含大量子矩阵运算的问题,相比于已有的传统解决方案,本发明可以具有使用方便、支持的子矩阵规模灵活、片上缓存充足等优点。本发明可以用于多种包含大量子矩阵运算的计算任务,包括目前表现十分出色的人工神经网络算法的反向训练和正向预测。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

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