一种计算方法及相关产品
技术领域
本申请涉及数据处理技术领域,具体涉及一种计算方法及相关产品。
背景技术
数据处理是大部分算法需要经过的步骤或阶段,在计算机引入数据处理领域后,越来越多的数据处理通过计算机来实现,现有的算法中有计算设备在进行矩阵数据的计算时速度慢,效率低。
发明内容
本申请实施例提供了一种计算方法及相关产品,可提升计算装置的处理速度,提高效率。
第一方面,提供一种计算方法,应用于计算装置内,所述计算装置包括存储介质、寄存器单元和矩阵运算单元,所述方法包括:
所述计算装置控制所述矩阵运算单元获取第一运算指令,所述第一运算指令用于实现向量与矩阵之间的运算,所述第一运算指令包括执行所述指令所需的向量读取指示,所述所需的向量为至少一个向量,所述至少一个向量为长度相同或长度不同的向量;
所述计算装置控制所述矩阵运算单元依据所述向量读取指示向所述存储介质发送读取命令;
所述计算装置控制所述矩阵运算单元采用批量读取方式从所述存储介质中读取所述向量读取指示所对应的向量,并对所述向量执行所述第一运算指令。
在一些可能的实施例中,所述对所述向量执行所述第一运算指令包括:
所述计算装置控制所述矩阵运算单元采用多级流水级的计算方式,对所述向量执行所述第一运算指令。
在一些可能的实施例中,所述多级流水级中每个流水级中包括有预先设置的固定运算器,每个流水级中的固定运算器不相同;
所述计算装置控制所述矩阵运算单元采用多级流水级的计算方式,对所述向量执行所述第一运算指令包括:
所述计算装置控制所述矩阵运算单元根据所述第一运算指令对应的计算网络拓扑,利用第K1级流水级中的选择运算器对所述向量进行计算得到第一结果,再将所述第一结果输入到第K2级流水级中的选择运算器执行计算得到第二结果,以此类推,直至将第i-1个结果输入到第Kj级流水级中的选择运算器执行计算得到第i个结果;将所述第i个结果输入至所述存储介质进行存储;
其中,Kj属于i个流水级中的任一流水级,j小于等于i,且j和i均为正整数,所述多级流水级的数量i、所述多级流水级被选择的执行顺序Kj以及所述第 Kj级流水级中的选择运算器均是根据所述第一运算指令的计算拓扑结构确定的,所述选择运算器是所述固定运算器中的运算器。
在一些可能的实施例中,所述多级流水级中的每个流水级所包括的固定运算器以及所述固定运算器的数量是由用户侧或所述计算装置侧自定义设置的。
在一些可能的实施例中,所述多级流水级中每个流水级中的运算器包括以下中的任一项或多项的组合:矩阵加法运算器、矩阵乘法运算器、矩阵向量乘法运算器、非线性运算器以及矩阵比较运算器。
在一些可能的实施例中,所述第一运算指令包括以下中的任一项:向量求导指令VDIER、向量生成对角阵指令VDIAG、向量乘转置矩阵指令VMULT。
在一些可能的实施例中,所述第一运算指令的指令格式包括操作码和至少一个操作域,操作码用于指示该运算指令的功能,运算单元通过识别该操作码可进行不同的向量运算,操作域用于指示该运算指令的数据信息,其中,数据信息可以是立即数或寄存器号,例如,要获取一个向量时,根据寄存器号可以在相应的寄存器中获取向量起始地址和向量长度,再根据向量起始地址和向量长度在存储介质中获取相应地址存放的向量。可选地,可在相应寄存器中获取以下中信息中的任一项或多项的组合:所述指令所需向量的行数、列数、数据类型、标识、存储地址(首地址)以及维数长度,所述维数长度是指向量行的长度和/或向量列的长度。
在一些可能的实施例中,所述多级流水级为三级流水级,第一级流水级中包括预先设置的矩阵乘法运算器,第二级流水级中包括预先设置的矩阵加法运算器和矩阵比较运算器,第三级流水级中包括预先设置的非线性运算器和矩阵向量乘法运算器;所述第一运算指令为二维向量旋转指令SVRO或三维向量旋转指令TVRO,
所述计算装置控制所述矩阵运算单元采用多级流水级的计算方式,对所述向量执行所述第一运算指令包括:
所述计算装置控制所述矩阵运算单元将所述向量输入至第三级流水级中的非线性运算器进行向量补1运算得到第一结果,同时将获取的旋转中心和旋转角度输入至第三级流水级中的非线性运算器中执行旋转矩阵构建运算得到第二结果,将所述第一结果和所述第二结果输入至第三级流水级中的矩阵向量乘法运算器中执行矩阵乘向量计算得到第三结果;将所述第三结果输入至所述存储介质进行存储。
在一些可能的实施例中,所述多级流水级为三级流水级,第一级流水级中包括预先设置的矩阵乘法运算器,第二级流水级中包括预先设置的矩阵加法运算器和矩阵比较运算器,第三级流水级中包括预先设置的非线性运算器和矩阵向量乘法运算器;所述第一运算指令为以下指令中的任一项:向量平移指令 VTRAN、向量缩放指令VZOOM、向量剪切指令VSHEAR,
所述计算装置控制所述矩阵运算单元采用多级流水级的计算方式,对所述向量执行所述第一运算指令包括:
所述计算装置控制所述矩阵运算单元将所述向量输入至第三级流水级中的非线性运算器进行向量补1运算得到第一结果,将获取的参数因子输入至第三级流水级中的非线性运算器对应进行以下操作中的任一项得到第二结果:根据获取的平移因子执行平移矩阵构建运算、根据获取的缩放因子执行缩放矩阵构建运算、根据获取的剪切因子执行剪切矩阵构建运算,将所述第一结果和所述第二结果输入至第三级流水级中的矩阵向量乘法运算器中执行矩阵乘向量计算得到第三结果;将所述第三结果输入至所述存储介质进行存储。
在一些可能的实施例中,所述向量读取指示包括:所述指令所需的向量的存储地址或所述指令所需向量的标识。
在一些可能的实施例中,当所述向量读取指示为所述指令所需向量的标识时,
所述计算装置控制所述矩阵运算单元依据所述向量读取指示向所述存储介质发送读取命令包括:
所述计算装置控制所述矩阵运算单元依据所述标识从所述寄存器单元中采用单位读取方式读取所述标识对应的存储地址;
所述计算装置控制所述矩阵运算单元向所述存储介质发送读取所述存储地址的读取命令并采用批量读取方式获取所述向量。
在一些可能的实施例中,所述计算装置还包括:缓存单元,所述方法还包括:
所述计算装置将待执行的运算指令缓存于所述缓存单元内。
在一些可能的实施例中,在所述计算装置控制所述矩阵运算单元获取第一运算指令之前,所述方法还包括:
所述计算装置确定所述第一运算指令与所述第一运算指令之前的第二运算指令是否存在关联关系,如果所述第一运算指令与所述第二运算指令存在关联关系,则将所述第一运算指令缓存于所述缓存单元内,在所述第二运算指令执行完毕后,从所述缓存单元提取所述第一运算指令传输至所述运算单元;
所述确定该第一运算指令与第一运算指令之前的第二运算指令是否存在关联关系包括:
依据所述第一运算指令提取所述第一运算指令中所需向量的第一存储地址区间,依据所述第二运算指令提取所述第二运算指令中所需向量的第二存储地址区间,如果所述第一存储地址区间与所述第二存储地址区间具有重叠的区域,则确定所述第一运算指令与所述第二运算指令具有关联关系,如果所述第一存储地址区间与所述第二存储地址区间不具有重叠的区域,则确定所述第一运算指令与所述第二运算指令不具有关联关系。
第二方面,提供一种计算装置,所述计算装置包括用于执行上述第一方面的方法的功能单元。
第三方面,提供一种计算机可读存储介质,其存储用于电子数据交换的计算机程序,其中,所述计算机程序使得计算机执行第一方面提供的方法。
第四方面,提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序可操作来使计算机执行第一方面提供的方法。
第五方面,提供了一种芯片,所述芯片包括如上第二方面提供的计算装置。
第六方面,提供了一种芯片封装结构,所述芯片封装结构包括如上第五方面提供的芯片。
第七方面,提供了一种板卡,所述板卡包括如上第六方面提供的芯片封装结构。
第八方面,提供了一种电子设备,所述电子设备包括如上第七方面提供的板卡。
在一些实施例中,所述电子设备包括数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、手机、行车记录仪、导航仪、传感器、摄像头、服务器、云端服务器、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、交通工具、家用电器、和/或医疗设备。
在一些实施例中,所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、B超仪和/或心电图仪。
实施本申请实施例,具有如下有益效果:
可以看出,通过本申请实施例,计算装置设置有寄存器单元和存储介质,分别用于存储标量数据以及向量数据,并且本申请为两种存储器分配了单位读取方式以及批量读取方式,通过对向量数据的特点分配匹配其特征的数据读取方式,能够很好的利用带宽,避免因为带宽的瓶颈对向量计算速度的影响,另外,对于寄存器单元来说,由于其存储的为标量数据,设置了标量数据的读取方式,提高了带宽的利用率,所以本申请提供的技术方案能够很好的利用带宽,避免带宽对计算速度的影响,所以其具有计算速度快,效率高的优点。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种计算装置的结构示意图。
图2是本申请实施例提供的一种运算单元的结构示意图。
图3是本发明实施例提供的一种计算方法的流程示意图。
图4是本申请实施例提供的一种流水级的架构示意图。
图5是本申请实施例提供的流水级的结构示意图。
图6A和图6B是本申请实施例提供的两种指令集的格式示意图。
图7是本申请实施例提供的另一种计算装置的结构示意图。
图8是本申请实施例提供的计算装置执行二维/三维向量旋转指令的流程图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及所述附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
需要说明的是,本申请涉及的矩阵具体可以为m*n矩阵,其中,m和N为大于等于1的整数,当m或n为1时,可表示为1*n矩阵或m*1矩阵,也可以称为向量;当m和n同时为1时,可以视为1*1的特殊矩阵。下述矩阵均可以为上述三种类型矩阵中的任意一种,下面不在赘述。
本申请实施例提供一种计算方法,该计算方法可应用于计算装置中。如图1,是本发明实施例示出的一种可能的计算装置的结构示意图。如图1所示的计算装置包括:
存储介质201、用于存储矩阵(也可为向量)。优选的该存储介质可以是高速暂存存储器,能够支持不同长度的矩阵数据(也可为向量数据);本申请将必要的计算数据暂存在高速暂存存储器上(Scratchpad Memory),使本运算装置在进行矩阵运算过程中可以更加灵活有效地支持不同长度的数据。上述存储介质还可以为片外数据库、数据库或其他的能够存储的介质等等。
寄存器单元202,用于存储标量数据,其中,该标量数据包括但不限于:矩阵数据或向量数据(本申请也称为矩阵/向量)在存储介质201的存储地址以及向量与矩阵运算时的标量。在一种实施方式中,寄存器单元可以是标量寄存器堆,提供运算过程中所需的标量寄存器,标量寄存器不只存放矩阵地址,还存放有标量数据。应理解的,矩阵地址(即矩阵的存储地址,如首地址)也为标量。当涉及到矩阵与向量的运算时,运算单元不仅要从寄存器单元中获取矩阵地址,还要从寄存器单元中获取相应的标量,例如矩阵的行数、列数、矩阵数据的类型(也可称为数据类型)、矩阵维数长度(具体可为矩阵行的长度、矩阵列的长度等)。
运算单元203(本申请也称为矩阵运算单元203),用于获取并执行第一运算指令。如图2所示,该运算单元包括多个运算器,该运算器包括但不限于:矩阵加法运算器2031、矩阵乘法运算器2032、大小比较运算器2033(也可为矩阵比较运算器)、非线性运算器2034和矩阵向量乘法运算器2035。
该方法如图3所示,包括如下步骤:
步骤S301、运算单元203获取第一运算指令,所述第一运算指令用于实现向量与矩阵的运算,所述第一运算指令包括:执行该指令所需的向量读取指示。
在步骤S301中,上述执行该指令所需的向量读取指示具体可以为多种,例如,在本申请一个可选的技术方案中,上述执行该指令所需的向量读取指示可以为所需向量的存储地址。又如,在本申请另一个可选的技术方案中,上述执行该指令所需的向量读取指示可以为所需向量的标识,该标识的表现形式可以为多种,例如,向量的名称,又如,向量的识别号,再如该向量在寄存器单元的寄存器号或存储地址。
下面通过一个实际的例子来说明上述第一运算指令包含的执行该指令所需的向量读取指示,这里假设该向量运算公式为f(x)=A+B,其中,A、B均为向量。那么在第一运算指令中除了携带该向量运算公式外,还可以携带该向量运算公式所需向量的存储地址,具体的,例如A的存储地址为0000-0FFF,B的存储地址为1000-1FFF。又如,可以携带A以及B的标识,例如A的标识为0101,B 的标识为1010。
步骤S302、运算单元203依据该向量读取指示向所述存储介质201发送读取命令。
上述步骤S302的实现方法具体可以为:
如该向量读取指示可以为所需向量的存储地址,运算单元203向该存储介质201发送该读取该存储地址的读取命令并采用批量读取方式获取对应的向量。
又如该向量读取指示可以为所需向量的标识时,运算单元203依据该标识从寄存器单元处采用单位读取方式读取该标识对应的存储地址,然后运算单元 203向该存储介质201发送该读取该存储地址的读取命令并采用批量读取方式获取对应的向量。
上述单个读取方式具体可以为,每次读取均为单位的数据,即1bit数据。此时设置单位读取方式即1位读取方式的原因为,对于标量数据来说,其占用的容量非常小,如果采用批量数据读取方式,那么读取的数据量容易大于所需的数据的容量,这样会导致带宽的浪费,所以对于标量的数据这里采用单位读取方式来读取以减少带宽的浪费。
步骤S303、运算单元203采用批量读取方式读取该指示对应的向量,对该向量执行所述第一运算指令。
上述步骤S303中批量读取方式具体可以为,每次读取均为多位的数据,例如每次读取的数据位数为16bit、32bit或64bit,即无论其所需的数据量是多少,其每次读取的均为固定多位数的数据,此批量读取的数据方式非常适合大数据的读取,对于向量来说,由于其所占用的容量大,如果采用单个读取方式,其读取的速度会非常慢,所以这里采用批量读取方式来获取多位的数据从而快速读取向量数据,避免因为读取向量数据过慢影响向量计算速度的问题。
本申请提供的技术方案的计算装置设置有寄存器单元和存储介质,其分别存储标量数据以及向量数据,并且本申请为两种存储器分配了单位读取方式以及批量读取方式,通过对向量数据的特点分配匹配其特征的数据读取方式,能够很好的利用带宽,避免因为带宽的瓶颈对向量计算速度的影响,另外,对于寄存器单元来说,由于其存储的为标量数据,设置了标量数据的读取方式,提高了带宽的利用率,所以本申请提供的技术方案能够很好的利用带宽,避免带宽对计算速度的影响,所以其具有计算速度快,效率高的优点。
可选的,上述对该向量执行所述第一运算指令具体可以为:
运算单元203可采用多级流水级的计算方式来实现,其中,该多级流水级可为用户侧或所述计算装置侧预先自定义设置的,即是固定设计好的。例如本申请所述计算装置中设计有i级流水级。以下为具体实施方式:
运算单元可根据所述第一运算指令对应的计算网络拓扑,选择利用第K1级流水级中的选择运算器对所述向量执行计算得到第一结果,然后再选择利用第 K2级流水级中的选择运算器对所述第一结果执行计算得到第二结果,以此类推,选择第Kj级流水级中的选择运算器对第i-1个结果执行计算得到第i个结果,直至完成所述第一运算指令的运算。这里第i个结果即为输出结果(具体为输出矩阵)。进一步地,运算单元203可将该输出结果存储至存储介质201。
其中,所述多级流水级的数量i、所述多级流水级的执行顺序(即选择Kj级流水级)以及所述第Kj级流水级中的选择运算器都具体是根据所述第一运算指令的计算拓扑结构确定的,i为正整数。通常,i=3。每个流水级中可设置有相应地的运算器,该运算器包括但不限于以下中的任一项或多项的组合:矩阵加法运算器、矩阵乘法运算器、矩阵向量乘法运算器、非线性运算器、矩阵比较运算器以及其他矩阵运算器。即是,每个流水级中所包含的固定运算器以及固定运算器的数量可以是有用户侧或所述计算装置侧自定义设置的,不做限定。
应理解的,本申请中上述计算装置中,每次选择执行的第K1、K2…Kj级流水级以及流水级中的选择运算器都可被重复选择,即是不限定每个流水级的执行次数。后文将以所述第一运算指令为向量求导为例,进行详述。
具体实现中,如图4示出一种流水级的架构示意图。如图4,i级流水级之间可存在全连接的旁路设计(即图示的旁路电路),用于根据第一运算指令对应的计算网络拓扑,选择当前所需使用的流水级以及该流水级中某个运算器(即本申请中的选择运算器)。可选地,还用于多个流水级之间的数据传输,例如将第三级流水级的输出结果转发至第一级流水级作为输入,原始输入可以作为三级流水级的任意一级的输入,任意一级的输出可以作为运算单元的最终输出等。
以i=3,三级流水为例,运算单元可通过旁路电路,分别选择流水级的执行顺序以及流水级中各自所需使用的运算器(也可称为运算部件)。如图5示出一种流水级的操作流程示意图。相应地,运算单元对该向量执行第一流水级的计算得到第一结果,(可选的)将第一结果输入到第二流水级执行第二流水级的计算得到第二结果,(可选的)将第二结果输入到第三流水级执行第三流水级计算得到第三结果,(可选的)将第三结果存储至存储介质201。
上述第一流水级包括但不限于:矩阵乘法运算器等等。
上述第二流水级包括但不限于:矩阵加法运算器、大小比较运算器等等。
上述第三流水级包括但不限于:非线性运算器、矩阵标量乘法运算器、矩阵向量乘法运算器等等。
将向量分三个流水级运算主要是为了提高运算的速度,对于向量的计算来说,例如采用通用处理器在计算时,其运算的步骤具体可以为,处理器对向量进行计算得到第一结果,然后将第一结果存储在内存中,处理器从内存读取第一结果执行第二次计算得到第二结果,然后将第二结果存储在内存中,处理器从内从读取第二结果执行第三次计算得到第三结果,然后将第三结果存储在内存中。从上述计算的步骤可以看出,在通用处理器进行向量计算时,其并没有分流水级进行计算,那么每次计算完毕后均需要将计算完的数据进行保存,下次计算时需要再次读取,所以此方案需要重复存储读取多次数据,对于本申请的技术方案来说,第一流水级计算的第一结果直接进入第二流水级进行计算,第二流水级计算的第二结果直接进入到第三流水级进行计算,第一流水级与第二流水级计算的第一结果和第二结果无需存储,首先其减少了内存的占用空间,其次,其避免了结果的多次存储以及读取,提高了带宽的利用率,进一步提高了计算效率。
在本申请另一实施例中,可以自由组合各流水部件或者采取一级流水级。例如将第二个流水级和第三个流水级合并,或者将第一和第二以及第三个流水线都合并或者各个流水级负责不同的运算可以排列组合。例如,第一级流水负责比较运算,部分乘法运算,第二级流水负责非线性运算和矩阵标量乘法等组合。即是,本申请中设计的i个流水级支持任意多个流水级并联、串联以及合并,以构成不同的排列组合,本申请不做限定。
需要说明的是,上述计算装置中每个流水级中的运算器是预先自定义设置好的,一旦确定不容更改;即i级流水级可设计为任意运算器的排列组合,i级流水级一经驱动不再更改,不同的运算指令可设计不同的i级流水级装置。其中,该计算装置可根据具体指令的需求,适应性增加/较少流水级的数量。最后,可将为不同指令设计的流水级装置组合在一起,形成所述计算装置。
采用上述计算装置(即每级流水级中的运算器/运算部件设计固定),具有以下以下有益效果:除提高带宽外,无额外的选择信号判断开销,不同流水级之间无相同的运算部件重叠和冗余,复用性高,面积小。
可选的,上述计算装置还可以包括:缓存单元204,用于缓存第一运算指令。指令在执行过程中,同时也被缓存在指令缓存单元中,当一条指令执行完之后,如果该指令同时也是指令缓存单元中未被提交指令中最早的一条指令,该指令将背提交,一旦提交,该条指令进行的操作对装置状态的改变将无法撤销。在一种实施方式中,指令缓存单元可以是重排序缓存。
可选的,上述方法在步骤S301之前还可以包括:
确定该第一运算指令与第一运算指令之前的第二运算指令是否存在关联关系,如第一运算指令与第一运算指令之前的第二运算指令存在关联关系,则在第二运算指令执行完毕以后,从缓存单元中提取出该第一运算指令传递至运算单元203。如第一运算指令与该第一运算指令之前的指令无关联关系,则直接将第一运算指令传递至运算单元。
上述确定该第一运算指令与第一运算指令之前的第二运算指令是否存在关联关系的具体实现方法可以为:
依据该第一运算指令提取该第一运算指令中所需向量的第一存储地址区间,依据该第二运算指令提取该第二运算指令中所需向量的第二存储地址区间,如第一存储地址区间与第二存储地址区间具有重叠的区域,则确定第一运算指令与第二运算指令具有关联关系。如第一存储地址区间与第二存储地址区间无重叠的区域,则确定第一运算指令与第二运算指令不具有关联关系。
此存储地区区间中有重叠区域出现说明第一运算指令与第二运算指令访问了相同的向量,对于向量来说,由于其存储的空间比较大,比如采用相同的存储区域作为判断是否为关联关系的条件,可能出现的情况是,第二运算指令访问的存储区域包含了第一运算指令访问的存储区域,例如,第二运算指令访问A 向量存储区域、B向量存储区域和C向量存储区域,如果A、B存储区域相邻或A、C存储区域相邻,则第二运算指令访问的存储区域为,A、B存储区域以及C存储区域,或A、C存储区域以及B存储区域。这种情况下,如果第一运算指令访问的为A向量与D向量的存储区域,那么第一运算指令访问的向量的存储区域无法与第二运算指令范文的向量的存储区域相同,如果采用相同的判断条件,则确定第一运算指令与第二运算指令不关联,但是实践证明,此时第一运算指令与第二运算指令属于关联关系,所以本申请通过是否有重叠区域来判断是否为关联关系的条件,能够避免上述情况的误判。
下面以一个实际的例子来说明何种情况属于关联关系,何种情况属于非关联关系。这里假设第一运算指令所需的向量为A向量和D向量,其中A向量的存储区域为【0001,0FFF】,D向量的存储区域为【A000,AFFF】,对于第二运算指令所需的向量为A向量、B向量和C向量,其分别对应的存储区域为【0001, 0FFF】、【1000,1FFF】、【B000,BFFF】,对于第一运算指令来说,其对应的存储区域为:【0001,0FFF】、【A000,AFFF】,对于第二运算指令来说,其对应的存储区域为:【0001,1FFF】、【B000,BFFF】,所以第二运算指令的存储区域与第一运算指令的存储区域具有重叠区域【0001,0FFF】,所以第一运算指令与第二运算指令具有关联关系。
这里假设第一运算指令所需的向量为E向量和D向量,其中A向量的存储区域为【C000,CFFF】,D向量的存储区域为【A000,AFFF】,对于第二运算指令所需的向量为A向量、B向量和C向量,其分别对应的存储区域为【0001, 0FFF】、【1000,1FFF】、【B000,BFFF】,对于第一运算指令来说,其对应的存储区域为:【C000,CFFF】、【A000,AFFF】,对于第二运算指令来说,其对应的存储区域为:【0001,1FFF】、【B000,BFFF】,所以第二运算指令的存储区域与第一运算指令的存储区域不具有重叠区域,所以第一运算指令与第二运算指令无关联关系。
本申请中,如图6A是本申请提供的一种指令(具体可为第一运算指令,也可为操作指令)的指令集的格式示意图,如图6A所示,运算指令包括一操作码和至少一操作域,其中,操作码用于指示该运算指令的功能,运算单元通过识别该操作码可进行不同的向量运算,操作域用于指示该运算指令的数据信息,其中,数据信息可以是立即数或寄存器号,例如,要获取一个向量时,根据寄存器号可以在相应的寄存器中获取向量起始地址和向量长度,再根据向量起始地址和向量长度在存储介质中获取相应地址存放的向量。
即第一运算指令可以包括:操作域以及至少一个操作码,以向量运算指令为例,如表1所示,其中,寄存器0、寄存器1、寄存器堆2、寄存器3、寄存器4可以为操作域。其中,每个寄存器0、寄存器1、寄存器2、寄存器3、寄存器4用于标识寄存器的编号,其可以是一个或者多个寄存器。应理解的,操作码中寄存器的数量并不做限定,每个寄存器均用于存储运算指令的相关数据信息。
如图6B是本申请提供的另一种指令(可为第一运算指令,也可称为操作指令)的指令集的格式示意图,如图6B所示,指令包括至少两个操作码和至少一操作域,其中,所述至少两个操作码包括第一操作码和第二操作码(图示分别为操作码1和操作码2)。所述操作码1用于指示指令的类型(即某大类指令),例如可具体可为IO指令、逻辑指令或者运算指令等等,所述操作码2用于指示指令的功能(即大类指令下的具体指令的解释),例如运算指令中的矩阵运算指令(如矩阵乘向量指令MMUL、矩阵求逆指令MINV等)、向量运算指令(如向量求导指令VDIER等)等等,本申请不做限定。
应理解的,指令的格式可以是用户侧或所述计算装置侧自定义设置的。指令的操作码可设计为固定长度,例如8bit、16bit等等。如图6A示出的指令格式具有以下优势特征:操作码占用位数少、译码系统设计简单。如图6B示出的指令格式具有以下优势特征:可变长、译码平均效率更高,当某大类指令下具体指令较少且调用频次高的情况下,设计其第二操作码(即操作码2)的长度短小,可提高译码效率。此外,还能增强指令的可读性和可扩展性,优化指令的编码结构。
本申请实施例中,指令集包含有不同功能的运算指令,具体可为:
二维向量旋转指令(SVRO),根据该指令,装置从存储器(优选的高速暂存存储器或者标量寄存器堆)的指定地址取出制定大小的向量数据并改成增广形式,从标量寄存器堆取出指定的旋转中心坐标数据和旋转角度数据,生成旋转矩阵,在运算单元中进行矩阵乘向量的乘法运算,并将计算结果写回至存储器(优选的高速暂存存储器或者标量寄存器堆)的指定地址。值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。这里的存储器可以包括但不仅限于高速暂存存储器,下同。
三维向量旋转指令(TVRO),根据该指令,装置从存储器(优选的高速暂存存储器或者标量寄存器堆)的指定地址取出制定大小的向量数据并改成增广形式,从标量寄存器堆取出指定的旋转轴数据和旋转角度数据,生成旋转矩阵,在矩阵运算单元中进行矩阵乘向量的乘法运算,并将计算结果写回至存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。
向量平移指令(VTRAN)根据该指令,装置从存储器的指定地址取出制定大小的向量数据并改成增广形式,从标量寄存器堆取出指定的各平移方向的数据生成平移矩阵,在矩阵运算单元中进行矩阵乘向量的乘法运算,并将计算结果从增广形式恢复原有维度写回至存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。
向量缩放指令(VZOOM)根据该指令,装置从存储器的指定地址取出制定大小的向量数据并改成增广形式,从标量寄存器堆取出指定的缩放幅度数据,生成剪切矩阵,在矩阵运算单元中进行矩阵乘向量的乘法运算,并将计算结果写回至存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵(只有一行元素的矩阵)存储于高速暂存存储器中。
向量剪切指令(VSHEAR)根据该指令,装置从存储器的指定地址取出制定大小的向量数据并改成增广形式,从标量寄存器堆取出指定的各方向幅度数据,生成剪切矩阵,在矩阵运算单元中进行矩阵乘向量的乘法运算,并将计算结果写回至存储器的指定地址;值得说明的是,向量可以作为特殊形式的矩阵 (只有一行元素的矩阵)存储于高速暂存存储器中。
应理解的,本申请提出的操作/运算指令主要用于输入向量形式和输出向量形式的运算操作,并不限定运算过程所产生的中间数据的形式。本申请中每级流水级中设计的运算器包含但不限于以下中的任一项或多项的组合:矩阵加法运算器、矩阵乘法运算器、矩阵向量乘法运算器、非线性运算器、矩阵比较运算器。
下面举例说明本申请涉及的运算指令(即第一运算指令)的计算。
以所述第一运算指令为二维向量旋转指令SVRO为例,计算给定旋转中心的二维向量。具体实现时,给定二维向量X(x,y)、旋转中心(a,b)以及旋转角度c,按照如下公式计算给定向量X的旋转向量。
相应地,二维向量旋转指令SVRO的指令格式具体为:
结合前述实施例,运算单元可获取二维向量旋转指令SVRO,并对其译码后,从寄存器单元中读取向量X、旋转中心以及旋转角度,通过旁路电路选择利用第三流水级中的非线性运算器对向量X进行补1操作得到第一结果(具体可为补1操作后形成的待旋转向量);然后通过旁路电路选择利用第三流水级的非线性运算器根据读取的旋转中心和旋转角度执行旋转矩阵构建运算(可选的,还涉及矩阵元素的搬移操作)以对应得到第二结果(具体可为旋转矩阵);然后,通过旁路电路选择将所述第一结果和所述第二结果输入至第三流水级中的矩阵向量乘法运算器执行矩阵乘向量运算(具体为对待旋转向量和旋转矩阵执行矩阵乘向量运算)得到第三结果(即输出结果)。可选地,将该第三结果存储至存储介质中。
以所述第一运算指令为三维向量旋转指令TVRO为例,进行三维空间内的旋转。具体实现时,给定一个三维向量X(x,y,z)、旋转中心(u,v,w)和旋转角度c,按照如下公式计算旋转后的三维向量。
相应地,三维向量旋转指令TVRO的指令格式具体为:
结合前述实施例,运算单元可获取三维向量旋转指令TVRO,并对其译码后,从寄存器单元中读取向量X、旋转中心以及旋转角度,通过旁路电路选择利用第三流水级中的非线性运算器对向量X进行补1操作得到第一结果(具体可为补1操作后形成的待旋转向量);同时通过旁路电路选择利用第三流水级中的非线性运算器根据读取的旋转中心和旋转角度执行旋转矩阵构建运算(可选的,还涉及矩阵元素的搬移操作)以对应得到第二结果(具体可为旋转矩阵);然后通过旁路电路选择将所述第一结果和所述第二结果输入至第三流水级中的矩阵向量乘法运算器执行矩阵乘向量运算(具体为对待旋转向量和旋转矩阵执行矩阵乘向量运算)得到第三结果(即输出结果)。可选地,将该第三结果存储至存储介质中。
以所述第一运算指令为向量平移指令VTRAN为例,计算给定向量的平移向量。具体实现时,给定向量X(x1,x2,x3,..xn)以及平移向量Y(dx1,dx2,…dxn) (也可称为平移因子),按照如下公式计算给定向量X的平移后的向量。
相应地,向量平移指令VTRAN的指令格式具体为:
结合前述实施例,运算单元可获取向量平移指令VTRAN,并对其译码后,从寄存器单元中读取向量X和平移向量Y,通过旁路电路选择利用第三流水级中的非线性运算器对向量X进行补1操作得到第一结果(具体可为补1操作后形成的待平移向量);同时通过旁路电路选择利用第三流水级中的非线性运算器根据读取的平移向量Y执行平移矩阵构建运算(可选的,还涉及矩阵元素的搬移操作)以对应得到第二结果(具体可为平移矩阵);然后,通过旁路电路选择将所述第一结果和所述第二结果输入至第三流水级的矩阵向量乘法运算器执行矩阵乘向量运算(具体为对待平移向量和平移矩阵执行矩阵乘向量运算)得到第三结果(即输出结果)。可选地,将该第三结果存储至存储介质中。
以所述第一运算指令为向量缩放指令VZOOM为例,计算给定向量的缩放向量。具体实现时,给定向量X(x1,x2,x3,..xn)以及缩放因子a,按照如下公式计算给定向量X的缩放向量。
相应地,向量缩放指令VZOOM的指令格式具体为:
结合前述实施例,运算单元可获取向量缩放指令VZOOM,并对其译码后,从寄存器单元中读取向量X和缩放因子a,通过旁路电路选择利用第三流水级中的非线性运算器对向量X进行补1操作得到第一结果(具体可为补1操作后形成的待缩放向量);同时利用第二流水级的非线性运算器根据读取的缩放因子a 执行缩放矩阵构建运算(可选的,还涉及矩阵元素的搬移操作)以对应得到第二结果(具体可为缩放矩阵);然后,通过旁路电路将所述第一结果和所述第二结果输入至第三流水级中的矩阵向量乘法运算器执行矩阵乘向量运算(具体为对待缩放向量和缩放矩阵执行矩阵乘向量运算)得到第三结果(即输出结果)。可选地,将该第三结果存储至存储介质中。
以所述第一运算指令为向量剪切指令VSHEAR为例,计算给定矩阵的剪切矩阵。具体实现时,给定向量X(x1,x2,x3,..xn)以及剪切向量Y(d1,d2,…dn)(也可称为剪切因子),按照如下公式计算给定向量X的剪切后的向量。
相应地,向量剪切指令VSHEAR的指令格式具体为:
结合前述实施例,运算单元可获取向量剪切指令VSHEAR,并对其译码后,从寄存器单元中读取向量X和剪切向量Y,通过旁路电路选择利用第一流水级的非线性运算器对向量X进行补1操作得到第一结果(具体可为补1操作后形成的待剪切向量);同时利用第二流水级的多路选择器选取非线性运算器根据读取的剪切向量Y执行剪切矩阵构建运算(可选的,还涉及矩阵元素的搬移操作) 以对应得到第二结果(具体可为剪切矩阵);然后,通过旁路电路将所述第一结果和所述第二结果输入至第三流水级的矩阵向量乘法运算器执行矩阵乘向量运算(具体为对待剪切向量和剪切矩阵执行矩阵乘向量运算)得到第三结果(即输出结果)。可选地,将该第三结果存储至存储介质中。
需要说明的是,上述各种运算指令的获取以及译码将在后文进行详细阐述。应理解的,采用上述计算装置的结构来实现各运算指令(如二维向量旋转指令 SVRO、三维向量旋转指令TVRO等)的计算,可获得如下有益效果:支持按一定间隔存储的向量格式,避免了对向量格式进行变换的执行开销和存储中间结果的空间占用;支持以标量值存储变换信息,避免了旋转矩阵的存储开销。
上述运算指令(即向量运算指令/第一运算指令)中的设定长度可以由用户自行设定,在一个可选的实施方案中,用户可以将该设置长度设置为一个值,当然在实际应用中,用户也可以将该设置长度设置为多个值。本申请具体实施方式并不限定该设定长度的具体值以及个数。为使本申请的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本申请进一步详细说明。
参阅图7,图7为本申请具体实施方式提供的另一种计算装置50。图7所示,计算装置50包括:存储介质501、寄存器单元502(优选的为标量数据存储单元、标量寄存器单元)、运算单元503(也可称矩阵运算单元503)和控制单元504;
存储介质501,用于存储矩阵(也可为向量);
标量数据存储单元502,用于存储标量数据,所述标量数据至少包括:所述向量在所述存储介质内的存储地址;
控制单元504,用于控制所述运算单元获取第一运算指令,所述第一运算指令用于实现向量与矩阵间的运算,所述第一运算指令包括执行所述指令所需的向量读取指示;
运算单元503,用于依据所述向量读取指示向所述存储介质发送读取命令;依据采用批量读取方式读取所述向量读取指示对应的向量,对该向量执行所述第一运算指令。
可选的,上述向量读取指示包括:所述指令所需的向量的存储地址或所述指令所需向量的标识。
可选的如所述向量读取指示为所述指令所需向量的标识时,
控制单元504,用于控制所述运算单元依据所述标识从所述寄存器单元出采用单位读取方式读取所述标识对应的存储地址,控制所述运算单元向所述存储介质发送读取所述存储地址的读取命令并采用批量读取方式获取所述向量。
可选的,运算单元503,具体用于采用多级流水级的计算方式,对所述向量执行所述第一运算指令。
可选的,所述多级流水级中每个流水级中包括有预先设置的固定运算器,每个流水级中的固定运算器不相同;
运算单元503,具体用于根据所述第一运算指令对应的计算网络拓扑,利用第K1级流水级中的选择运算器对所述向量进行计算得到第一结果,再将所述第一结果输入到第K2级流水级中的选择运算器执行计算得到第二结果,以此类推,直至将第i-1个结果输入到第Kj级流水级中的选择运算器执行计算得到第i个结果;将所述第i个结果输入至所述存储介质进行存储;
其中,Kj属于i个流水级中的任一流水级,j小于等于i,且j和i均为正整数,所述多级流水级的数量i、所述多级流水级被选择的执行顺序Kj以及所述第 Kj级流水级中的选择运算器均是根据所述第一运算指令的计算拓扑结构确定的,所述选择运算器是所述固定运算器中的运算器。
可选的,所述多级流水级为三级流水级,第一级流水级中包括预先设置的矩阵乘法运算器,第二级流水级中包括预先设置的矩阵加法运算器和矩阵比较运算器,第三级流水级中包括预先设置的非线性运算器和矩阵向量乘法运算器;所述第一运算指令为二维向量旋转指令SVRO或三维向量旋转指令TVRO,
运算单元503,用于将所述向量输入至第三级流水级中的非线性运算器进行向量补1运算得到第一结果,同时将获取的旋转中心和旋转角度输入至第三级流水级中的非线性运算器中执行旋转矩阵构建运算得到第二结果,将所述第一结果和所述第二结果输入至第三级流水级中的矩阵向量乘法运算器中执行矩阵乘向量计算得到第三结果;将所述第三结果输入至所述存储介质进行存储。
可选的,所述多级流水级为三级流水级,第一级流水级中包括预先设置的矩阵乘法运算器,第二级流水级中包括预先设置的矩阵加法运算器和矩阵比较运算器,第三级流水级中包括预先设置的非线性运算器和矩阵向量乘法运算器;所述第一运算指令为以下指令中的任一项:向量平移指令VTRAN、向量缩放指令VZOOM、向量剪切指令VSHEAR,
运算单元503,用于将所述向量输入至第三级流水级中的非线性运算器进行向量补1运算得到第一结果,将获取的参数因子输入至第三级流水级中的非线性运算器对应进行以下操作中的任一项得到第二结果:根据获取的平移因子执行平移矩阵构建运算、根据获取的缩放因子执行缩放矩阵构建运算、根据获取的剪切因子执行剪切矩阵构建运算,将所述第一结果和所述第二结果输入至第三级流水级中的矩阵向量乘法运算器中执行矩阵乘向量计算得到第三结果;将所述第三结果输入至所述存储介质进行存储。
可选的,所述计算装置还包括:
缓存单元505,用于缓存待执行的运算指令;
所述控制单元504,用于将待执行的运算指令缓存于所述缓存单元504内。
可选的,控制单元504,用于确定所述第一运算指令与所述第一运算指令之前的第二运算指令是否存在关联关系,如所述第一运算指令与所述第二运算指令存在关联关系,则将所述第一运算指令缓存与所述缓存单元内,在所述第二运算指令执行完毕后,从所述缓存单元提取所述第一运算指令传输至所述运算单元;
所述确定该第一运算指令与第一运算指令之前的第二运算指令是否存在关联关系包括:
依据所述第一运算指令提取所述第一运算指令中所需向量的第一存储地址区间,依据所述第二运算指令提取所述第二运算指令中所需向量的第二存储地址区间,如所述第一存储地址区间与所述第二存储地址区间具有重叠的区域,则确定所述第一运算指令与所述第二运算指令具有关联关系,如所述第一存储地址区间与所述第二存储地址区间不具有重叠的区域,则确定所述第一运算指令与所述第二运算指令不具有关联关系。
可选的,上述控制单元503,可以用于从指令缓存单元获取运算指令,并对该运算指令进行处理后,提供给所述运算单元。其中,控制单元503可以划分为三个模块,分别为:取指模块5031、译码模块5032和指令队列模块5033,
取指模块5031,用于从指令缓存单元中获取运算指令;
译码模块5032,用于对获取的运算指令进行译码;
指令队列5033,用于对译码后的运算指令进行顺序存储,考虑到不同指令在包含的寄存器上有可能存在依赖关系,用于缓存译码后的指令,当依赖关系被满足之后发射指令。
参阅图8,图8是本申请实施例提供的计算装置执行运算指令的流程图,如图8所示,该计算装置的硬件结构参阅图7所示的结构,如图7所示的存储介质以高速暂存存储器为例,执行二维/三维向量旋转指令的过程包括:
步骤S601,计算装置控制取指模块取出二维/三维向量旋转指令,并将该二维/三维向量旋转指令送往译码模块。
步骤S602,译码模块对该二维/三维向量旋转指令译码,并将该二维/三维向量旋转指令送往指令队列。
步骤S603,在指令队列中,该二维/三维向量旋转指令需要从标量寄存器堆中获取指令中六个操作域所对应的标量寄存器里的数据,该数据包括输入向量地址、输入向量长度、输入旋转中心向量地址、输入旋转中心标量、输出向量地址、输出向量长度。
步骤S604,控制单元确定所述二维/三维向量旋转指令与二维/三维向量旋转指令之前的运算指令是否存在关联关系,如存在关联关系,将二维/三维向量旋转指令存入到缓存单元,如不存在关联管理,将该二维/三维向量旋转指令传输至运算单元。
步骤S605,运算单元根据六个操作域所对应的标量寄存器里的数据从高速暂存器中取出需要的矩阵数据,然后在运算单元中完成向量旋转运算。
步骤S606,运算单元运算完成后,将结果写入存储器(优选的高速暂存存储器或者标量寄存器堆)的指定地址,重排序缓存中的该二维/三维向量旋转指令被提交。
可选的,上述步骤S605中在运算单元执行向量旋转运算时,所述计算装置可采用非线性运算器执行补1操作以及旋转矩阵构建操作,然后采用矩阵向量乘法运算器执行矩阵乘向量计算得到对应的旋转向量。
具体实现中,当译码模块对该二维/三维向量旋转指令译码后,根据译码所产生的控制信号,利用旁路电路选择将S603所获取的向量输入至第三级流水级中的非线性运算器执行向量补1操作得到第一结果(即待旋转向量);同时利用旁路电路选择将S603所获取的标量数据(具体为旋转中心和旋转角度)输入至第三级流水级中的非线性运算器执行旋转矩阵构建得到第二结果(即旋转矩阵),然后根据控制信号的指示利用旁路电路选择将所述第一结果和所述第二结果输入至第三级流水级中的矩阵向量乘法运算器中执行矩阵乘向量运算得到第三结果。进一步,根据控制信号可获知所述第四结果即为输出结果。相应地,将所述第四结果作为运算单元的输出写回,或直接传输至输出端。
上述图8中的运算指令以二维/三维向量旋转指令为例,在实际应用中,如图8所示实施例中的二维/三维向量旋转指令可以用向量平移指令、向量缩放指令、向量剪切指令等向量运算/操作指令替换,这里不一一赘述。
本申请实施例还提供一种计算机存储介质,其中,该计算机存储介质存储用于电子数据交换的计算机程序,该计算机程序使得计算机执行如上述方法实施例中记载的任意实施部分或全部步骤。
本申请实施例还提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序可操作来使计算机执行如上述方法实施例中记载的任意实施部分或全部步骤。
本申请实施例还提供了一种加速装置,包括:存储器:存储有可执行指令;处理器:用于执行存储单元中的可执行指令,在执行指令时依照上述方法实施例所记载的实施例进行操作。
其中,处理器可以是单个处理单元,但也可以包括两个或更多个处理单元。另外,处理器还可以包括通用处理器(CPU)或者图形处理器(GPU);还可以包括在现场可编程逻辑门阵列(FPGA)或者专用集成电路(ASIC),以对神经网络进行设置和运算。处理器还可以包括用于缓存用途的片上存储器(即包括处理装置中的存储器)。
在一些实施例里,还公开了一种芯片,其包括了上述用于执行上述方法实施例所对应的神经网络处理器。
在一些实施例里,公开了一种芯片封装结构,其包括了上述芯片。
在一些实施例里,公开了一种板卡,其包括了上述芯片封装结构。
在一些实施例里,公开了一种电子设备,其包括了上述板卡。
电子设备包括数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、手机、行车记录仪、导航仪、传感器、摄像头、服务器、云端服务器、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、交通工具、家用电器、和/或医疗设备。
所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、B超仪和/或心电图仪。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
所述集成的单元如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储器包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM, Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储器中,存储器可以包括:闪存盘、只读存储器(英文:Read-Only Memory,简称:ROM)、随机存取器(英文:Random Access Memory,简称:RAM)、磁盘或光盘等。
以上对本申请实施例进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。