一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

运算方法、处理器以及相关产品与流程

2021-10-23 01:26:00 来源:中国专利 TAG:相关产品 运算 处理器 公开信息 方法


1.本公开涉及信息处理技术领域,特别是涉及一种运算方法、处理器以及相关产品。


背景技术:

2.在人工智能技术领域,神经网络算法是最近非常流行的一种机器学习算法,在各种领域中都取得了非常好的效果,比如图像识别,语音识别,自然语言处理等。随着神经网络算法的发展,算法的复杂度也越来越高,为了提高识别度,模型的规模也在逐渐增大。用gpu和cpu处理起这些大规模的模型,要花费大量的计算时间,并且耗电量很大。


技术实现要素:

3.基于此,有必要针对上述技术问题,提供一种运算方法、处理器以及相关产品。
4.根据本公开的第一方面,提供了一种处理器,所述处理器包括两个以上处理元件,所述两个以上处理元件以二维矩阵排列,处理元件包括至少一个寄存器,所述处理器用于对第一矩阵和第二矩阵执行矩阵乘法运算,
5.所述处理器还包括控制器,所述控制器用于将第一矩阵的转置矩阵和第二矩阵的各元素分别加载到各处理元件的寄存器中,所述转置矩阵和所述第二矩阵对应位置的元素存储在同一处理元件的寄存器中;
6.所述控制器用于控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果;
7.所述控制器还用于对所述第一中间结果进行处理得到第一矩阵和第二矩阵的乘积。
8.根据本公开的第二方面,提供了一种基于处理元件矩阵的矩阵乘的运算方法,应用于处理器,所述处理器包括两个以上处理元件,所述两个以上处理元件以二维矩阵排列,处理元件包括至少一个寄存器,所述方法实现对第一矩阵和第二矩阵的矩阵乘法运算,所述方法包括:
9.将第一矩阵进行转置得到转置矩阵,将转置矩阵和第二矩阵的各元素分别加载到各处理元件的寄存器中,转置矩阵和第二矩阵对应位置的元素存储在同一处理元件的寄存器中;
10.控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果;
11.对所述第一中间结果进行处理得到第一矩阵和第二矩阵的乘积。
12.根据本公开的第三方面,提供了一种人工智能芯片,所述芯片包括如上所述的处理器。
13.根据本公开的第四方面,提供了一种电子设备,包括如上所述的人工智能芯片。
14.根据本公开上述各实施方式的矩阵乘的运算方法、处理器等产品,对于满足处理元件的排列的任意规模的输入矩阵,都可以得到矩阵乘法的运算结果,并且相比于相关技术中的矩阵乘运算可以减少访存次数,降低带宽压力,提高运算的效率。
15.根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。
附图说明
16.包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。
17.图1示出根据本公开一实施例的处理器的示意图。
18.图2a和图2b分别示出了多种不同的划分方式的示例。
19.图3示出根据本公开一实施例的运算方法的流程图。
20.图4示出根据本公开一实施例的处理元件组成的阵列的示意图。
21.图5示出根据本公开一实施例的分块的示意图。
22.图6示出根据本公开一实施例的对矩阵划分的示例。
23.图7示出根据本公开实施例的板卡的结构框图。
具体实施方式
24.下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
25.应当理解,本公开的权利要求、说明书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。本公开的说明书和权利要求书中使用的术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
26.还应当理解,在此本公开说明书中所使用的术语仅仅是出于描述特定实施例的目的,而并不意在限定本公开。如在本公开说明书和权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。还应当进一步理解,在本公开说明书和权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
27.如在本说明书和权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
[0028]
在利用人工智能对信息进行处理的过程中,矩阵运算占用比较大的计算量,并且现有的处理器在处理矩阵运算的过程中把矩阵运算拆解成乘法运算和加法运算,需要频繁的从内存中读取数据,运算的效率很低。
[0029]
为了解决上述技术问题,本公开提供了一种运算方法以及执行该运算方法的处理
器。处理器可以包括多个处理元件(两个以上),这些处理元件可以以二维矩阵的形式排列,每个处理元件可以包括至少一个寄存器。
[0030]
图1示出根据本公开一实施例的处理器的示意图。如图1所示,多个处理元件pe(processing element)以二维矩阵的形式排列,每个处理元件与相邻的处理元件之间连接,每个pe中可以设置有至少一个寄存器(register)(图中未示出)。处理器还可以包括控制器和存储器,其中,控制器和存储器都与多个处理元件连接,且控制器可以连接存储器。所述控制器用于从存储器中加载输入数据到处理元件的寄存器中,并控制处理元件对输入数据进行处理,比如说,存储器中可以存储有第一矩阵和第二矩阵,处理器用于对第一矩阵和第二矩阵执行矩阵乘法运算,因此,控制器可以将第一矩阵和第二矩阵加载到处理元件的寄存器中,并控制处理元件执行矩阵乘法运算。
[0031]
在一种可能的实现方式中,存储器中还可以存储有可执行程序,可执行程序中可以包括指令,执行指令可以实现对第一矩阵和第二矩阵的矩阵乘法运算。控制器中可以设置有加载器、译码器等,其中,加载器可以用于将存储器中的输入数据加载到处理元件的寄存器中,译码器可以根据加载后输入数据的存储地址对可执行程序中访问数据的指令进行译码,比如说,对于访问数据的指令,通过译码获得数据在寄存器中存储的地址赋值给访问数据的指令,并将译码后的指令发送给处理元件,由处理元件执行指令,从而实现对数据的处理,比如说实现对第一矩阵和第二矩阵的矩阵乘法运算。
[0032]
在一种可能的实现方式中,存储器可以为片上缓存,控制器可以将片外闪存上的可执行程序以及输入数据(例如,输入矩阵,包括左乘矩阵和右乘矩阵)加载到上述存储器(片上缓存)中,再进行之后的矩阵乘法运算的过程。
[0033]
在一种可能的实现方式中,控制器也可以直接从片外内存上加载输入矩阵以及可执行程序到处理元件的寄存器中,本公开对此不作限定。
[0034]
pe中还可以包括运算器以完成指定的运算,以矩阵运算为例,pe中可以包括例如乘法器、加法器等,各个pe中的具体结构可以相同,也可以存在不同,本公开对此不作限定。pe中还可以包括其他类型的运算器,以适应各种不同的运算过程,本公开对pe包括的运算器的数量和类型不作限定。
[0035]
矩阵乘法运算的输入矩阵可以包括左乘矩阵和右乘矩阵,其中,左乘矩阵可以是指位于乘号左边的矩阵,右乘矩阵可以是指位于乘号右边的矩阵。
[0036]
由于处理器中pe的数量以及排列方式是固定的,因此,在向处理元件中的寄存器中加载数据并计算之前,控制器可以根据处理元件的排列以及输入矩阵的行秩以及列秩确定是否对输入矩阵进行分块。处理元件的排列可以是指处理元件的行数和列数,输入矩阵的行秩、列秩可以是指左乘矩阵以及右乘矩阵的行数和列数。
[0037]
控制器根据处理元件的排列以及输入矩阵的行秩以及列秩确定是否对输入矩阵进行分块可以是指:控制器判断输入矩阵或者输入矩阵的转置的行数是否大于处理元件的行数、列数是否大于处理元件的列数,根据判断的结果确定是否对输入矩阵进行分块。
[0038]
如果输入矩阵中的一个矩阵的行数不大于处理元件的行数、且列数不大于处理元件的列数,而且,输入矩阵中的另一个矩阵的转置的行数不大于处理元件的行数、且列数不大于处理元件的列数,则可以不对输入矩阵进行分块。
[0039]
如果输入矩阵中的任意一个矩阵的行数大于处理元件的行数、或者列数大于处理
元件的列数,或者,输入矩阵中的任意一个矩阵的转置的行数大于处理元件的行数、或者列数大于处理元件的列数,则控制器可以对输入矩阵进行分块。
[0040]
举例来说,假设处理元件组成的阵列可以表示为pe
mn
,表示处理元件组成一个m
×
n的矩阵,m表示矩阵的行数,n表示矩阵的列数,假设一个输入矩阵为a
mn
,表示m
×
n的矩阵,m代表矩阵的行数,n代表矩阵的列数,另一个输入矩阵为b
nk
,表示n
×
k的矩阵,n代表矩阵的行数,k代表矩阵的列数。如果矩阵a
mn
的行数m不大于处理元件的行数m、且列数n不大于处理元件的列数n,而且,b
nk
的转置矩阵的行数k不大于处理元件的行数m、且列数n不大于处理元件的列数n,则可以不对输入矩阵进行分块。或者说,如果a
mn
的转置矩阵的行数n不大于处理元件的行数m、且列数m不大于处理元件的列数n,而且,b
nk
的行数n不大于处理元件的行数m、且列数k不大于处理元件的列数n,则可以不对输入矩阵进行分块。
[0041]
如果矩阵a
mn
的行数m大于处理元件的行数m、或者列数n大于处理元件的列数n,或者矩阵b
nk
的转置的行数k大于处理元件的行数m、或列数n大于处理元件的列数n,则可以对输入矩阵进行分分块;或者,如果的行数n大于处理元件的行数m、或列数m大于处理元件的列数n,或者,b
nk
的行数n大于处理元件的行数m、或列数k大于处理元件的列数n,则可以对输入矩阵进行分块。
[0042]
若要对输入矩阵中的一个矩阵进行分块,控制器可以根据处理元件的排列对左乘矩阵的行进行拆分或者对右乘矩阵的列进行拆分。
[0043]
举例来说,假设处理元件组成的阵列为pe
22
,左乘矩阵为a
32
,右乘矩阵为b
22
,那么可以将a
32
拆分为a
12
、a
22
分别与b
22
相乘。若左乘矩阵为a
22
、右乘矩阵为b
32
,那么可以将b
32
拆分为b
12
、b
22

[0044]
若要对输入矩阵中的两个矩阵都进行分块,控制器可以根据处理元件的排列以及输入矩阵的行秩和列秩对左乘矩阵列方向和右乘矩阵行方向以相同的方式进行分块。
[0045]
也就是说,可以对左乘矩阵和转置后的右乘矩阵在列方向上以相同的方式进行分块,或者将转置后的左乘矩阵和右乘矩阵在行方向上以相同的方式进行分块,其中,所述相同的方式划分指的是划分后所得的第一矩阵和第二矩阵的列数或者行数是相同的,以保证能正常完成矩阵运算。
[0046]
假设对左乘矩阵分块后可以得到两个以上第一矩阵,对右乘矩阵分块后可以得到两个以上第二矩阵,或者,对右乘矩阵分块后可以得到两个以上第一矩阵,对左乘矩阵分块后可以得到两个以上第二矩阵。
[0047]
根据处理元件的排列以及输入矩阵的行秩和列秩对左乘矩阵列方向和右乘矩阵行方向以相同的方式进行分块,分块后得到的第一矩阵和第二矩阵都需要满足不需要再进行分块的条件,也就是说,第一矩阵和第二矩阵的转置行数不大于处理元件的行数、且列数不大于处理元件的列数,或者,第一矩阵的转置和第二矩阵的行数不大于处理元件的行数、且列数不大于处理元件的列数。
[0048]
在一种可能的实现方式中,控制器可以按照划分出的第一矩阵或者第二矩阵的行秩和列秩尽量接近处理元件的行数和列数的方式进行划分,这样可以提高运算的效率,缩短运算时间。也就是说,假设处理元件为4
×
4的阵列,那么可以先按照划分出的矩阵为4
×
4的方式进行划分,这样可以最大效率的利用处理元件,提高运算效率。
[0049]
举例来说,假设处理元件为2
×
2的阵列,输入矩阵一个为2
×
4矩阵、一个为4
×
3矩阵。划分的方式可以有很多种,图2a和图2b分别示出了多种不同的划分方式,矩阵a
24
在列方向和矩阵b
43
在行方向以相同的方式进行分块。图2a是划分的一个示例,矩阵a
24
在列方向划分为两部分,每一部分包括两列,矩阵b
43
在行方向划分为两部分,每一部分包括两行;图2b是划分的另一个示例,矩阵a
24
在列方向划分为三部分,其中一部分包括两列、另外两部分都包括一列,矩阵b
43
在行方向划分为三部分,其中一部分包括两行、另外两部分都包括一行。以上处理元件的排列以及输入矩阵的划分方式仅仅是本公开的一个示例,不以任何方式限制本公开。
[0050]
对于左乘矩阵的行方向和右乘矩阵的列方向的划分方式,本公开不作具体的限定,只要划分后的矩阵都需要满足不需要再进行分块的条件即可。
[0051]
根据矩阵乘法的运算规则,左乘矩阵的行中的元素与右乘矩阵的列中的元素逐个求乘积、然后求和。因此,在一种可能的实现方式中,对于不分块的情况,或者分块后的第一矩阵和对应的第二矩阵,所述控制器用于将第一矩阵的转置矩阵和第二矩阵的各元素分别加载到各处理元件的寄存器中,转置矩阵和第二矩阵对应位置的元素存储在同一处理元件的寄存器中。按照矩阵乘法规则,转置矩阵和第二矩阵对应位置的元素可以是指转置矩阵中和第二矩阵中需要进行乘法运算的元素。
[0052]
在一种可能的实现方式中,控制器可以先对第一矩阵进行转置得到转置矩阵,然后将转置矩阵的元素加载到各处理元件的寄存器中,或者,在另一种可能的实现方式中,控制器也可以在加载的过程中实现对第一矩阵的转置,比如说,假设第一矩阵为右乘矩阵,那么控制器在将第一矩阵元素加载到各处理元件的寄存器的过程中,可以将第一矩阵的一列元素加载到一行处理元件的寄存器中实现对第一矩阵的转置。
[0053]
在一种可能的实现方式中,转置矩阵和第二矩阵在行或者列方向对齐。具体地,如果对左乘矩阵转置,那么,加载后,第一矩阵的转置矩阵的行与第二矩阵在列方向对齐,也就是在列的方向上,转置矩阵和第二矩阵的行对齐;如果对右乘矩阵转置,那么加载后,转置矩阵的列与第二矩阵在行方向对齐,也就是说,在行的方向上,转置矩阵和第二矩阵的列对齐。
[0054]
在加载完转置矩阵和第二矩阵后,所述控制器还用于控制所述转置矩阵或者第二矩阵中的元素在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果。具体地,控制器控制处理元件、存储在寄存器内的转置矩阵和第二矩阵重复以下过程,直到转置矩阵或第二矩阵中的元素恢复到未滚动时的位置:控制器控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,控制存储在寄存器中的转置矩阵或第二矩阵在行方向或列方向滚动一行或一列。
[0055]
也就是说,先控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,然后控制转置矩阵或第二矩阵中的元素在行方向或列方向滚动一行或一列,此时可以判断滚动完之后转置矩阵或者第二矩阵中的元素与初始位置是否相同,其中,初始位置可以是指转置矩阵或第二矩阵中的元素未滚动时的位置。若判断结果为相同,那么,结束此过程。若判断结果为不同,那么再控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的
元素乘积求和得到第一中间结果,然后控制转置矩阵或第二矩阵中的元素在行方向或列方向滚动一行或一列,判断滚动完之后转置矩阵或者第二矩阵中的元素与初始位置是否相同
……
,循环上述过程直到滚动完之后转置矩阵或者第二矩阵中的元素与初始位置相同。
[0056]
在一个示例中,所述第一矩阵为左乘矩阵、第二矩阵为右乘矩阵。在另一个示例中,所述第一矩阵为右乘矩阵、第二矩阵为左乘矩阵。
[0057]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,控制器控制转置矩阵中的元素在行方向上滚动,或者控制第二矩阵的元素在行方向上滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果。
[0058]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,控制器控制转置矩阵中的元素在列方向上滚动、或者控制第二矩阵中的元素在列方向上滚动;控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果。
[0059]
在一种可能的实现方式中,上述的滚动,每次滚动一行或者一列。在存储有矩阵的元素的处理元件之间形成闭环,由于相邻的处理元件之间是连接在一起的,因此控制器可以根据矩阵的维度确定成环的方式,比如说,如果要按行滚动(在列方向滚动),那么,存储有矩阵的元素的第一行处理元件和最后一行处理元件连接起来,在滚动的过程中,如果向上滚动一行,那么矩阵的第一行元素从原来存储的位置滚动到最后一行元素存储的位置。若要按列滚动(在行方向上滚动),那么,存储有矩阵的元素的第一列处理元件和最后一列处理元件连接起来,在滚动的过程中,如果向左滚动一列,那么矩阵的第一列元素从原来存储的位置滚动到最后一列元素存储的位置。上述的处理元件与处理元件的连接可以是指虚拟的连接,也就是说,并没有实际的连接线路,而是控制器记录了对应的处理器,在滚动的过程中形成闭环即可。
[0060]
在转置矩阵或第二矩阵中的元素恢复到未滚动时的位置时,完成滚动和计算第一中间结果的过程之后,控制器可以对所述第一中间结果进行处理得到第一矩阵和第二矩阵的乘积。
[0061]
在一种可能的实现方式中,控制器将第一中间结果按行或者按列存储,在行方向或者列方向进行滚动后得到第一矩阵和第二矩阵的乘积。具体的处理方式与进行转置的矩阵和滚动的方向有关,比如说:
[0062]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,对转置矩阵在列方向上向上滚动的情况下,可以将第一中间结果按列存储,并将第一中间结果中的元素在行方向上向右滚动;比如,第i行元素在行方向向右滚动i-1步;
[0063]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,对转置矩阵在列方向上向下滚动的情况下,可以将第一中间结果按列存储,并将第一中间结果中的元素在行方向上向左滚动;比如,第i行元素在行方向向左滚动i-1步;
[0064]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,对转置矩阵在行方向向左滚动的情况下,可以将第一中间结果按行存储,将第一中间结果中第i列元素在列方向向下滚动i-1步得到输入矩阵的乘积;
[0065]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,对转置矩阵在行方向向右滚动的情况下,可以将第一中间结果按行存储,将第一中间结果中第i列元素在列方向向上滚动i-1步得到输入矩阵的乘积。
[0066]
相关技术中,对于输入矩阵规模比较大的矩阵乘法,为了提高矩阵运算的效率,通常采用多级流水线的方式实现运算的过程,但多级流水线由于每一级对输入数据中的一部分进行处理,因此,需要频繁的从内存中读取数据,频繁访问内存导致对带宽的要求较高。为了解决上述技术问题,本公开提供的处理器可以对输入矩阵进行分块后堆叠存储,同时对分块后对应的矩阵进矩阵乘法运算,可以降低访存频率,提高运算效率。
[0067]
若第一矩阵是根据左乘矩阵进行分块得到的,或第二矩阵是根据右乘矩阵分块后得到的,那么,在一种可能的实现方式中,控制器还用于根据第一矩阵和第二矩阵的乘积计算左乘矩阵和右乘矩阵的乘积。也就是说,对于分块后的第一矩阵和对应的第二矩阵分别计算第一矩阵和第二矩阵的乘积,然后根据第一矩阵和第二矩阵的乘积计算左乘矩阵和右乘矩阵的乘积。这样可以降低访存频率,提高运算效率。
[0068]
在另一种可能的实现方式中,所述处理器包括多组寄存器。也就是说,控制器可以根据对矩阵分块的情况,将处理元件的寄存器分为多个组。
[0069]
这样,所述控制器可以在对所述输入矩阵进行分块后,将两个以上所述第一矩阵进行转置得到转置矩阵;控制器将转置矩阵、和两个以上所述第二矩阵加载到所述多组寄存器中堆叠存储,一组寄存器中存储有对应位置的转置矩阵和第二矩阵。
[0070]
在每次对转置矩阵或第二矩阵中的元素在行方向或列方向滚动一次之前,控制器控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果;在控制一组寄存器中的元素在行或列方向上滚动一行或一列转置矩阵之后,控制器还对滚动结果进行修正。
[0071]
在一种可能的实现方式中,对滚动结果进行修正包括:
[0072]
若在行方向上向左滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一列数据滚动到相邻的前一块转置矩阵数据的最后一列;
[0073]
若在行方向上向右滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一列数据滚动到相邻的后一块转置矩阵数据的第一列;
[0074]
若在列方向上向上滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一行数据滚动到相邻的前一块转置矩阵数据的最后一行;
[0075]
若在列方向上向下滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一行数据滚动到相邻的后一块转置矩阵数据的第一行;
[0076]
其中,每一块转置矩阵是指对分块之后的每一块矩阵进行转置之后的矩阵。具体的计算和修正过程将在下文的示例中详细介绍。
[0077]
本公开还提供了一种运算方法,用于实现矩阵乘法运算。
[0078]
对于不分块的情况,或者分块后的第一矩阵和第二矩阵,图3示出根据本公开一实施例的运算方法的流程图。对于不分块的情况,也可以直接把左乘矩阵作为第一矩阵、右乘矩阵作为第二矩阵,或者直接把左乘矩阵作为第二矩阵、右乘矩阵作为第一矩阵,本公开对此不作限定。
[0079]
如图3所示,本公开提供的运算方法可以包括以下步骤:
[0080]
步骤s11,将第一矩阵进行转置得到转置矩阵,将转置矩阵和第二矩阵加载到处理元件的寄存器中,转置矩阵和第二矩阵对应位置的元素存储在同一处理元件的寄存器中。
[0081]
按照矩阵乘法规则,转置矩阵和第二矩阵对应位置的元素可以是指转置矩阵中和
第二矩阵中需要进行乘法运算的元素。
[0082]
在一种可能的实现方式中,转置矩阵和第二矩阵在行或者列方向对齐。具体地,如果对左乘矩阵转置,那么,加载后,第一矩阵的转置矩阵的行与第二矩阵在列方向对齐,也就是在列的方向上,转置矩阵和第二矩阵的行对齐;如果对右乘矩阵转置,那么加载后,转置矩阵的列与第二矩阵在行方向对齐,也就是说,在行的方向上,转置矩阵和第二矩阵的列对齐。
[0083]
步骤s12,控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果。
[0084]
在一种可能的实现方式中,步骤s12具体可以包括,重复以下过程直到转置矩阵或第二矩阵中的元素恢复到未滚动时的位置:控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果;在处理元件的矩阵中对转置矩阵或第二矩阵在行方向或列方向滚动一行或一列。
[0085]
步骤s13,将所述第一中间结果进行处理得到所述第一矩阵和第二矩阵的乘积。
[0086]
也就是说,对于步骤s12和s13,先控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,然后控制转置矩阵或第二矩阵中的元素在行方向或列方向滚动一行或一列,此时可以判断滚动完之后转置矩阵或者第二矩阵中的元素与初始位置是否相同,其中,初始位置可以是指转置矩阵或第二矩阵中的元素未滚动时的位置。若判断结果为相同,那么,结束此过程,继续执行步骤s13。若判断结果为不同,那么再控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,然后控制转置矩阵或第二矩阵中的元素在行方向或列方向滚动一行或一列,判断滚动完之后转置矩阵或者第二矩阵中的元素与初始位置是否相同
……
,循环上述过程直到滚动完之后转置矩阵或者第二矩阵中的元素与初始位置相同。
[0087]
在一个示例中,所述第一矩阵为左乘矩阵、第二矩阵为右乘矩阵。在另一个示例中,所述第一矩阵为右乘矩阵、第二矩阵为左乘矩阵。
[0088]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,步骤s12中控制转置矩阵中的元素在行方向上滚动,或者控制第二矩阵中的元素在行方向上滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果。
[0089]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,步骤s12中,控制转置矩阵中的元素在列方向上滚动、或者控制第二矩阵中的元素在列方向上滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果。
[0090]
在一种可能的实现方式中,上述的滚动,每次滚动一行或者一列。
[0091]
对于步骤s13,对第一中间结果进行处理可以是指:将第一中间结果按行或者按列存储,在行方向或者列方向进行滚动后得到第一矩阵和第二矩阵的乘积。具体的处理方式与进行转置的矩阵和滚动的方向有关,比如说:
[0092]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,对转置矩阵在列方向上向上滚
动的情况下,可以将第一中间结果按列存储,将第一中间结果中的元素在行方向上向右滚动;比如,第i行元素在行方向向右滚动i-1步;
[0093]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,对转置矩阵在列方向上向下滚动的情况下,可以将第一中间结果按列存储,将第一中间结果中的元素在行方向上向左滚动;比如,第i行元素在行方向向左滚动i-1步;
[0094]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,对转置矩阵在行方向向左滚动的情况下,可以将第一中间结果按行存储,将第一中间结果中第i列元素在列方向向下滚动i-1步得到输入矩阵的乘积;
[0095]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,对转置矩阵在行方向向右滚动的情况下,可以将第一中间结果按行存储,将第一中间结果中第i列元素在列方向向上滚动i-1步得到输入矩阵的乘积。
[0096]
下面将分别以第一矩阵为右乘矩阵、第二矩阵为左乘矩阵,和,第一矩阵为左乘矩阵、第二矩阵为右乘矩阵为例对步骤s11-s13的过程进行说明。
[0097]
示例1第一矩阵为右乘矩阵、第二矩阵为左乘矩阵,也就是说,对右乘矩阵进行转置。
[0098]
假设第一矩阵b
nk
和第二矩阵a
mn
都为3
×
3矩阵,处理元件组成4
×
4的阵列。
[0099]
图4示出根据本公开一实施例的处理元件组成的阵列的示意图。结合图4以及图3对本公开的运算方法进行说明。
[0100]
假设第一矩阵第二矩阵那么对第一矩阵进行转置得到的转置矩阵为
[0101]
将第二矩阵加载到所述处理元件的寄存器中,可以按照第二矩阵的行和列的排列方式加载到所述处理元件的寄存器中,也就是说,第二矩阵中的元素在矩阵中的排列方式和在处理元件的寄存器中的排列方式相同。
[0102]
在一种可能的实现方式中,第二矩阵中的元素在矩阵中的行列数与加载有该元素的处理元件在处理元件组成的阵列中的行列数相同。
[0103]
举例来说,在一个示例中,可以将a
11
加载到pe
11
的寄存器中、a
12
加载到pe
12
的寄存器中、a
13
加载到pe
13
的寄存器中、a
21
加载到pe
21
的寄存器中

a
33
加载到pe
33
的寄存器中,也就是说,第二矩阵中元素的下标可以与其所处的处理元件的下标完全相同。
[0104]
在另一个示例中,可以将a
11
加载到pe
12
的寄存器中、a
12
加载到pe
13
的寄存器中、a
13
加载到pe
14
的寄存器中、a
21
加载到pe
22
的寄存器中

a
33
加载到pe
34
的寄存器中,也就是说,第二矩阵中的元素在矩阵中的排列方式和在处理元件的寄存器中的排列方式相同。
[0105]
需要说明的是,以上示例仅仅是加载第一矩阵的一些举例,不以任何方式限制本公开,本领域技术人员应当知道,只要满足第一矩阵中的元素在矩阵中的排列方式和在处理元件的寄存器中的排列方式相同即可。
[0106]
可以根据加载所述第一矩阵的方式将转置矩阵加载到所述处理元件的寄存器中,或者说,加载后,第二矩阵的列与转置矩阵的列对齐,加载后转置矩阵和第二矩阵对应位置
的元素存储在同一处理元件的寄存器中。
[0107]
举例来说,假设将a
11
加载到pe
11
的寄存器中、a
12
加载到pe
12
的寄存器中、a
13
加载到pe
13
的寄存器中、a
21
加载到pe
21
的寄存器中

a
33
加载到pe
33
的寄存器中,也就是说,第一矩阵中元素的下标可以与其所处的处理元件的下标完全相同。那么,可以将b
11
加载到pe
11
的寄存器中、b
21
加载到pe
12
的寄存器中、b
31
加载到pe
13
的寄存器中、b
12
加载到pe
21
的寄存器中、b
22
加载到pe
22
的寄存器中、b
32
加载到pe
23
的寄存器中
……
b
33
加载到pe
33
的寄存器中。也就是说,将转置矩阵按照与第二矩阵列对齐的排序方式加载到处理元件的寄存器中。
[0108]
在一种可能的实现方式中,也可以先加载转置矩阵再加载第二矩阵,或者同时加载,本公开对具体加载的方式不作限定,只要保证加载后转置矩阵和第二矩阵在行方向对齐,转置矩阵和第二矩阵对应位置的元素存储在同一处理元件的寄存器中即可。
[0109]
在一种可能的实现方式中,在加载完输入矩阵之后,对于将右乘矩阵转置的情况,可以在列方向连接存储转置矩阵的第一行元素的处理元件和存储转置矩阵的最后一行元素的处理元件,形成环,在环内的数据可以进行流动以实现矩阵在列方向上的滚动。如图1所示,可以将pe
11
与pe
31
连接形成环,连接pe
12
和pe
32
可以形成环,连接pe
13
和pe
33
可以形成环。这样,当数据在环内进行流动时,如果是向上流动,那么第一行的数据将流动到第三行,第二行的数据将流动到第一行,第三行的数据将流动到第二行;如果是向下流动,那么第一行的数据将流动到第二行,第二行的数据将流动到第三行,第三行的数据将流动到第一行。
[0110]
在本实施方式中,可以仅对转置矩阵进行滚动,在对转置矩阵进行第一次滚动之前,控制器可以控制处理元件对相应的寄存器内的元素进程乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果。以上述示例为例,控制器可以控制pe
11
对其内的寄存器存储的元素a
11
和b
11
进行乘法运算得到元素乘积a
11
×
b
11
,同样的,控制器可以控制pe
12
、pe
13
以得到a
12
×
b
21
、a
13
×
b
31

[0111]
然后控制器可以将位于同一行的元素乘积求和得到c
11
=a
11
×
b
11
a
12
×
b
21
a
13
×
b
31

[0112]
通过同样的方式可以得到c
22
和c
33

[0113]
在一种可能的实现方式中,可以将c
11
、c
22
和c
33
作为第一列第一中间结果暂时存储在缓存器中。该缓存器可以位于处理器中多个处理元件以外的位置。
[0114]
接下来,在一种可能的实现方式中,可以对转置矩阵向上滚动一行,第一行的元素滚动到(存储有矩阵的元素的处理元件的)最后一行。或者,也可以对转置矩阵向下滚动一行,本公开对具体滚动的方向不作限定,对于本实施方式中的示例在列方向以行为单位进行滚动即可。
[0115]
如图1所示,在进行向上滚动时,第一行的数据可以滚动到第三行,如下所示:
[0116][0117]
在一种可能的实现方式中,可以利用处理元件内多余的寄存器或者处理器中的片上缓存实现矩阵中数据的滚动过程。该实施方式适用于本公开的示例1和示例2中的滚动过程。
[0118]
举例来说,以上述示例1为例,可以先将转置矩阵的第一行元素暂存在多余的寄存器中,控制第二行的处理元件将对应的寄存器存储的转置矩阵的第二行元素发送给第一行
的处理元件,然后再控制第三行的处理元件将对应的寄存器存储的转置矩阵的第三行元素发送给第二行处理元件,最后,可以将暂存的第一行元素存储到第三行的处理元件对应的寄存器中,从而实现转置矩阵的一行数据的滚动过程。以上过程仅仅是本公开的一个示例,不以任何方式限制本公开。
[0119]
再次进行控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果,a
33
的第一行乘以的第二行得到c
12
、a
33
的第二行乘以的第三行得到c
23
、和a
33
的第三行乘以的第一行得到c
31
。将c
12
、c
23
和c
31
作为第二列第一中间结果暂时存储在缓存器中。
[0120]
再次向上滚动一行转置矩阵,并对相应的寄存器内的元素进程乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果c
13
、c
21
和c
32
,将c
13
、c
21
和c
32
作为第三列第一中间结果暂时存储在缓存器中。
[0121]
也就是说,缓存器中存储的第一中间结果为
[0122][0123]
对于步骤s13,对于将转置矩阵向上滚动的情况,所述将第一中间结果进行处理指的是,控制器将得到的第一中间结果按列存储,然后控制器将第一中间结果中第i行元素在行方向向右滚动i-1步得到输入矩阵的乘积,此处的滚动也是指在行的方向成闭环的滚动,存储有矩阵的元素的第一列处理元件和最后一列处理元件连接形成闭环。在滚动的过程中,如果向右滚动,那么最后一列处理元件中存储的元素滚动到第一列处理元件中。
[0124]
可选地,对于步骤s13,对于将转置矩阵向下滚动的情况,所述将第一中间结果进行处理指的是,控制器将得到的第一中间结果按列存储,然后由控制器将第一中间结果中第i行元素在行方向向左滚动i-1步得到输入矩阵的乘积。
[0125]
本领域技术人员可以理解的是,对于步骤s13,还可以由控制器将根据第一中间结果的行列标识将第一中间结果中的元素在行方向(例如,向右滚动或者向左滚动)滚动得到输入矩阵的乘积。在这种实施方式中,存储在寄存器中的元素都可以携带有元素在矩阵中的行列标识,在滚动的过程中,根据元素在矩阵中所处的行列标识确定第一中间结果中元素的行列标识,从而使得控制器可以根据第一中间结果的行列标识对第一中间结果中的元素在行方向进行滚动得到第一矩阵和第二矩阵的乘积。
[0126]
以上述示例为例,第1行向右滚动0步,也就是不滚动。第2行向右滚动1步,也就是说c
21
向右滚动1步到第1列,c
23
向右滚动1步到第3列,c
22
向右滚动1步到第2列,得到的结果为:
[0127][0128]
将第3行向右滚动2步,得到的输入矩阵的乘积为:
[0129][0130]
在一种可能的实现方式中,在步骤s12中,还可以对第二矩阵在列方向上进行滚
动,具体的过程与转置矩阵滚动的过程类似,只不过对于步骤s13中处理和滚动元素的方式稍有区别。本公开对具体的推导过程不再赘述,参考以上过程。
[0131]
需要说明的是,以上示例中的处理元件的排列、输入矩阵等仅仅是为了清楚说明本公开运算方法的过程,不以任何方式限制本公开。
[0132]
示例2第一矩阵为左乘矩阵、第二矩阵为右乘矩阵,也就是说对左乘矩阵进行转置
[0133]
仍然假设第一矩阵a
mn
和第二矩阵b
nk
都为3
×
3矩阵,处理元件为4
×
4的阵列。
[0134]
假设第一矩阵那么对第一矩阵进行转置的转置矩阵为第二矩阵
[0135]
将第二矩阵加载到所输出处理元件的寄存器中,加载的方式可以参见示例1中加载第一矩阵的方式,不再赘述,然后根据加载第二矩阵的方式将转置矩阵加载到处理元件的寄存器中,加载后,第一矩阵的转置矩阵的行与第二矩阵的行对齐。
[0136]
举例来说,假设将b
11
加载到pe
11
的寄存器中、b
12
加载到pe
12
的寄存器中、b
13
加载到pe
13
的寄存器中、b
21
加载到pe
21
的寄存器中

b
33
加载到pe
33
的寄存器中,也就是说,第一矩阵中元素的下标可以与其所处的处理元件的下标完全相同。那么,可以将a
11
加载到pe
11
的寄存器中、a
21
加载到pe
12
的寄存器中、a
31
加载到pe
13
的寄存器中、a
12
加载到pe
21
的寄存器中、a
22
加载到pe
22
的寄存器中、a
32
加载到pe
23
的寄存器中
……
a
33
加载到pe
33
的寄存器中。也就是说,将转置矩阵按照与另一个矩阵(第二矩阵)以行对齐的排序方式加载到处理元件的寄存器中。
[0137]
在一种可能的实现方式中,在加载完输入矩阵之后,对于将第一矩阵转置的情况,可以在行方向连接存储转置矩阵的第一列元素的处理元件和存储转置矩阵的最后一列元素的处理元件,形成环,在环内的数据可以进行流动,从而便于在行的方向上以列为单位进行滚动。如图4所示,连接pe
11
和pe
13
可以形成环,连接pe
21
和pe
23
可以形成环,连接pe
31
和pe
33
可以形成环,这样,当数据在环内进行流动时,如果是向左流动,那么第一列的数据将流动到第三列,第二列的数据将流动到第一列,第三列的数据将流动到第二列;如果是向右流动,那么第一列的数据将流动到第二列,第二列的数据将流动到第三列,第三列的数据将流动到第一列。
[0138]
在本实施方式中,可以仅对转置矩阵进行滚动,在对转置矩阵进行按照列方向向左或者向右滚动第一次之前,控制器可以控制处理器元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果。以上述示例为例,pe
11
对其内的寄存器存储的元素a
11
和b
11
进行乘法运算得到元素乘积a
11
×
b
11
,同样的可以得到a
12
×
b
21
、a
13
×
b
31

[0139]
第一列的元素乘积求和可以得到c
11
=a
11
×
b
11
a
12
×
b
21
a
13
×
b
31

[0140]
通过同样的方式可以得到第二列的元素乘积求和c
22
、第三列的元素乘积求和c
33

[0141]
在一种可能的实现方式中,可以将c
11
、c
22
和c
33
作为第一行第一中间结果暂时存储在缓存器中。
[0142]
接下来可以对转置矩阵向左滚动一列,第一列的元素滚动到最后一列,或者也可
以向右滚动一列,本公开对此不作限定。
[0143]
如图1所示,在进行向左滚动时,第一列的数据可以滚动到第三列,如下所示:
[0144][0145]
再次进行控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果,的第二列乘以b
33
的第一列得到c
21
、的第三列乘以b
33
的第二列得到c
32
、和的第一列乘以b
33
的第三列得到c
13
。将c
21
、c
32
和c
13
作为第二行第一中间结果暂时存储在缓存器中。
[0146]
再次向左滚动一列转置矩阵,并对相应的寄存器内的元素进程乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果c
31
、c
12
和c
23
,将c
31
、c
12
和c
23
作为第三行第一中间结果暂时存储在缓存器中。
[0147]
也就是说,缓存器中存储的第一中间结果为
[0148][0149]
于步骤s13,对于将第一转置矩阵向左滚动的情况,可以将第一中间结果按行存储,可以由控制器将第一中间结果中第i列元素在列方向向下滚动i-1步得到输入矩阵的乘积。
[0150]
可选地,当将第一转置矩阵向右滚动的情况,可以由控制器将第一中间结果按行存储,将第一中间结果中第i列元素在列方向向上滚动i-1步得到输入矩阵的乘积。具体步骤和向左滚动类似,在此不再赘述。
[0151]
本领域技术人员可以理解的是,对于步骤s13,还可以由控制器将根据第一中间结果的行列标识将第一中间结果中的元素在列方向(例如,向上移或者向下移)滚动得到输入矩阵的乘积。在这种实施方式中,存储在寄存器中的元素都可以携带有元素在矩阵中的行列标识,在滚动的过程中,根据元素在矩阵中所处的行列标识确定第一中间结果中元素的行列标识,从而使得控制器可以根据第一中间结果的行列标识对第一中间结果中的元素在列方向进行滚动得到输入矩阵的乘积。
[0152]
以上述示例为例,第1列向下滚动0步,也就是不滚动。第2列向下滚动1步,也就是说c
12
向下滚动1步到第1列,c
32
向下滚动1步到第3列,c
22
向下滚动1步到第2列,得到的结果为:
[0153][0154]
将第3列向下滚动2步,得到的输入矩阵的乘积为:
[0155][0156]
需要说明的是,以上示例中的处理元件的排列、输入矩阵等仅仅是为了清楚说明本公开运算方法的过程,不以任何方式限制本公开。
[0157]
在一种可能的实现方式中,在步骤s12中,还可以对第二矩阵在行方向上进行滚
动,具体的过程与转置矩阵滚动的过程类似,只不过对于步骤s13中处理和滚动元素的方式稍有区别。本公开对具体的推导过程不再赘述,参考以上过程。
[0158]
根据本公开上述各实施方式的矩阵乘的运算方法,更适用于以阵列排布的处理元件组成的处理器。对于满足处理元件的排列的任意规模的输入矩阵,都可以得到矩阵乘法的运算结果,并且相比于相关技术中的矩阵乘运算可以减少访存次数,降低带宽压力,提高运算的效率。
[0159]
对于不进行分块的情况,根据上述示例可以直接得到矩阵乘的结果。对于需要进行分块的情况,对于分块后的第一矩阵和第二矩阵,按照矩阵乘的规则将第一矩阵和对应的第二矩阵相乘得到的结果作为第二中间结果,也就是说可以将分块后得到的第一矩阵和第二矩阵作为矩阵的一个元素执行矩阵乘法的运算过程得到第二中间结果,根据第二中间结果进行计算可以得到所述输入矩阵的乘积。
[0160]
图5示出根据本公开一实施例的分块的示意图。如图5所示,控制器可以将矩阵d和e按照以上所述的方式进行分块得到第一矩阵d
11
、d
12
、d
21
、d
22
,以及第二矩阵e
11
、e
12
、e
21
、e
22
。控制器可以将第一矩阵和第二矩阵作为矩阵的一个元素执行矩阵乘法的运算过程,例如,将矩阵d第一行乘以矩阵e第一列为f
11
=d
11
×
e
11
d
12
×
e
21
,将矩阵d第一行乘以矩阵e第二列为f
12
=d
11
×
e
12
d
12
×
e
22
,将矩阵d第二行乘以矩阵e第一列为f
21
=d
21
×
e
11
d
22
×
e
21
,将矩阵d第二行乘以矩阵e第二列为f
22
=d
21
×
e
12
d
22
×
e
22
。也就是说,为了得到最终的矩阵乘法的运算结果,需要先得到第二中间结果:
[0161]
d
11
×
e
11
,d
12
×
e
21
,d
11
×
e
12
,d
12
×
e
22

[0162]
d
21
×
e
11
,d
22
×
e
21
,d
21
×
e
12
,d
22
×
e
22

[0163]
得到第二中间结果的过程可以通过将对应的第一矩阵和第二矩阵分别按照步骤s11-s13的过程进行运算得到。
[0164]
通过对输入矩阵进行分块,并针对分块后的矩阵分别进行本公开的矩阵乘法运算得到第二中间结果,根据第二中间结果可以计算得到输入矩阵的乘积。根据本公开上述实施方式的运算方法,对于任何维度的矩阵都可以快速的实现矩阵相乘的过程。
[0165]
在一个可选地实施例中,所述分块后的第一矩阵和第二矩阵可以分别依次存储在处理元件中进行计算,也还可以堆叠存储在处理元件中。
[0166]
示例3堆叠存储结合步骤s11-步骤s13
[0167]
举例来说,以处理元件为2
×
2的阵列,输入矩阵都为4
×
4矩阵为例对本公开的运算方法进行说明。
[0168]
假设左乘矩阵右乘矩阵为那么控制器可以将左乘矩阵和右乘矩阵都划分为2
×
2的矩阵。
[0169]
图6示出根据本公开一实施例的对矩阵划分的示例。如图6所示,控制器可以将左乘矩阵和右乘矩阵都划分为2
×
2的子矩阵,左乘矩阵划分后得到四个矩阵a
11
、a
12
、a
21
、a
22
,其中,a
11
为a
12
为a
21
为a
22
为右乘矩阵划分后得到四个
矩阵b
11
、b
12
、b
21
、b
22
,其中,b
11
为b
12
为b
21
为b
22

[0170]
对于进行分块的情况,如果处理元件包含的寄存器的数量可以满足存储输入矩阵的需求,那么还可以采用堆叠存储的方式将输入矩阵存储到处理元件的寄存器中,来实现输入矩阵的乘法运算。在采用堆叠存储的方式存储输入矩阵时,控制器可以把处理元件中的寄存器分为多个不同的组,每组存储一个分块后的第一矩阵和对应的第二矩阵,本公开对具体分组的方式不作限定,但同一组的寄存器中的每一个可以位于不同的处理元件内。
[0171]
在采用堆叠存储的方式存储输入矩阵的示例中,一种可能的计算方式是,以分块得到的第一矩阵和第二矩阵为单位对矩阵进行滚动,在计算第二中间结果的过程中,采用步骤s11-s13的过程进行运算。
[0172]
以采用步骤s11-s13的过程计算第二中间结果为例,假设以处理元件为2
×
2的阵列,以图6所示的示例为例,对于本公开的运算方法,第一矩阵可以为左乘矩阵分块得到的,也可以是右乘矩阵分块后得到的。
[0173]
本公开以第一矩阵为右乘矩阵分块得到的为例,加载第二矩阵,将对应的第一矩阵转置后再加载为例对运算方法进行说明,加载的结果如表1和表2所示。其中,reg0、reg1、reg2和reg3分别表示处理元件中的一组寄存器,处理元件为2
×
2的阵列,每个处理器都包括多个寄存器,控制器可以将多个寄存器分为多组,以本实施例为例,可以分为4组,用位于同一组的寄存器存储一个转置矩阵和对应的第二矩阵,如表1和表2所示,reg0存储a
11
和b
11
,reg1存储a
12
和b
21
,reg2存储a
21
和b
12
,reg3存储a
22
和b
22
,也就是说,矩阵的第一行元素乘以矩阵的第一列元素、以及第二行元素乘以第二列元素。
[0174]
表1元素存储示例
[0175][0176]
表2元素存储示例
[0177][0178]
在计算过程中,对于一组寄存器内的元素,处理元件可以根据步骤s11-s13的过程
计算得到第二中间结果a
11
×
b
11
、a
12
×
b
21
、a
21
×
b
12
以及a
22
×
b
22
。具体过程不再赘述。根据第二中间结果a
11
×
b
11
、a
12
×
b
21
、a
21
×
b
12
以及a
22
×
b
22
可以计算得到c
11
=a
11
×
b
11
a
12
×
b
21
,c
22
=a
21
×
b
12
a
22
×
b
22

[0179]
在计算完上述第二中间结果之后,可以以组为单元对转置矩阵进行滚动。具体来说,对于转置矩阵向上滚动一行,也就是说,将reg2中的转置矩阵的元素滚动到reg0中,reg0中的转置矩阵的元素滚动到reg2中,reg3中的转置矩阵的元素滚动到reg1中,reg1中的转置矩阵的元素滚动到reg3中,由此,可以得到表3。
[0180]
表3元素存储示例
[0181][0182]
结合表1和表3,在计算过程中,对于一组寄存器内的元素,处理元件可以根据步骤s11-s13的过程计算得到第二中间结果a
11
×
b
12
、a
12
×
b
22
、a
21
×
b
11
以及a
22
×
b
21
。具体过程不再赘述。根据第二中间结果a
11
×
b
12
、a
12
×
b
22
、a
21
×
b
11
以及a
22
×
b
21
可以计算得到c
12
=a
11
×
b
12
a
12
×
b
22
,c
21
=a
21
×
b
11
a
22
×
b
21

[0183]
根据以上过程,可以采用分块的方式计算得到输入矩阵的乘积。
[0184]
因此,根据本公开的矩阵乘的运算方法可以实现任意大小规模的矩阵运算。
[0185]
示例4堆叠存储结合整体滚动
[0186]
在另一种可能的实现方式中,还可以采用另一种滚动方式,在本实施例的滚动方式中,图3中的步骤s12可以通过以下过程实现,在每次对转置矩阵在行方向或列方向滚动一次之前,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行(或者在对第一矩阵转置的示例中,对同一列)的元素乘积求和得到第一中间结果c
11
、c
22
、c
33
、c
44

[0187]
由于对输入矩阵进行了分块、堆叠存储,原先的一行或者一列数据被存储在不同组的寄存器内,导致原来一行或一列连续存储的数据变成至少两行或至少两列独立的数据存储在不同组的寄存器时,存储在不同组的寄存器中的数据的下一行或下一列的首个数据与上一行或下一列数据的末尾数据在堆叠存放前是连续存放的数据,而在堆叠存放后是不连续存放的,因此,在控制一组寄存器中的元素在行或列方向上滚动一次之后,需要对滚动结果进行修正,才能得到正确的结果。具体修正的方式可以为:
[0188]
针对每一块转置矩阵,在行或者列方向上滚动一次;
[0189]
若在行方向上向左滚动,则修正的方式为,将滚动之后每一块内最后一列数据滚动到相邻的前一块数据的最后一列;
[0190]
若在行方向上向右滚动,则修正的方式为,将滚动之后每一块内第一列数据滚动
到相邻的后一块数据的第一列;
[0191]
若在列方向上向上滚动,则修正的方式为,将滚动之后每一块内最后一行数据滚动到相邻的前一块数据的最后一行;
[0192]
若在列方向上向下滚动,则修正的方式为,将滚动之后每一块内第一行数据滚动到相邻的后一块数据的第一行。
[0193]
其中,以上所述的每一块是指每一块转置矩阵,每一块转置矩阵是指对分块之后的每一块矩阵进行转置之后的矩阵。
[0194]
对于本实施例,对右乘矩阵进行了转置,在滚动过程中还是在行的方向上进行滚动,只不过由于进行了堆叠存储,存在至少两行之间的元素应该是连续的,但是在堆叠存储时被看成了独立的每行,仅仅在每一组的寄存器内的行方向进行滚动无法实现正确的滚动,还需要进行修正。
[0195]
以表2为例,在每一组寄存器内部,向上滚动一行,滚动结果如表4所示,在表4中,一组寄存器内第一行元素滚动到最后一行。但如表2所示,reg0和reg1的第一行元素应该滚动到reg2和reg3的最后一行、但现在位于reg0和reg1的最后一行(如表4所示);如表2所示,reg2和reg3的第一行元素应该滚动到reg0和reg1的最后一行、但现在位于reg2和reg3的最后一行(如表4所示);也就是说,表4中现在reg0和reg1的最后一行元素应该位于reg2和reg3的最后一行,reg2和reg3的最后一行元素应该位于reg0和reg1的最后一行,那么交换reg2和reg0的最后一行元素、以及交换reg3和reg1的最后一行元素即可实现滚动的过程,如表5所示。
[0196]
表4元素存储示例
[0197][0198]
表5元素存储示例
[0199][0200]
根据较表1和表5,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果c
12
、c
23
、c
34
、c
41

[0201]
重复执行上述过程中的4次计算、3次滚动即可完成矩阵乘的运算过程,根据第一中间结果可以得到输入矩阵的乘积。
[0202]
在一个可选地实施例中,所述堆叠存储的方式可以根据上文中分块的方式存储,不限于每一个寄存器都存储矩阵中的一个元素,不限于所述矩阵乘的行列数是处理元件行列数的整数倍,也不限于所述堆叠存储的方法是唯一的,在所述修正过程是一样的,只需要满足在修正后原本的一行/列元素能够串联起来即可,具体堆叠存储过程在此不作限制。
[0203]
需要说明的是,以上堆叠存储、滚动元素的方式仅仅是本公开的一个示例,还可以采用其他的方式实现,本公开对此不作限定。
[0204]
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本公开并不受所描述的动作顺序的限制,因为依据本公开,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本公开所必须的。
[0205]
进一步需要说明的是,虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
[0206]
本公开还提供了一种基于处理元件矩阵的矩阵乘的运算装置,该运算装置可以应用于处理器。图1所示为处理器的一个示例,处理器可以包括两个以上处理元件,两个以上处理元件以二维矩阵排列,每个处理元件包括至少一个寄存器,所述运算装置用于实现对第一矩阵和第二矩阵的矩阵乘法运算。
[0207]
应该理解,上述的装置实施例仅是示意性的,本公开的装置还可通过其它的方式实现。例如,上述实施例中所述单元/模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个单元、模块或组件可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。
[0208]
另外,若无特别说明,在本公开各个实施例中的各功能单元/模块可以集成在一个单元/模块中,也可以是各个单元/模块单独物理存在,也可以两个或两个以上单元/模块集成在一起。上述集成的单元/模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
[0209]
所述集成的单元/模块如果以硬件的形式实现时,该硬件可以是数字电路,模拟电路等等。硬件结构的物理实现包括但不局限于晶体管,忆阻器等等。若无特别说明,所述寄存器可以是任何适当的磁存储介质或者磁光存储介质,比如,阻变式存储器rram(resistive random access memory)、动态随机存取存储器dram(dynamic random access memory)、静态随机存取存储器sram(static random-access memory)、增强动态随机存取存储器edram(enhanced dynamic random access memory)、高带宽内存hbm(high-bandwidth memory)、混合存储立方hmc(hybrid memory cube)等等。
[0210]
所述集成的单元/模块如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储器包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0211]
本公开实施例还提出一种计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。计算机可读存储介质可以是非易失性计算机可读存储介质。
[0212]
本公开实施例还提出一种人工智能芯片,所述芯片包括如上所述的处理器。
[0213]
在一种可能的实现方式中,还公开了一种板卡,其包括存储器件、接口装置和控制器件以及上述人工智能芯片;其中,所述人工智能芯片与所述存储器件、所述控制器件以及所述接口装置分别连接;所述存储器件,用于存储数据;所述接口装置,用于实现所述人工智能芯片与外部设备之间的数据传输;所述控制器件,用于对所述人工智能芯片的状态进行监控。
[0214]
图7示出根据本公开实施例的板卡的结构框图,参阅图7,上述板卡除了包括上述芯片389以外,还可以包括其他的配套部件,该配套部件包括但不限于:存储器件390、接口装置391和控制器件392;
[0215]
所述存储器件390与所述人工智能芯片通过总线连接,用于存储数据。所述存储器件可以包括多组存储单元393。每一组所述存储单元与所述人工智能芯片通过总线连接。可以理解,每一组所述存储单元可以是ddr sdram(英文:double data rate sdram,双倍速率同步动态随机存储器)。
[0216]
ddr不需要提高时钟频率就能加倍提高sdram的速度。ddr允许在时钟脉冲的上升沿和下降沿读出数据。ddr的速度是标准sdram的两倍。在一个实施例中,所述存储装置可以包括4组所述存储单元。每一组所述存储单元可以包括多个ddr4颗粒(芯片)。在一个实施例中,所述人工智能芯片内部可以包括4个72位ddr4控制器,上述72位ddr4控制器中64bit用于传输数据,8bit用于ecc校验。
[0217]
在一个实施例中,每一组所述存储单元包括多个并联设置的双倍速率同步动态随机存储器。ddr在一个时钟周期内可以传输两次数据。在所述芯片中设置控制ddr的控制器,用于对每个所述存储单元的数据传输与数据存储的控制。
[0218]
所述接口装置与所述人工智能芯片电连接。所述接口装置用于实现所述人工智能芯片与外部设备(例如服务器或计算机)之间的数据传输。例如在一个实施例中,所述接口装置可以为标准pcie接口。比如,待处理的数据由服务器通过标准pcie接口传递至所述芯片,实现数据转移。在另一个实施例中,所述接口装置还可以是其他的接口,本公开并不限制上述其他的接口的具体表现形式,所述接口单元能够实现转接功能即可。另外,所述人工智能芯片的计算结果仍由所述接口装置传送回外部设备(例如服务器)。
[0219]
所述控制器件与所述人工智能芯片电连接。所述控制器件用于对所述人工智能芯
片的状态进行监控。具体的,所述人工智能芯片与所述控制器件可以通过spi接口电连接。所述控制器件可以包括单片机(micro controller unit,mcu)。如所述人工智能芯片可以包括多个处理芯片、多个处理核或多个处理电路,可以带动多个负载。因此,所述人工智能芯片可以处于多负载和轻负载等不同的工作状态。通过所述控制装置可以实现对所述人工智能芯片中多个处理芯片、多个处理和或多个处理电路的工作状态的调控。
[0220]
本公开实施例还提出一种电子设备,包括:处理器;如上所述,所述处理器包括两个以上处理元件以及控制处理元件的控制器,所述两个以上处理元件以二维矩阵排列,每个处理元件包括至少一个寄存器;
[0221]
电子设备,还包括用于存储处理器可执行指令的存储器;其中,所述处理器被配置为调用所述存储器存储的指令,以执行上述方法。
[0222]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。上述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0223]
依据以下条款可更好地理解前述内容:
[0224]
条款a1.一种处理器,所述处理器包括两个以上处理元件,所述两个以上处理元件以二维矩阵排列,处理元件包括至少一个寄存器,所述处理器用于对第一矩阵和第二矩阵执行矩阵乘法运算,
[0225]
所述处理器还包括控制器,所述控制器用于将第一矩阵的转置矩阵和第二矩阵的各元素分别加载到各处理元件的寄存器中,所述转置矩阵和所述第二矩阵对应位置的元素存储在同一处理元件的寄存器中;
[0226]
所述控制器用于控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果;
[0227]
所述控制器还用于对所述第一中间结果进行处理得到第一矩阵和第二矩阵的乘积。
[0228]
条款a2.根据条款a1所述的处理器,
[0229]
控制器控制处理元件、存储在寄存器内的转置矩阵和第二矩阵重复以下过程,直到转置矩阵或第二矩阵中的元素恢复到未滚动时的位置:
[0230]
所述控制器用于控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,控制存储在寄存器中的转置矩阵或第二矩阵在行方向或列方向滚动一行或一列。
[0231]
条款a3.根据条款a1或a2所述的处理器,
[0232]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,控制器控制转置矩阵中的元素在行方向上滚动,或者控制第二矩阵中的元素在行方向上滚动;控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果;
[0233]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,控制器控制转置矩阵中的元素在列方向上滚动、或者控制第二矩阵中的元素在列方向上滚动;控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果。
[0234]
条款a4.根据条款a1或a2所述的处理器,
[0235]
所述控制器将第一中间结果按行或者按列存储,在行方向或者列方向进行滚动后得到第一矩阵和第二矩阵的乘积。
[0236]
条款a5.根据条款a1-a4任意一项所述的处理器,所述控制器还用于根据处理元件的排列以及输入矩阵的行秩以及列秩确定是否对输入矩阵进行分块,其中,输入矩阵包括左乘矩阵和右乘矩阵;
[0237]
若要对输入矩阵中的一个矩阵进行分块,控制器根据处理元件的排列对左乘矩阵的行进行拆分或者对右乘矩阵的列进行拆分;
[0238]
若要对输入矩阵中的两个矩阵都进行分块,控制器根据处理元件的排列以及输入矩阵的行秩和列秩对左乘矩阵列方向和右乘矩阵行方向以相同的方式进行分块;
[0239]
对左乘矩阵分块后得到两个以上所述第一矩阵,对右乘矩阵分块后得到两个以上所述第二矩阵,或者,对左乘矩阵分块后得到两个以上所述第二矩阵,对右乘矩阵分块后得到两个以上所述第一矩阵。
[0240]
条款a6.根据条款a5所述的处理器,
[0241]
所述控制器还用于根据第一矩阵和第二矩阵的乘积计算所述左乘矩阵和所述右乘矩阵的乘积。
[0242]
条款a7.根据条款a5所述的处理器,所述处理器包括多组寄存器,
[0243]
所述控制器还用于在对所述输入矩阵进行分块后,将两个以上所述第一矩阵进行转置得到转置矩阵;
[0244]
控制器将转置矩阵、和两个以上所述第二矩阵加载到所述多组寄存器中堆叠存储,一组寄存器中存储有对应位置的转置矩阵和第二矩阵;
[0245]
在每次对转置矩阵或第二矩阵中的元素在行方向或列方向滚动一次之前,控制器控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果;
[0246]
在控制一组寄存器中的元素在行或列方向上滚动一行或一列转置矩阵之后,控制器还对滚动结果进行修正。
[0247]
条款a8.根据条款a7所述的处理器,对滚动结果进行修正包括:
[0248]
若在行方向上向左滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一列数据滚动到相邻的前一块转置矩阵数据的最后一列;
[0249]
若在行方向上向右滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一列数据滚动到相邻的后一块转置矩阵数据的第一列;
[0250]
若在列方向上向上滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一行数据滚动到相邻的前一块转置矩阵数据的最后一行;
[0251]
若在列方向上向下滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一行数据滚动到相邻的后一块转置矩阵数据的第一行;
[0252]
其中,每一块转置矩阵是指对分块之后的每一块矩阵进行转置之后的矩阵。
[0253]
条款a9.一种基于处理元件矩阵的矩阵乘的运算方法,应用于处理器,所述处理器包括两个以上处理元件,所述两个以上处理元件以二维矩阵排列,处理元件包括至少一个寄存器,所述方法实现对第一矩阵和第二矩阵的矩阵乘法运算,所述方法包括:
[0254]
将第一矩阵进行转置得到转置矩阵,将所述转置矩阵和所述第二矩阵的各元素分别加载到各处理元件的寄存器中,所述转置矩阵和所述第二矩阵对应位置的元素存储在同一处理元件的寄存器中;
[0255]
控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果;
[0256]
对所述第一中间结果进行处理得到第一矩阵和第二矩阵的乘积。
[0257]
条款a10.根据条款a9所述的运算方法,控制所述转置矩阵或者第二矩阵在行方向或者列方向滚动,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积、将同一行或同一列的元素乘积求和得到第一中间结果,包括,重复以下过程直到转置矩阵或第二矩阵中的元素恢复到未滚动时的位置:
[0258]
控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果,在处理元件的矩阵中对转置矩阵或第二矩阵在行方向或列方向滚动一行或一列。
[0259]
条款a11.根据条款a9或a10所述的方法,
[0260]
在第一矩阵为左乘矩阵、第二矩阵为右乘矩阵时,控制转置矩阵中的元素在行方向上滚动,或者控制第二矩阵中的元素在行方向上滚动;控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一列的元素乘积求和得到第一中间结果;
[0261]
在第一矩阵为右乘矩阵、第二矩阵为左乘矩阵时,控制转置矩阵中的元素在列方向上滚动、或者控制第二矩阵中的元素在列方向上滚动;控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行的元素乘积求和得到第一中间结果。
[0262]
条款a12.根据条款a9或a10所述的方法,将所述第一中间结果进行处理得到所述第一矩阵和第二矩阵的乘积,包括:
[0263]
将第一中间结果按行或者按列存储,在行方向或者列方向进行滚动后得到第一矩阵和第二矩阵的乘积。
[0264]
条款a13.根据条款a9-a12任意一项所述的方法,所述方法还包括:
[0265]
根据处理元件的排列以及输入矩阵的行秩以及列秩确定是否对输入矩阵进行分块,其中,输入矩阵包括左乘矩阵和右乘矩阵;
[0266]
若要对输入矩阵中的一个矩阵进行分块,根据处理元件的排列对左乘矩阵的行进行拆分或者对右乘矩阵的列进行拆分;
[0267]
若要对输入矩阵中的两个矩阵都进行分块,根据处理元件的排列以及输入矩阵的行秩和列秩对左乘矩阵列方向和右乘矩阵行方向以相同的方式进行分块;
[0268]
对左乘矩阵分块后得到两个以上所述第一矩阵,对右乘矩阵分块后得到两个以上所述第二矩阵,或者,对左乘矩阵分块后得到两个以上所述第二矩阵,对右乘矩阵分块后得到两个以上所述第一矩阵。
[0269]
条款a14.根据条款a13所述的方法,所述方法还包括:
[0270]
根据第一矩阵和第二矩阵的乘积计算所述左乘矩阵和所述右乘矩阵的乘积。
[0271]
条款a15.根据条款a13所述的方法,所述处理器包括多组寄存器,
[0272]
所述方法还包括:
[0273]
在对所述输入矩阵进行分块后,将两个以上所述第一矩阵进行转置得到转置矩阵;
[0274]
在所述多组寄存器中堆叠存储所述转置矩阵、和两个以上所述第二矩阵,一组寄存器中存储有对应位置的转置矩阵和第二矩阵;
[0275]
在每次对转置矩阵或第二矩阵中的元素在行方向或列方向滚动一次之前,控制处理元件对相应的寄存器内的元素进行乘法运算得到元素乘积,对同一行或者同一列的元素乘积求和得到第一中间结果;
[0276]
在控制一组寄存器中的元素在行或列方向上滚动一行或一列转置矩阵之后,对滚动结果进行修正。
[0277]
条款a16.根据条款a15所述的方法,对滚动结果进行修正包括:
[0278]
若在行方向上向左滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一列数据滚动到相邻的前一块转置矩阵数据的最后一列;
[0279]
若在行方向上向右滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一列数据滚动到相邻的后一块转置矩阵数据的第一列;
[0280]
若在列方向上向上滚动,则修正的方式为,将滚动之后每一块转置矩阵内最后一行数据滚动到相邻的前一块转置矩阵数据的最后一行;
[0281]
若在列方向上向下滚动,则修正的方式为,将滚动之后每一块转置矩阵内第一行数据滚动到相邻的后一块转置矩阵数据的第一行;
[0282]
其中,每一块转置矩阵是指对分块之后的每一块矩阵进行转置之后的矩阵。
[0283]
条款a17.一种人工智能芯片,所述芯片包括如条款a1-a8中任意一项所述的处理器。
[0284]
条款a18.一种电子设备,包括如条款a17所述的人工智能芯片。
[0285]
以上对本公开实施例进行了详细介绍,本文中应用了具体个例对本公开的原理及实施方式进行了阐述,以上实施例的说明仅用于帮助理解本公开的方法及其核心思想。同时,本领域技术人员依据本公开的思想,基于本公开的具体实施方式及应用范围上做出的改变或变形之处,都属于本公开保护的范围。综上所述,本说明书内容不应理解为对本公开的限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜