运算指令的执行方法、装置、电路、处理器及设备与流程
未命名
09-29
阅读:88
评论:0
1.本技术实施例涉及计算机技术领域,特别涉及一种运算指令的执行方法、装置、电路、处理器及设备。
背景技术:
2.随着计算机技术的发展与进步,计算机系统中的cpu(central processing unit,中央处理器)可以实现高效的矩阵运算。
3.相关技术提供了一系列risc(reduced instruction set computer,精简指令集计算机)模式的指令,如wmma.load(矩阵搬运指令)、wmma.store(矩阵存储指令)、wmma.mma(矩阵乘加指令)等。
4.然而,在risc模式下,每条指令只能实现一次运算量固定大小的操作,因此,如果要处理更大的矩阵运算,程序员需要设置更多的指令,以及更多用于不同操作的指令,这可能会导致程序变得更加复杂,进而导致矩阵运算的实现较为复杂。
技术实现要素:
5.本技术实施例提供了一种运算指令的执行方法、装置、电路、处理器及设备,能够简化矩阵乘矩阵运算的实现,提高矩阵乘矩阵运算的实现效率。所述技术方案包括如下内容。
6.根据本技术实施例的一个方面,提供了一种运算指令的执行方法,所述方法包括:
7.执行第一加载指令,从数据存储单元中加载得到第一矩阵数据;
8.对于所述数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到所述行数据向量,所述行数据向量以所述第二矩阵数据中的行元素构建;
9.执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;
10.执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;
11.其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,基于各个所述行数据向量分别对应的乘运算结果确定。
12.根据本技术实施例的一个方面,提供了一种运算指令的执行装置,所述装置包括:
13.第一矩阵加载模块,用于执行第一加载指令,从数据存储单元中加载得到第一矩阵数据;
14.行向量加载模块,用于对于所述数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到所述行数据向量,所述行数据向量以所述第二矩阵数据中的行元素构建;
15.运算结果获取模块,用于执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;
16.运算结果存储模块,用于执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,基于各个所述行数据向量分别对应的乘运算结果确定。
17.根据本技术实施例的一个方面,提供了一种矩阵计算电路,该矩阵计算电路用于实现上述运算指令的执行方法。
18.根据本技术实施例的一个方面,提供了一种处理器,该处理器包括矩阵计算电路,该矩阵计算电路用于实现上述运算指令的执行方法。
19.根据本技术实施例的一个方面,提供了一种计算机设备,所述计算机设备包括处理器,所述处理器中的矩阵计算电路用于实现上述运算指令的执行方法。
20.可选地,所述计算机设备还包括存储器,所述存储器中存储有运算指令,所述运算指令由所述矩阵计算电路加载并执行。
21.本技术实施例提供的技术方案可以包括如下有益效果。
22.通过支持向量乘矩阵运算的复杂运算指令(即可支持多类型操作的指令),实现矩阵的搬运、矩阵乘矩阵运算和乘运算结果的存储,相比于相关技术中需要多种不同类型的risc模式的指令,且每种类型对应较多数量的指令才能实现上述过程,避免了用于实现矩阵乘矩阵运算的程序的复杂化,进而简化了矩阵乘矩阵运算的实现,尤其是运算量较大的矩阵乘矩阵运算场景。同时,相比于risc模式的指令,由于复杂运算指令(如cisc(complex instruction set computer,复杂指令集计算机)模式的指令)的指令效率可提升上百倍,使得矩阵乘矩阵运算的实现效率更高。
附图说明
23.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
24.图1是本技术一个实施例提供的运算指令处理系统的示意图;
25.图2是本技术一个实施例提供的运算指令的执行方法的流程图;
26.图3是本技术一个实施例提供的行数据向量的加载方法的流程图;
27.图4是本技术一个实施例提供的向量乘矩阵的示意图;
28.图5是本技术一个实施例提供的矩阵乘矩阵的示意图;
29.图6是本技术一个实施例提供的行数据向量对应的乘运算结果的调整方法的示意图;
30.图7是本技术一个实施例提供的运算指令的执行装置的框图;
31.图8是本技术另一个实施例提供的运算指令的执行装置的框图;
32.图9是本技术一个实施例提供的计算机设备的框图。
具体实施方式
33.在对本技术实施例进行介绍说明之前,首先对本技术中涉及的相关名词进行解释说明。
34.1、risc(reduced instruction set computer):精简指令集计算机,是一种采用少量计算机指令的微处理器架构,其对应的计算机指令集非常简洁,往往需要多个计算机指令来实现某一种操作。
35.2、cisc(complex instruction set computer):复杂指令集计算机,是一种采用大量复杂计算机指令集的微处理器架构,其对应的计算机指令集包括许多复杂的计算机指令,以能够一次性完成多种操作。
36.3、vmm(vector matrix multiplication):向量矩阵乘法运算,即向量乘矩阵,其广泛用于傅里叶变换、线性方程求解等,在图像处理、波束成形、雷达探测、无线通信等领域都有着重要应用。例如,通过将一维向量与二维矩阵中的每列元素分别进行点积求和操作,即可得到一个长度与二维矩阵的列数相同的一维向量。
37.4、vmma(warp mixed-precision matrix multiply accumulate):线程束混合精度矩阵乘累加,即以warp粒度进行矩阵乘累加,以进行加速。例如,通过一个warp内部的线程,完成矩阵a的分块和矩阵b的分块之间的矩阵乘累加操作。
38.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
39.请参考图1,其示出了本技术一个实施例提供的运算指令处理系统的示意图,该运算指令处理系统包括指令存储单元101、控制单元102、dma(direct memory access,直接内存访问)电路103、矩阵计算电路104和数据存储单元105。
40.指令存储单元101用于存储计算机指令(以下简称为指令)。可选地,本技术实施例中的计算机指令可以是指微指令。示例性地,该计算机指令可以是指诸如加载指令(如矩阵加载指令)、运算指令(如矩阵运算指令)、存储指令(如矩阵存储指令)等。例如,与矩阵相关的微指令,可以使得程序员能够直接对矩阵进行操作,从而提高运算效率。指令存储单元101中的指令可由程序员根据实际使用需求设计得到,本技术实施例对此不作限定。
41.控制单元102与指令存储单元101相连接,其用于从指令存储单元101中获取指令,以及对指令进行译码,并将译码后的指令发送至矩阵计算电路104内部的指令队列中。
42.矩阵计算电路104用于对根据指令队列中的指令,对矩阵数据进行操作,诸如矩阵搬运、矩阵运算、矩阵存储等。示例性地,矩阵计算电路104可根据指令队列,驱动dma电路103从数据存储单元105中加载得到矩阵数据,矩阵计算电路104再根据运算指令进行矩阵运算,得到运算结果,矩阵计算电路104最后根据运算指令,将运算结果存储至数据存储单元105中。
43.数据存储单元105用于存储数据,如矩阵数据、矩阵数据的存储地址等。数据存储单元105与dma电路103之间通过数据总线bus连接,以实现数据的传输。示例性地,对于数据存储单元105中的b矩阵,dma电路103可通过对应的bus b进行搬运,并可存储至矩阵计算电路104中对应的b矩阵缓存。对于数据存储单元105中的c矩阵(如偏置向量),dma电路103也可通过对应的bus b进行搬运。对于数据存储单元105中的a矩阵,dma电路103也可通过对应的bus a进行搬运。对于矩阵计算电路104计算得到的运算结果d,dma电路103可通过对应的bus d进行搬运。
44.其中,a矩阵和b矩阵可以是指待进行矩阵运算的两个矩阵;a矩阵也可以是指卷积核对应的矩阵数据,b矩阵也可以是指待被卷积的特征图数据(如像素区域),本技术实施例
对此不作限定。
45.在一个示例中,本技术实施例中的指令集是针对vmm架构构建得到的csic指令集,该csic指令集包括多种csic模式下的指令(即复杂指令)。示例性地,该csic指令集包括r-vmm指令、b矩阵加载指令和bias向量加载指令。其中,r-vmm指令用于实现a矩阵对应的行数据向量加载、向量乘矩阵运算和乘运算结果存储,b矩阵加载指令用于实现b矩阵的加载,bias向量加载指令用于实现bias(偏置)向量的加载。这些指令可以大大简化矩阵运算的实现过程,从而提高运算效率和性能表现。
46.由于csic模式可以支持更多的指令类型和操作,因此上述r-vmm指令可以更好地适应矩阵运算和卷积运算的特有运算模式,从而实现了高效加速。相比risc模式,cisc模式的指令效率提升了上百倍,这使得矩阵运算和卷积运算的计算速度得到了大幅提升。
47.可选地,本技术实施例中的r-vmm指令(运算指令)基于vmm架构构建得到,也即其支持向量乘矩阵运算,进而实现矩阵运算。
48.可选地,在该运算指令每次仅获取a矩阵中的一个元素的情况下,该运算指令可用于实现a矩阵中的各个元素,与b矩阵中对应的各个元素之间的加权求和,进而实现卷积运算。
49.例如,参考图1,本技术实施例中的运算指令按照描述通过bus a,可从数据存储单元105中加载出a矩阵对应的一条条行数据向量,并在矩阵计算电路104内部与b矩阵进行向量乘矩阵运算,得到各个行数据向量分别对应的乘运算结果,然后将各个行数据向量分别对应的乘运算结果,通过busd回写到数据存储单元105中。在行数据向量包括多个元素的情况下,可以基于各个行数据向量分别对应的乘运算结果,获取a矩阵和b矩阵的乘运算结果;在行数据向量包括一个元素的情况下,可以基于各个行数据向量分别对应的乘运算结果,获取a矩阵(即卷积核)针对b矩阵的卷积结果。
50.在一个示例中,上述运算指令处理系统可以部署在终端设备中,也可以部署中在服务器中,以提供矩阵运算服务和卷积运算服务,本技术实施例对此不作限定。其中,终端设备可以是诸如手机、平板电脑、游戏主机、多媒体播放设备、pc(personal computer,个人计算机)、智能机器人、车载终端等电子设备。服务器可以是一台服务器,也可以是由多台服务器组成的服务器集群,或者是一个云计算服务中心。可选地,上述矩阵计算电路104可单独实现为芯片,也可部署在上述运算指令处理系统中实现为芯片,本技术实施例对此不作限定。
51.本技术实施例提供的技术方案可以适用于任何需要矩阵运算或卷积运算的场景中,诸如任何涉及向量乘矩阵的场景、任何涉及矩阵乘矩阵的场景,以及任何涉及卷积运算场景等。
52.例如,在人工智能云端推理和训练处理器芯片设计场景(如大规模数据处理和深度学习应用)中,矩阵计算电路的加速是至关重要的组成部分,因为它能显著提高计算效率和性能。鉴于人工智能领域中卷积运算和矩阵运算的特点,开发一个高效的指令集对于实现业务泛化具有重要意义。一个优化的指令集可以为各种ai(artificial intelligence,人工智能)应用提供更强大的支持,从而在云端和边缘设备上实现更高效的计算和推理。通过综合考虑卷积运算和矩阵运算的特性,本技术实施例设计出的高效csic指令集,有助于提高计算性能,降低能耗,缩短推理和训练时间,从而为用户带来更好的体验和更广泛的应
用场景。
53.下文将采用方法实施例对本技术实施例提供的技术方案进行详细说明。
54.请参考图2,其示出了本技术一个实施例提供的运算指令的执行方法的流程图,该方法各步骤的执行主体可以是图1中的矩阵计算电路104,该方法可以包括如下几个步骤(步骤201~步骤204)。
55.步骤201,执行第一加载指令,从数据存储单元中加载得到第一矩阵数据。
56.可选地,上述矩阵计算电路执行第一加载指令,以驱动dma电路,通过第一矩阵数据对应的数据总线,从数据存储单元中加载得到第一矩阵数据。
57.其中,第一加载指令是指用于加载第一矩阵数据的复杂指令。例如,该第一加载指令为上述的b矩阵加载指令,其用于辅助运算指令对应的运算。
58.本技术实施例中的矩阵数据是指以矩阵形式排布的数据。第一矩阵数据可以是指待被处理的矩阵数据,如尺寸为k*n的矩阵数据,k和n为正整数。第一矩阵数据中的各个元素在数据存储单元中对应有存储地址,以标识第一矩阵数据的存储位置。
59.例如,第一矩阵数据是由矩阵中的各个元素组成,第一矩阵数据也可以是由特征图中的各个元素(如像素值)组成,本技术实施例对此不作限定。
60.在一个示例中,第一加载指令配置有第一起始地址参数、第一计算模式参数和尺寸配置参数。
61.其中,第一起始地址参数用于指示第一矩阵数据在数据存储单元中的起始地址,如第一矩阵数据中的第一个元素在数据存储单元中的存储地址。
62.第一计算模式参数用于指示第一矩阵数据的计算模式和类型。示例性地,计算类型可以包括以下至少一项:bf16、f16、f32、tf32、b8和fp8。计算模式可以包括以下至少一项:m1k32n32、m1k64n64和m2k32n32。其中,n的大小代表一个输出的基本向量的长度,k的大小代表一个输入向量的基本长度。
63.尺寸配置参数用于指示第一矩阵数据对应的第一子矩阵的尺寸和步幅,第一子矩阵可以是指第一矩阵数据中的子矩阵,如将第一矩阵数据均匀划分成多个子矩阵,则该子矩阵即为第一矩阵数据对应的第一子矩阵。第一子矩阵的尺寸用于描述第一矩阵的大小,第一子矩阵的步幅用于描述第一矩阵在数据存储单元中对应的存储地址的跨度。
64.示例性地,第一加载指令的表现形式为:;
65.其中,xm为第一计算模式参数,其描述了指令的计算类型、计算模式等固定配置,xt为尺寸配置参数,其描述了第一子矩阵的大小和步幅配置,[xs]为第一起始地址参数,其描述了b矩阵在数据存储单元中的起始地址。
[0066]
由于该第一加载指令提供了第一子矩阵的大小和步幅配置,因此该第一加载指令可以从数据存储单元中的一个大矩阵中截取一个小矩阵,并加载到矩阵计算电路内部的寄存器上。
[0067]
示例性地,第一矩阵数据的加载过程可以包括如下内容。
[0068]
1、执行第一加载指令,基于第一起始地址参数和尺寸配置参数,确定各个第一子矩阵的存储地址。
[0069]
可选地,对于各个第一子矩阵,基于第一起始地址参数和第一子矩阵的步幅配置,可以确定出第一子矩阵的起始地址,再结合第一子矩阵的尺寸配置,即可确定出第一子矩
阵中各个元素的存储地址,进而确定出第一子矩阵的存储地址。
[0070]
其中,由于矩阵计算电路的片上存储有限,对于一些大矩阵数据,可以将其切分成多个小矩阵,利用vmma方法进行计算。
[0071]
2、执行第一加载指令,依次从数据存储单元中加载得到各个第一子矩阵。
[0072]
执行第一加载指令,根据各个第一子矩阵的存储地址,从数据存储单元中加载得到各个第一子矩阵。可选地,对于小矩阵数据,可以一次性将第一矩阵数据加载到矩阵计算电路中;对于大矩阵数据,每次运算时,可以单独将第一子矩阵加载到矩阵计算电路中,本技术实施例对此不作限定。
[0073]
步骤202,对于数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到行数据向量,该行数据向量以第二矩阵数据中的行元素构建。
[0074]
可选地,上述矩阵计算电路执行第一运算指令,以驱动dma电路,通过第二矩阵数据对应的数据总线,从数据存储单元中依次加载得到第二矩阵数据对应的各个行数据向量。
[0075]
本技术实施例中的第一运算指令(即上述的r-vmm指令)是基于vmm架构建构的复杂运算指令,其支持矩阵搬运、矩阵运算和矩阵存储。其中,矩阵运算是指向量乘矩阵运算。
[0076]
第二矩阵数据是指待与第一矩阵数据进行运算的另一矩阵数据。可选地,第二矩阵数据可以由向量中的各个元素组成,如长度为k的一维向量。第二矩阵数据也可以由矩阵中的各个元素组成。第二矩阵数据还可以由卷积核对应的参数组成,如大小为3*3的卷积核,本技术实施例对此不作限定。
[0077]
行数据向量可以是指一维向量数据,行数据向量可以以第二矩阵数据中的整行元素为元素构建得到,如对于4*4的矩阵数据,可以将4行元素分别构建成4个行数据向量。行数据向量也可以以第二矩阵数据中的第二子矩阵的整行元素为元素构建得到,如对于9*9的矩阵数据,可以被划分成9个3*3的第二子矩阵,对于每个第二子矩阵,可以将3行元素分别构建成3个行数据向量。行数据向量还可以以第二矩阵数据中的单个元素构建得到,如对于2*2的矩阵数据,可以将4个元素分别构建成4个行数据向量。行元素可以是指以行为角度对元素进行称呼的元素。
[0078]
行数据向量还可以是指二维向量数据,三维向量数据等,本技术实施例对行数据向量的构建不作限定,其可以根据实际使用需求进行设置与调整。
[0079]
在一个示例中,上述第一运算指令为多层循环的vmm指令,也即第一运算指令可以看作是vmm指令在第一矩阵数据上的循环,每层循环可用于完成至少一个行数据向量的加载、运算和存储,如此可使得矩阵计算电路根据第一运算指令,从数据存储单元中获取第一矩阵数据对应的一条条行数据向量。
[0080]
可选地,第一运算指令配置有第二起始地址参数、第二计算模式参数、循环步幅参数和循环次数参数。
[0081]
其中,第二起始地址参数用于指示第二矩阵数据在数据存储单元中的起始地址,如第二矩阵数据中的第一个元素在数据存储单元中的存储地址。
[0082]
第二计算模式参数用于指示行数据向量的长度。第二计算模式参数可用于描述第一运算指令的计算类型、计算模式等固定配置,根据计算模式等固定配置,可确定行数据向量的长度。例如,对于m1k32n32,行数据向量的长度为32。
[0083]
循环步幅参数用于指示行数据向量在第二矩阵数据中的位置。循环步幅参数描述了各层循环加载时,行数据向量在数据存储单元中的存储地址的跨度,根据该存储地址的跨度,可确定行数据向量的位置。
[0084]
循环次数参数用于指示行数据向量的加载数量。循环次数参数描述了各层循环的循环次数,根据各层循环的循环次数可确定出行数据向量的加载数量。
[0085]
可选地,第一运算指令的表现形式为:
[0086]
;
[0087]
其中,xm为第二计算模式参数,xt为循环步幅参数,为循环次数参数,[xs]为第二起始地址参数,[xd]描述了行数据向量对应的乘运算结果在数据存储单元中的起始存储地址。
[0088]
示例性地,以两层循环为例,第一层循环为第二层循环的嵌套,如第一层循环和第二层循环均为for函数,第一层循环对应的for函数可以嵌套在第二层循环对应的for函数中。
[0089]
可选地,循环步幅参数包括第一层循环步幅参数和第二层循环步幅参数,循环次数参数包括第一层循环次数参数和第二层循环次数参数。其中,第一层循环步幅参数用于指示第一层循环加载时行数据向量在第二矩阵数据中的位置,第二层循环步幅参数用于指示第二层循环加载时行数据向量在第二矩阵数据中的位置,第一层循环次数参数用于指示第一层循环加载对应的循环次数,第二层循环次数参数用于指示第二层循环加载对应的循环次数。
[0090]
在一个示例中,如图3所示,步骤202还可以包括如下几个子步骤。
[0091]
步骤202a,执行第一运算指令,基于第二起始地址参数、第二计算模式参数、循环步幅参数和循环次数参数,得到行数据向量在数据存储单元中的存储地址。
[0092]
可选地,根据循环次数参数可以确认出行数据向量的数量,对于每个行数据向量,可以根据第二起始地址参数、循环步幅参数和循环次数参数,确定出该行数据向量对应的起始地址,再结合第二计算模式参数,可以确定出该行数据向量中各个元素分别对应的存储地址,进而得到该行数据向量在数据存储单元中的存储地址。
[0093]
示例性地,以两层循环为例,行数据向量在数据存储单元中的存储地址可以表示为:
[0094]
vecinaddr(i,j)=[xs]+i*src_stride1+j* src_stride2;
[0095]
其中,i为第一层循环次数参数,j为第二层循环次数参数,[xs]为第二起始地址参数,src_stride1为第一循环步幅参数,src_stride2为第二循环步幅参数。
[0096]
在第一层循环加载时,执行第一运算指令,基于第二起始地址参数、第二计算模式参数、第一循环步幅参数和第一层循环次数参数在当前时刻下的值,得到行数据向量在数据存储单元中的存储地址。
[0097]
例如,第一层循环次数参数为2,第二层循环次数参数为2,则i=0和1,j=0和1。在第一层循环加载时,可以得到两个行数据向量对应的存储地址:
[0098]
vecinaddr(0,0)=[xs]和vecinaddr(1,0)=[xs] +src_stride1。
[0099]
在第二层循环加载时,执行第一运算指令,基于第二起始地址参数、第二计算模式参数、第一循环步幅参数、第二循环步幅参数、第一层循环次数参数在当前时刻下的值和第
二层循环次数参数在当前时刻下的值,得到行数据向量在数据存储单元中的存储地址。
[0100]
例如,基于上述实施例,在第二层循环加载时,又可以得到两个行数据向量对应的存储地址:
[0101]
vecinaddr(0,1)=[xs]+src_stride2和vecinaddr(1,1)=[xs]+ src_stride1+ src_stride2。
[0102]
本技术通过将第一运算指令设置多层循环的vmm指令,使得用户可以根据需求进行行数据向量的尺寸和行数据数量的个数进行灵活调整,从而提高了的第一运算指令的灵活性和通用性,进而提高了矩阵运算和卷积运算的灵活性和通用性。
[0103]
另外,由于通过设置循环次数参数,可使得一个第一运算指令可实现多个向量乘矩阵运算,从而进一步提高了矩阵运算和卷积运算的实现效率,以及程序的复杂度。
[0104]
步骤202b,执行第一运算指令,根据行数据向量在数据存储单元中的存储地址,从数据存储单元中加载得到行数据向量。
[0105]
执行第一运算指令,依次根据各个行数据向量分别对应的存储地址,从数据存储单元中加载得到多个行数据向量,如第一层循环次数参数
×
第二层循环次数参数个行数据向量。
[0106]
可选地,在第二矩阵数据被划分成多个第二子矩阵的情况下,第一层循环加载可用于加载第一个第二子矩阵中的行数据向量,第二层循环加载可用于加载第二个第二子矩阵中的行数据向量,第一层循环加载和第二层循环加载也可以均用于加载第一个第二子矩阵中的行数据向量,本技术实施例对此不作限定。
[0107]
步骤203,执行第一运算指令,对行数据向量与第一矩阵数据进行向量乘矩阵运算,得到行数据向量对应的乘运算结果。
[0108]
可选地,矩阵计算电路在每获取一个行数据向量后,即对该行数据向量与第一矩阵数据进行向量乘矩阵运算,得到该行数据向量对应的乘运算结果。其中,乘运算结果是指向量乘矩阵运算的结果。
[0109]
在本技术实施例中,可通过对循环步幅参数进行设置,来灵活调整第一运算指令所获取的行数据向量的长度,如此使得第一运算指令既可用于矩阵运算,又可用于卷积运算,从而实现矩阵运算和卷积运算的统一,无需分别为矩阵运算和卷积运算单独构建一套指令,也无需构建能够支持两种运算模式的内部硬件架构,从而可以有效减少算法实现的复杂度和代码量,同时也可以提高计算效率和资源利用率。
[0110]
在使用第一运算指令实现矩阵运算的情况下,行数据向量可以包括多个元素,该多个元素按照在第一矩阵数据中所在行的顺序依次排列。乘运算结果的获取过程可以如下:执行第一运算指令,对行数据向量中的各个元素,与第一矩阵数据中的各列元素分别进行点积求和,得到行数据向量对应的乘运算结果。
[0111]
例如,参考图4,行数据向量401是长度为k的一维向量,第一矩阵数据402是大小为k*n的矩阵数据,将行数据向量401中的k个元素,分别与第一矩阵数据402中的第一列元素、第二列元素、
……
、第n列元素进行点击求和,即可得到乘运算结果403对应的n个元素,该n个元素依次排序即可得到行数据向量401的乘运算结果403。
[0112]
可选地,在第二矩阵数据为向量(即行数为1的矩阵)的情况下,第二矩阵数据和第一矩阵数据的乘运算结果,即为行数据向量对应的乘运算结果。
[0113]
在第二矩阵数据为矩阵(即行数大于1的矩阵)的情况下,第二矩阵数据和第一矩阵数据的乘运算结果,以各个行数据向量分别对应的乘运算结果为元素构建得到。例如,对于2*3的a矩阵,3*2的b矩阵,第一个行数据向量对应的2个乘运算结果,为a矩阵乘b矩阵的乘运算结果中第一行两个元素,第二个行数据向量对应的2个乘运算结果,为a矩阵乘b矩阵的乘运算结果中第二行两个元素。
[0114]
在第一矩阵数据和第二矩阵数据为大矩阵数据(如超过矩阵计算电路的片上内存)的情况下,可以采用wmma方法进行矩阵运算。示例性地,可以分别对第一矩阵数据和第二矩阵数据进行划分,根据划分得到的子矩阵实现矩阵运算。例如,第一矩阵数据被划分成m个第一子矩阵,第二矩阵数据被划分成n个第二子矩阵,上述行数据向量为第二子矩阵对应的行数据向量,m和n为正整数。
[0115]
其中,第一子矩阵和第二子矩阵的大小可以根据矩阵计算电路的片上内存确定。上述行数据向量可以基于第二子矩阵中的整行元素构建得到。
[0116]
示例性地,乘运算结果的获取过程还可以如下:执行第一运算指令,对行数据向量中的各个元素,与行数据向量所在的目标第二子矩阵在第一矩阵数据中对应的目标第一子矩阵的各列元素分别进行点积求和,得到行数据向量与目标第一子矩阵对应的乘运算结果。
[0117]
例如,参考图5,第二矩阵数据501被划分成9个第二子矩阵:a11、a12、a13、a21、a22、a23、a31、a32和a33。第一矩阵数据502被划分成9个第一子矩阵:b11、b12、b13、b21、b22、b23、b31、b32和b33。以行数据向量所在的目标第二子矩阵是a11为例,a11在第二矩阵数据502中对应的目标第一子矩阵有b11、b12和b13,也即在第二矩阵数据501乘第一矩阵数据502的过程中,a11需要分别和b11、b12和b13进行相乘。
[0118]
以a11与b11相乘为例,a11对应的各个行数据向量,需要分别与b11进行向量乘矩阵运算。在第一运算指令对a11进行运算之前,先将b11加载至矩阵计算电路,通过配置b11的尺寸配置参数,如大小[row,col](行数和列数)和步幅strideb=b_col_size(即b11在第二矩阵数据502中的位置),即可完成b11的加载。对于a11,可以将a11对应的循环次数参数设置为a11的行数,循环步幅参数设置为a11对应的列数,如此可通过一个第一运算指令完成a11的加载和运算。
[0119]
可选地,目标第二子矩阵与目标第一子矩阵的乘运算结果,以目标第二子矩阵中各个行数据向量分别与目标第一子矩阵对应的乘运算结果为元素构建得到。例如,a11与b11的乘运算结果,以a11对应的各个行数据向量与b11的乘运算结果为元素构建得到,记为a11*b11。
[0120]
可选地,第二矩阵数据中的第二子矩阵行,与第一矩阵数据中对应的第一子矩阵列的乘运算结果为,第二子矩阵行中各个第一子矩阵,分别与第一子矩阵列中对应的第一子矩阵的乘运算结果的和值。
[0121]
其中,第二子矩阵行是以第二子矩阵为行元素组成,如可将a11、a12和a13确定为第二子矩阵行。第一子矩阵列是以第一子矩阵为列元素组成,如可将b11、b21和b31确定为第一子矩阵列。
[0122]
a11、a12和a13在第一矩阵数据中对应的矩阵列有:b11、b21和b31,b12、b22和b32,b13、b23和b33。
[0123]
以a11、a12和a13,与b11、b21和b31为例,d11= a11*b11+a12*b21+a13*b31;其中,d11为第二矩阵数据501中的第一个第二子矩阵行与第一矩阵数据中的第一个第一矩阵列之间的乘运算结果。
[0124]
依次类推,d12= a11*b12+a12*b22+a13*b32;
[0125]
d13= a11*b13+a12*b23+a13*b33;
[0126]
d21= a21*b11+a22*b21+a23*b31;
[0127]
d22= a21*b12+a22*b22+a23*b32;
[0128]
d23= a21*b13+a22*b23+a23*b33;
[0129]
d31= a31*b11+a32*b21+a33*b31;
[0130]
d32= a31*b12+a32*b22+a33*b32;
[0131]
d33= a31*b13+a32*b23+a33*b33。
[0132]
可选地,第二矩阵数据与第一矩阵数据的乘运算结果,以第二矩阵数据中的各个第二子矩阵行,分别与第一矩阵数据中对应的第一子矩阵列的乘运算结果为元素构建得到。
[0133]
示例性地,按照第二子矩阵行与第一子矩阵列之间的运算顺序,并以第一子矩阵列的个数为行元素个数,对第二子矩阵行与第一子矩阵列的乘运算结果进行排序,即可得到第二矩阵数据与第一矩阵数据的乘运算结果。
[0134]
例如,对于第二矩阵数据501与第一矩阵数据502的乘运算结果,第一行元素为d11、d12和d13,第二行元素为d21、d22和d23,第三行元素为d31、d32和d33。
[0135]
可选地,在第一矩阵数据或第二矩阵数据为大矩阵数据的情况下,可以对第一矩阵数据或第二矩阵数据进行划分,以使得矩阵计算电路能够完成第一矩阵数据和第二矩阵数据的运算。
[0136]
在使用第一运算指令实现卷积运算的情况下,上述行数据向量包括一个元素。其中,第二矩阵数据可以实现为卷积核,第一矩阵数据可以实现为特征图数据(如像素区域)。
[0137]
可选地,通过设置循环步幅参数,可以使得第一运算指令每次可加载第二矩阵数据中的一个元素。或者,结合设置循环次数参数,可以使得第一运算指令在一次执行过程中,可依次加载多个一个元素,以依次进行运算。
[0138]
示例性地,行数据向量对应的乘运算结果还可以如下:执行第一运算指令,对行数据向量中的一个元素,与该一个元素在第一矩阵数据中对应位置的元素进行相乘,得到行数据向量对应的乘运算结果。
[0139]
例如,对于卷积核(即第二矩阵数据),像素区域(即第一矩阵数据),第一运算指令可以依次将g1-g9作为行数据向量,以g1为例,g1在r中对应的元素为r1,则g1和r1的乘运算结果为:g1*r1。
[0140]
可选地,第二矩阵数据和第一矩阵数据的乘运算结果为各个向数据量分别对应的
乘运算结果的和值。
[0141]
例如,卷积核g和像素区域r的乘运算结果(即卷积结果)为:g1*r1+ g2*r2+ g3*r3+ g4*r4+ g5*r5+ g6*r6+ g7*r7+ g8*r8+ g9*r9。
[0142]
可选地,若在第一运算指令的一次执行过程中,将第一运算指令设置为加载一个行数据向量,则需要9个第一运算指令来实现卷积核g和像素区域r的卷积运算。若在第一运算指令的一次执行过程中,将第一运算指令设置为循环加载共9个行数据向量,则仅需要1个第一运算指令来实现卷积核g和像素区域r的卷积运算,本技术实施例对此不作限定。
[0143]
例如,针对二维卷积运算,若输入input为:[n,hi,wi,ci](输入张数、输入高度、输入宽度和输入通道数),卷积核weight为:[kh,kw,ci,co](卷积核高度、宽度、输入通道数和输出通道数),输出output:[n,ho,wo,co] (输出张数、输出高度、输出宽度和输出通道数),则可以将该运算部署为kh*kw个第一运算指令,即可以完成卷积运算,由于本技术无需引入额外复杂的操作(如img2col卷积加速算法),就可以将卷积运算转成矩阵运算,大大提升了编程的易用性和泛化性。
[0144]
在一个示例中,在获取行数据向量对应的乘运算结果之后,本技术实施例还支持通过第一运算指令对行数据向量对应的乘运算结果进行偏置运算,该过程可以包括如下内容。
[0145]
1、执行第二加载指令,从数据存储单元中加载得到偏置向量。
[0146]
该第二加载指令可以是指偏置向量加载指令。第二加载指令可以复用第一加载指令的加载通路(如bus b),也即偏置向量的加载通路与第一矩阵数据的加载通路相同,偏置向量的加载通路与第二矩阵数据的加载通路不同。通过第二加载指令可以完成偏置向量的参数初始化。
[0147]
2、执行第一运算指令,对行数据向量对应的乘运算结果和偏置向量进行求和,得到调整后的乘运算结果。
[0148]
例如,参考图6,矩阵计算电路601执行第二加载指令,通过第一矩阵数据对应的加载通路,从数据存储单元中加载得到偏置向量bias,以及执行第一加载指令得到第一矩阵数据b(或第一子矩阵)之后,矩阵计算电路601执行第一运算指令加载得到行数据向量a,并对行数据向量a和第一矩阵数据b进行向量乘矩阵运算,得到行数据向量a对应的乘运算结果,然后对行数据向量a对应的乘运算结果和偏置向量bias进行求和,得到调整后的乘运算结果d。
[0149]
其中,调整后的乘运算结果d可以表示为:d=a*b+bias。在图6中,第一运算指令可以依次完成第一个第二子矩阵中的4个行数据向量,以及第二个第二子矩阵中的4个行数据量的加载和计算,并依次得到8个乘运算结果d。
[0150]
步骤204,执行第一运算指令,将行数据向量对应的乘运算结果输出至数据存储单元;其中,第二矩阵数据和第一矩阵数据的乘运算结果,基于各个行数据向量分别对应的乘运算结果确定。
[0151]
可选地,矩阵计算电路在每获取一个行数据向量对应的乘运算结果后,即通过第一运算指令对应的输出总线(如图1中的bus d),根据行数据向量对应的乘运算结果的存储地址,将行数据向量对应的乘运算结果存储至数据存储单元中对应的位置。可选地,矩阵数据和乘运算结果可以对应同一个数据存储单元,也可以分别对应不同的数据存储单元,本
申请实施例对此不作限定。
[0152]
在一个示例中,对应于多层循环的加载和运算过程,第一运算指令对应的存储过程也为多层循环过程,如此实现乘运算结果的灵活存储。以双层循环为例,第一运算指令还配置有第一层循环存储参数、第二层循环存储参数和第三起始地址参数,第一层循环存储参数用于指示第一层循环存储时行数据向量对应的乘运算结果在数据存储单元中的存储位置,第二层循环存储参数用于指示第二层循环存储时行数据向量对应的乘运算结果在数据存储单元中的存储位置,第三起始地址参数用于指示行数据向量对应的乘运算结果在数据存储单元中的起始地址。
[0153]
示例性地,以两层循环为例,各个行数据向量分别对应的乘运算结果在数据存储单元中的存储地址可以表示为:
[0154]
vecoutaddr(i,j)=[xd]+i*dst_stride1+j* dst_stride2;
[0155]
其中,[xd]为第三起始地址参数,dst_stride1为第一层循环存储参数,dst_stride2为第二层循环存储参数。
[0156]
在第一层循环存储(与第一层循环加载对应)时,行数据向量对应的乘运算结果的存储过程可以包括如下内容。
[0157]
1、执行第一运算指令,基于第三起始地址参数、第一层循环次数参数在当前时刻下的值和第一层循环存储参数,得到行数据向量对应的乘运算结果在数据存储单元中的存储地址。
[0158]
例如,基于上述实施例,第一层循环次数参数为2,第二层循环次数参数为2,在第一层循环存储时,可以得到两个行数据向量对应的乘运算结果的存储地址:
[0159]
vecoutaddr(0,0)=[xd]和vecoutaddr(1,0)=[xd] +dst_stride1。
[0160]
2、执行第一运算指令,根据行数据向量对应的乘运算结果在数据存储单元中的存储地址,将行数据向量对应的乘运算结果输出至数据存储单元。
[0161]
每完成一个行数据向量的运算,即根据其对应的存储地址,将其存储至数据存储单元中的对应位置。
[0162]
在第二层循环存储(与第二层循环加载对应)时,行数据向量对应的乘运算结果的存储过程如下:
[0163]
1、执行第一运算指令,基于第三起始地址参数、第一层循环次数参数在当前时刻下的值、第二层循环次数参数在当前时刻下的值、第一层循环存储参数和第二层循环存储参数,得到行数据向量对应的乘运算结果在数据存储单元中的存储地址。
[0164]
例如,基于上述实施例,在第二层循环存储时,又可以得到两个行数据向量对应的乘运算结果的存储地址:
[0165]
vecoutaddr(0,1)=[xd]+ dst_stride2和vecoutaddr(1,1)=[xd] +dst_stride1+ dst_stride2。
[0166]
2、执行第一运算指令,根据行数据向量对应的乘运算结果在数据存储单元中的存储地址,将行数据向量对应的乘运算结果输出至数据存储单元。
[0167]
可选地,本技术实施例支持采用多种数据格式对行数据向量对应的乘运算结果进行排布,诸如nc1hwc0、nhwc、nchw等,如此可满足不同应用场景的需求,同时也能提供计算效率和性能表现。
[0168]
可选地,在第一运算指令用于矩阵运算的情况下,以各个行数据向量对应的乘运算结果为元素,构建第二矩阵数据和第一矩阵数据的乘运算结果;在第一运算指令用于卷积运算的情况下,对各个行数据向量对应的乘运算结果进行求和,得到第二矩阵数据和第一矩阵数据的乘运算结果(即卷积结果)。
[0169]
在一个实施例中,本技术实施例提供的csic模式的指令集的运算效率,比rsic模式的指令集的运算效率有100-1000倍的提升。
[0170]
综上所述,本技术实施例提供的技术方案,通过支持向量乘矩阵运算的复杂运算指令(即可支持多类型操作的指令),实现矩阵的搬运、矩阵乘矩阵运算和乘运算结果的存储,相比于相关技术中需要多种不同类型的risc模式的指令,且每种类型对应较多数量的指令才能实现上述过程,避免了用于实现矩阵乘矩阵运算的程序的复杂化,进而简化了矩阵乘矩阵运算的实现,尤其是运算量较大的矩阵乘矩阵运算场景。同时,相比于risc模式的指令,由于复杂运算指令(如cisc模式的指令)的指令效率可提升上百倍,使得矩阵乘矩阵运算的实现效率更高。
[0171]
另外,本技术实施例通过支持对第一运算指令的循环次数参数和循环步幅参数进行配置,使得用户可以根据需求对第一运算指令对应的行数据向量的个数和尺寸进行灵活调整,从而提高了的第一运算指令的灵活性和通用性,进而提高了矩阵运算和卷积运算的灵活性和通用性。同时,由于通过设置循环次数参数,可使得一个第一运算指令可实现多个向量乘矩阵运算,从而进一步提高了矩阵运算和卷积运算的实现效率,以及降低了程序的复杂度。
[0172]
另外,由于可通过对循环步幅参数进行设置,来灵活调整第一运算指令所获取的行数据向量的长度,如此使得第一运算指令既可用于矩阵运算,又可用于卷积运算,从而实现矩阵运算和卷积运算的统一,而无需分别为矩阵运算和卷积运算单独构建一套指令,也无需构建能够支持两种运算模式的内部硬件架构,从而可以有效减少算法实现的复杂度和代码量,同时也可以提高计算效率和资源利用率,以及使得硬件架构的实现更加简洁。
[0173]
另外,由于第一运算指令可同时支持矩阵运算和卷积运算,从而简化了高性能矩阵运算和卷积运算的实现,有助于ai应用中的计算加速。
[0174]
在一个实施例中,本技术实施例还支持利用并行计算和硬件加速技术,进一步提高矩阵运算或卷积运算的性能,从而满足各种计算密集型任务的需求。
[0175]
对于并行计算技术,其可以包括如下内容。
[0176]
在第二矩阵数据与第一矩阵数据的乘运算结果的获取过程中,若需要执行多个第一运算指令,以实现第二矩阵数据与第一矩阵数据之间的矩阵运算,则可通过矩阵计算电路控制各个第一运算指令并行执行,以使得第二矩阵数据对应的各个行数据量并行与第二矩阵数据进行向量乘矩阵运算。
[0177]
例如,若一个第一运算指令用于进行一个行数据向量的运算,对于4*4的第二矩阵数据,可以并行执行4个第一运算指令,同时获取第二矩阵数据对应的4个行数据向量与第一矩阵数据之间的乘运算结果。
[0178]
对于硬件加速技术,其可以包括如下内容。
[0179]
硬件加速技术是指的脉动阵列架构,如二维脉动阵列方式,其可以减少数据的重复加载,更好地利用计算资源。通过脉动复用的方式,可以增大矩阵计算电路的并行计算能
力,进而提高运算效率。本技术实施例对脉动阵列的大小、脉动阵列方案不作限定,其可以根据实际使用需求进行设置与调整。
[0180]
示例性地,在第二矩阵数据与第一矩阵数据的乘运算结果的获取过程中,各个第一运算指令按照脉动阵列的方式执行,以使得第二矩阵数据对应的各个行数据量以脉动阵列的方式与第二矩阵数据进行向量乘矩阵运算。
[0181]
例如,对于b矩阵(第一矩阵数据)的加载,将b矩阵按照脉动阵列的方式加载到矩阵计算电路的缓存中,第一拍,加载b矩阵中的第一列元素到第一行,第二拍,加载b矩阵中的第二列元素到第一行,同时第一列元素脉动到第二行,依次类推,完成b矩阵的加载。
[0182]
运算时,第一拍,读入a矩阵(第二矩阵数据)的第一行元素(行数据向量),保持b矩阵不变,然后将a矩阵第一行元素和b矩阵的第一列元素进行点积求和运算。第二拍,读入a矩阵的第二行元素,并与b矩阵的第一列进行点积求和运算,同时a矩阵的第一行元素脉动,并与b矩阵的第二列元素进行点积求和运算。第三拍依次进行,以完成a矩阵乘b矩阵。由于运算过程中可保持b矩阵不变,所以可支持高效的数据复用,避免数据的重复调用,从而提高运算效率。
[0183]
可选地,并行计算技术和硬件加速技术可以结合使用,也可以单独使用,本技术实施例对此不作限定。
[0184]
综上所述,本技术实施例提供的技术方案,通过利用并行计算和硬件加速技术,可有效提高矩阵运算或卷积运算的效率。
[0185]
在一个实施例中,本技术实施例对各个指令间的依赖性关系,提供了对应的状态标志位(记为status)的检测和更新,从而可灵活地完成数据计算和搬运之间的同步,该方案同步的开销相比于引入一条同步指令来说要小很多,因此更加灵活高效。
[0186]
示例性地,该过程可以包括如下内容:执行第一运算指令,在状态标志位指示第一状态的情况下,对行数据向量与第一矩阵数据进行向量乘矩阵运算,得到行数据向量对应的乘运算结果;在状态标志位指示第二状态的情况下,停止对行数据向量与第一矩阵数据进行向量乘矩阵运算。
[0187]
其中,状态标志位用于指示矩阵计算电路中是否有第一矩阵数据(或第一子矩阵)可用。若状态标志位指示第一状态,矩阵计算电路则可确定第一矩阵数据(或第一子矩阵)已被加载至缓存中;若状态标志位指示第二状态,矩阵计算电路则可确定第一矩阵数据(或第一子矩阵)已被消耗,需要等待新的第一矩阵数据或新的第一子矩阵。
[0188]
可选地,在第一矩阵数据的加载过程中状态标志位被置位为第一状态,如在第一矩阵数据或第一矩阵数据对应的第一子矩阵或第一矩阵数据对应的元素列被加载完成的情况下,脉动阵列对应的硬件将状态标志位置位为第一状态。
[0189]
在第一矩阵数据被消耗后状态标志位被置位为第二状态,如在矩阵计算电路中的第一矩阵数据或第一矩阵数据对应的第一子矩阵或第一矩阵数据对应的元素列被消耗的情况下,脉动阵列对应的硬件将状态标志位置位为第二状态。
[0190]
例如,若第一状态记为full,第二状态记为empty,加载b矩阵时,status(状态标志位)会置位成full,其代表数据可用,在第一运算指令执行过程中,自动对status进行检测,若status为empty,第一运算指令会被阻塞住;若status为full,第一运算指令可以继续执行,第一运算指令执行完后,status 会被置位成empty,其代表b矩阵已经被消耗,需要等待
新的b矩阵加载指令完成。
[0191]
可选地,由于b矩阵的所有元素是脉动地被消耗,脉动阵列对应的硬件也可以提前将status 置位成empty,从而提醒矩阵计算电路加载新的b矩阵。
[0192]
综上所述,本技术实施例提供的技术方案,通过利用状态标志位,可有效实现数据计算和搬运之间的同步。
[0193]
下述为本技术装置实施例,可以用于执行本技术方法实施例。对于本技术装置实施例中未披露的细节,请参照本技术方法实施例。
[0194]
请参考图7,其示出了本技术一个实施例提供的运算指令的执行装置的框图。该装置具有实现上述方法示例的功能,所述功能可以由硬件实现,也可以由硬件执行相应的软件实现。该装置可以是上文介绍的计算机设备,也可以设置在计算机设备中。如图7所示,该装置700包括:第一矩阵加载模块701、行向量加载模块702、运算结果获取模块703和运算结果存储模块704。
[0195]
第一矩阵加载模块701,用于执行第一加载指令,从数据存储单元中加载得到第一矩阵数据。
[0196]
行向量加载模块702,用于对于所述数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到所述行数据向量,所述行数据向量以所述第二矩阵数据中的行元素构建。
[0197]
运算结果获取模块703,用于执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果。
[0198]
运算结果存储模块704,用于执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,基于各个所述行数据向量分别对应的乘运算结果确定。
[0199]
在一些实施例中,所述行数据向量包括多个元素;
[0200]
所述运算结果获取模块703,用于执行所述第一运算指令,对所述行数据向量中的各个元素,与所述第一矩阵数据中的各列元素分别进行点积求和,得到所述行数据向量对应的乘运算结果;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,以各个所述行数据向量分别对应的乘运算结果为元素构建得到。
[0201]
在一些实施例中,所述第一矩阵数据被划分成m个第一子矩阵,所述第二矩阵数据被划分成n个第二子矩阵,所述行数据向量为所述第二子矩阵对应的行数据向量,m和n为正整数;
[0202]
所述运算结果获取模块703,还用于执行所述第一运算指令,对所述行数据向量中的各个元素,与所述行数据向量所在的目标第二子矩阵在所述第一矩阵数据中对应的目标第一子矩阵的各列元素分别进行点积求和,得到所述行数据向量与所述目标第一子矩阵对应的乘运算结果;其中,所述目标第二子矩阵与所述目标第一子矩阵的乘运算结果,以所述目标第二子矩阵中各个行数据向量分别与所述目标第一子矩阵对应的乘运算结果为元素构建得到;所述第二矩阵数据中的第二子矩阵行,与所述第一矩阵数据中对应的第一子矩阵列的乘运算结果为,所述第二子矩阵行中各个第二子矩阵,分别与所述第一子矩阵列中对应的第一子矩阵的乘运算结果的和值;所述第二矩阵数据与所述第一矩阵数据的乘运算结果,以所述第二矩阵数据中的各个第二子矩阵行,分别与所述第一矩阵数据中对应的第
一子矩阵列的乘运算结果为元素构建得到。
[0203]
在一些实施例中,所述行数据向量包括一个元素;
[0204]
所述运算结果获取模块703,还用于执行所述第一运算指令,对所述行数据向量中的一个元素,与所述一个元素在所述第一矩阵数据中对应位置的元素进行相乘,得到所述行数据向量对应的乘运算结果;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果为各个所述向数据量分别对应的乘运算结果的和值。
[0205]
在一些实施例中,所述第一运算指令配置有第二起始地址参数、第二计算模式参数、循环步幅参数和循环次数参数,所述第二起始地址参数用于指示所述第二矩阵数据在所述数据存储单元中的起始地址,所述第二计算模式参数用于指示所述行数据向量的长度,所述循环步幅参数用于指示所述行数据向量在所述第二矩阵数据中的位置,所述循环次数参数用于指示所述行数据向量的加载数量;如图8所示,所述行向量加载模块702,包括:存储地址确定子模块702a和行向量加载子模块702b。
[0206]
存储地址确定子模块702a,用于执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述循环步幅参数和所述循环次数参数,得到所述行数据向量在所述数据存储单元中的存储地址。
[0207]
行向量加载子模块702b,用于执行所述第一运算指令,根据所述行数据向量在所述数据存储单元中的存储地址,从所述数据存储单元中加载得到所述行数据向量。
[0208]
在一些实施例中,所述循环步幅参数包括第一层循环步幅参数和第二层循环步幅参数,所述循环次数参数包括第一层循环次数参数和第二层循环次数参数,所述第一层循环步幅参数用于指示第一层循环加载时所述行数据向量在所述第二矩阵数据中的位置,所述第二层循环步幅参数用于指示第二层循环加载时所述行数据向量在所述第二矩阵数据中的位置,所述第一层循环次数参数用于指示所述第一层循环加载对应的循环次数,所述第二层循环次数参数用于指示所述第二层循环加载对应的循环次数;所述存储地址确定子模块702a,还用于:
[0209]
在所述第一层循环加载时,执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述第一循环步幅参数和所述第一层循环次数参数在当前时刻下的值,得到所述行数据向量在所述数据存储单元中的存储地址;
[0210]
在所述第二层循环加载时,执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述第一循环步幅参数、所述第二循环步幅参数、所述第一层循环次数参数在当前时刻下的值和所述第二层循环次数参数在当前时刻下的值,得到所述行数据向量在所述数据存储单元中的存储地址。
[0211]
在一些实施例中,所述第一运算指令还配置有第一层循环存储参数、第二层循环存储参数和第三起始地址参数,所述第一层循环存储参数用于指示第一层循环存储时所述行数据向量对应的乘运算结果在所述数据存储单元中的存储位置,所述第二层循环存储参数用于指示第二层循环存储时所述行数据向量对应的乘运算结果在所述数据存储单元中的存储位置,所述第三起始地址参数用于指示所述行数据向量对应的乘运算结果在所述数据存储单元中的起始地址;如图8所示,所述运算结果存储模块704,包括:输出地址确定子模块704a和运算结果存储子模块704b。
[0212]
输出地址确定子模块704a,用于在所述第一层循环存储时,执行所述第一运算指
令,基于所述第三起始地址参数、所述第一层循环次数参数在当前时刻下的值和所述第一层循环存储参数,得到所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址。运算结果存储子模块704b,用于执行所述第一运算指令,根据所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址,将所述行数据向量对应的乘运算结果输出至所述数据存储单元。
[0213]
或者,输出地址确定子模块704a,用于在所述第二层循环存储时,执行所述第一运算指令,基于所述第三起始地址参数、所述第一层循环次数参数在当前时刻下的值、所述第二层循环次数参数在当前时刻下的值、所述第一层循环存储参数和所述第二层循环存储参数,得到所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址。运算结果存储子模块704b,用于执行所述第一运算指令,根据所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址,将所述行数据向量对应的乘运算结果输出至所述数据存储单元。
[0214]
在一些实施例中,所述第一加载指令配置有第一起始地址参数、第一计算模式参数和尺寸配置参数,所述第一起始地址参数用于指示所述第一矩阵数据在所述数据存储单元中的起始地址,所述第一计算模式参数用于指示所述第一矩阵数据的计算模式和类型,所述尺寸配置参数用于指示所述第一矩阵数据对应的第一子矩阵的尺寸和步幅;所述第一矩阵加载模块701,用于:
[0215]
执行所述第一加载指令,基于所述第一起始地址参数和所述尺寸配置参数,确定各个第一子矩阵的存储地址;
[0216]
执行所述第一加载指令,依次从所述数据存储单元中加载得到各个所述第一子矩阵。
[0217]
在一些实施例中,如图8所示,所述装置700,还包括:偏置向量加载模块705和乘运算结果调整模块706。
[0218]
偏置向量加载模块705,用于执行第二加载指令,从所述数据存储单元中加载得到偏置向量。
[0219]
乘运算结果调整模块706,用于执行所述第一运算指令,对所述行数据向量对应的乘运算结果和所述偏置向量进行求和,得到调整后的所述乘运算结果;其中,所述偏置向量的加载通路与所述第一矩阵数据的加载通路相同,所述偏置向量的加载通路与所述第二矩阵数据的加载通路不同。
[0220]
在一些实施例中,在所述第二矩阵数据与所述第一矩阵数据的乘运算结果的获取过程中,各个所述第一运算指令并行执行,以使得所述第二矩阵数据对应的各个行数据量并行与所述第二矩阵数据进行向量乘矩阵运算;
[0221]
或者,在所述第二矩阵数据与所述第一矩阵数据的乘运算结果的获取过程中,各个所述第一运算指令按照脉动阵列的方式执行,以使得所述第二矩阵数据对应的各个行数据量以脉动阵列的方式与所述第二矩阵数据进行向量乘矩阵运算。
[0222]
在一些实施例中,所述运算结果获取模块703,还用于执行所述第一运算指令,在状态标志位指示第一状态的情况下,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;在所述状态标志位指示第二状态的情况下,停止对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算;其中,在所述第一矩
阵数据的加载过程中所述状态标志位被置位为所述第一状态,在所述第一矩阵数据被消耗后所述状态标志位被置位为所述第二状态。
[0223]
综上所述,本技术实施例提供的技术方案,通过支持向量乘矩阵运算的复杂运算指令(即可支持多类型操作的指令),实现矩阵的搬运、矩阵乘矩阵运算和乘运算结果的存储,相比于相关技术中需要多种不同类型的risc模式的指令,且每种类型对应较多数量的指令才能实现上述过程,避免了用于实现矩阵乘矩阵运算的程序的复杂化,进而简化了矩阵乘矩阵运算的实现,尤其是运算量较大的矩阵乘矩阵运算场景。同时,相比于risc模式的指令,由于复杂运算指令(如cisc模式的指令)的指令效率可提升上百倍,使得矩阵乘矩阵运算的实现效率更高。
[0224]
需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0225]
请参考图9,其示出了本技术一个实施例提供的计算机设备的结构框图。该计算机设备可以用于实施上述实施例中提供的运算指令的执行方法。具体可以包括如下内容。
[0226]
该计算机设备900包括中央处理单元(如cpu(central processing unit,中央处理器)、gpu(graphics processing unit,图形处理器)和fpga(field programmable gate array,现场可编程逻辑门阵列)等)901、包括ram(random-access memory,随机存取存储器)902和rom(read-only memory,只读存储器)903的系统存储器904,以及连接系统存储器904和中央处理单元901的系统总线905。该计算机设备900还包括帮助服务器内的各个器件之间传输信息的基本输入/输出系统(input output system,i/o系统)906,和用于存储操作系统913、应用程序914和其他程序模块915的大容量存储设备907。
[0227]
该基本输入/输出系统906包括有用于显示信息的显示器908和用于用户输入信息的诸如鼠标、键盘之类的输入设备909。其中,该显示器908和输入设备909都通过连接到系统总线905的输入/输出控制器910连接到中央处理单元901。该基本输入/输出系统906还可以包括输入/输出控制器910以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入/输出控制器910还提供输出到显示屏、打印机或其他类型的输出设备。
[0228]
该大容量存储设备907通过连接到系统总线905的大容量存储控制器(未示出)连接到中央处理单元901。该大容量存储设备907及其相关联的计算机可读介质为计算机设备900提供非易失性存储。也就是说,该大容量存储设备907可以包括诸如硬盘或者cd-rom(compact disc read-only memory,只读光盘)驱动器之类的计算机可读介质(未示出)。
[0229]
不失一般性,该计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括ram、rom、eprom(erasable programmable read-only memory,可擦写可编程只读存储器)、eeprom(electrically erasable programmable read-only memory,电可擦写可编程只读存储器)、闪存或其他固态存储技术,cd-rom、dvd(digital video disc,高密度数字视频光
盘)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知该计算机存储介质不局限于上述几种。上述的系统存储器904和大容量存储设备907可以统称为存储器。
[0230]
根据本技术实施例,该计算机设备900还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即计算机设备900可以通过连接在该系统总线905上的网络接口单元911连接到网络912,或者说,也可以使用网络接口单元911来连接到其他类型的网络或远程计算机系统(未示出)。
[0231]
所述存储器还包括运算指令,该运算指令经配置以由一个或者一个以上处理器中的矩阵计算电路执行,以实现上述运算指令的执行方法。
[0232]
在一些实施例中,还提供了一种矩阵计算电路,该矩阵计算电路用于实现上述运算指令的执行方法。
[0233]
在一些实施例中,还提供了一种处理器,该处理器包括矩阵计算电路,该矩阵计算电路用于上述运算指令的执行方法。
[0234]
需要说明的是,本技术实施例在收集用户的相关数据之前以及在收集用户的相关数据的过程中,都可以显示提示界面、弹窗或输出语音提示信息,该提示界面、弹窗或语音提示信息用于提示用户当前正在搜集其相关数据,使得本技术仅仅在获取到用户对该提示界面或者弹窗发出的确认操作后,才开始执行获取用户相关数据的相关步骤,否则(即未获取到用户对该提示界面或者弹窗发出的确认操作时),结束获取用户相关数据的相关步骤,即不获取用户的相关数据。换句话说,本技术所采集的所有用户数据,处理严格根据相关国家法律法规的要求,获取个人信息主体的知情同意或单独同意都是在用户同意并授权的情况下进行采集的,并在法律法规及个人信息主体的授权范围内,开展后续数据使用及处理行为且相关用户数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。例如,本技术中涉及到的矩阵数据、计算机指令等都是在充分授权的情况下获取的。
[0235]
应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。另外,本文中描述的步骤编号,仅示例性示出了步骤间的一种可能的执行先后顺序,在一些其它实施例中,上述步骤也可以不按照编号顺序来执行,如两个不同编号的步骤同时执行,或者两个不同编号的步骤按照与图示相反的顺序执行,本技术实施例对此不作限定。
[0236]
以上所述仅为本技术的示例性实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
技术特征:
1.一种运算指令的执行方法,其特征在于,所述方法包括:执行第一加载指令,从数据存储单元中加载得到第一矩阵数据;对于所述数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到所述行数据向量,所述行数据向量以所述第二矩阵数据中的行元素构建;执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,基于各个所述行数据向量分别对应的乘运算结果确定。2.根据权利要求1所述的方法,其特征在于,所述行数据向量包括多个元素;所述执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果,包括:执行所述第一运算指令,对所述行数据向量中的各个元素,与所述第一矩阵数据中的各列元素分别进行点积求和,得到所述行数据向量对应的乘运算结果;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,以各个所述行数据向量分别对应的乘运算结果为元素构建得到。3.根据权利要求1所述的方法,其特征在于,所述第一矩阵数据被划分成m个第一子矩阵,所述第二矩阵数据被划分成n个第二子矩阵,所述行数据向量为所述第二子矩阵对应的行数据向量,m和n为正整数;所述执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果,包括:执行所述第一运算指令,对所述行数据向量中的各个元素,与所述行数据向量所在的目标第二子矩阵在所述第一矩阵数据中对应的目标第一子矩阵的各列元素分别进行点积求和,得到所述行数据向量与所述目标第一子矩阵对应的乘运算结果;其中,所述目标第二子矩阵与所述目标第一子矩阵的乘运算结果,以所述目标第二子矩阵中各个行数据向量分别与所述目标第一子矩阵对应的乘运算结果为元素构建得到;所述第二矩阵数据中的第二子矩阵行,与所述第一矩阵数据中对应的第一子矩阵列的乘运算结果为,所述第二子矩阵行中各个第二子矩阵,分别与所述第一子矩阵列中对应的第一子矩阵的乘运算结果的和值;所述第二矩阵数据与所述第一矩阵数据的乘运算结果,以所述第二矩阵数据中的各个第二子矩阵行,分别与所述第一矩阵数据中对应的第一子矩阵列的乘运算结果为元素构建得到。4.根据权利要求1所述的方法,其特征在于,所述行数据向量包括一个元素;所述执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果,包括:执行所述第一运算指令,对所述行数据向量中的一个元素,与所述一个元素在所述第一矩阵数据中对应位置的元素进行相乘,得到所述行数据向量对应的乘运算结果;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果为各个所述向数据量分别
对应的乘运算结果的和值。5.根据权利要求1所述的方法,其特征在于,所述第一运算指令配置有第二起始地址参数、第二计算模式参数、循环步幅参数和循环次数参数,所述第二起始地址参数用于指示所述第二矩阵数据在所述数据存储单元中的起始地址,所述第二计算模式参数用于指示所述行数据向量的长度,所述循环步幅参数用于指示所述行数据向量在所述第二矩阵数据中的位置,所述循环次数参数用于指示所述行数据向量的加载数量;所述执行第一运算指令,加载得到所述行数据向量,包括:执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述循环步幅参数和所述循环次数参数,得到所述行数据向量在所述数据存储单元中的存储地址;执行所述第一运算指令,根据所述行数据向量在所述数据存储单元中的存储地址,从所述数据存储单元中加载得到所述行数据向量。6.根据权利要求5所述的方法,其特征在于,所述循环步幅参数包括第一层循环步幅参数和第二层循环步幅参数,所述循环次数参数包括第一层循环次数参数和第二层循环次数参数,所述第一层循环步幅参数用于指示第一层循环加载时所述行数据向量在所述第二矩阵数据中的位置,所述第二层循环步幅参数用于指示第二层循环加载时所述行数据向量在所述第二矩阵数据中的位置,所述第一层循环次数参数用于指示所述第一层循环加载对应的循环次数,所述第二层循环次数参数用于指示所述第二层循环加载对应的循环次数;所述执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述环步幅参数和所述循环次数参数,得到所述行数据向量在所述数据存储单元中的存储地址,包括:在所述第一层循环加载时,执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述第一循环步幅参数和所述第一层循环次数参数在当前时刻下的值,得到所述行数据向量在所述数据存储单元中的存储地址;在所述第二层循环加载时,执行所述第一运算指令,基于所述第二起始地址参数、所述第二计算模式参数、所述第一循环步幅参数、所述第二循环步幅参数、所述第一层循环次数参数在当前时刻下的值和所述第二层循环次数参数在当前时刻下的值,得到所述行数据向量在所述数据存储单元中的存储地址。7.根据权利要求6所述的方法,其特征在于,所述第一运算指令还配置有第一层循环存储参数、第二层循环存储参数和第三起始地址参数,所述第一层循环存储参数用于指示第一层循环存储时所述行数据向量对应的乘运算结果在所述数据存储单元中的存储位置,所述第二层循环存储参数用于指示第二层循环存储时所述行数据向量对应的乘运算结果在所述数据存储单元中的存储位置,所述第三起始地址参数用于指示所述行数据向量对应的乘运算结果在所述数据存储单元中的起始地址;所述执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元,包括:在所述第一层循环存储时,执行所述第一运算指令,基于所述第三起始地址参数、所述第一层循环次数参数在当前时刻下的值和所述第一层循环存储参数,得到所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址;执行所述第一运算指令,根据所述
行数据向量对应的乘运算结果在所述数据存储单元中的存储地址,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;或者,在所述第二层循环存储时,执行所述第一运算指令,基于所述第三起始地址参数、所述第一层循环次数参数在当前时刻下的值、所述第二层循环次数参数在当前时刻下的值、所述第一层循环存储参数和所述第二层循环存储参数,得到所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址;执行所述第一运算指令,根据所述行数据向量对应的乘运算结果在所述数据存储单元中的存储地址,将所述行数据向量对应的乘运算结果输出至所述数据存储单元。8.根据权利要求1所述的方法,其特征在于,所述第一加载指令配置有第一起始地址参数、第一计算模式参数和尺寸配置参数,所述第一起始地址参数用于指示所述第一矩阵数据在所述数据存储单元中的起始地址,所述第一计算模式参数用于指示所述第一矩阵数据的计算模式和类型,所述尺寸配置参数用于指示所述第一矩阵数据对应的第一子矩阵的尺寸和步幅;所述执行第一加载指令,从数据存储单元中加载得到第一矩阵数据,包括:执行所述第一加载指令,基于所述第一起始地址参数和所述尺寸配置参数,确定各个第一子矩阵的存储地址;执行所述第一加载指令,依次从所述数据存储单元中加载得到各个所述第一子矩阵。9.根据权利要求1所述的方法,其特征在于,所述方法还包括:执行第二加载指令,从所述数据存储单元中加载得到偏置向量;所述执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元之前,还包括:执行所述第一运算指令,对所述行数据向量对应的乘运算结果和所述偏置向量进行求和,得到调整后的所述乘运算结果;其中,所述偏置向量的加载通路与所述第一矩阵数据的加载通路相同,所述偏置向量的加载通路与所述第二矩阵数据的加载通路不同。10.根据权利要求1所述的方法,其特征在于,在所述第二矩阵数据与所述第一矩阵数据的乘运算结果的获取过程中,各个所述第一运算指令并行执行,以使得所述第二矩阵数据对应的各个行数据量并行与所述第二矩阵数据进行向量乘矩阵运算;或者,在所述第二矩阵数据与所述第一矩阵数据的乘运算结果的获取过程中,各个所述第一运算指令按照脉动阵列的方式执行,以使得所述第二矩阵数据对应的各个行数据量以脉动阵列的方式与所述第二矩阵数据进行向量乘矩阵运算。11.根据权利要求1所述的方法,其特征在于,所述方法还包括:执行所述第一运算指令,在状态标志位指示第一状态的情况下,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;在所述状态标志位指示第二状态的情况下,停止对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算;
其中,在所述第一矩阵数据的加载过程中所述状态标志位被置位为所述第一状态,在所述第一矩阵数据被消耗后所述状态标志位被置位为所述第二状态。12.一种运算指令的执行装置,其特征在于,所述装置包括:第一矩阵加载模块,用于执行第一加载指令,从数据存储单元中加载得到第一矩阵数据;行向量加载模块,用于对于所述数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到所述行数据向量,所述行数据向量以所述第二矩阵数据中的行元素构建;运算结果获取模块,用于执行所述第一运算指令,对所述行数据向量与所述第一矩阵数据进行向量乘矩阵运算,得到所述行数据向量对应的乘运算结果;运算结果存储模块,用于执行所述第一运算指令,将所述行数据向量对应的乘运算结果输出至所述数据存储单元;其中,所述第二矩阵数据和所述第一矩阵数据的乘运算结果,基于各个所述行数据向量分别对应的乘运算结果确定。13.一种矩阵计算电路,其特征在于,所述矩阵计算电路用于实现如权利要求1至11任一项所述的运算指令的执行方法。14.一种处理器,其特征在于,所述处理器包括矩阵计算电路,所述矩阵计算电路用于实现如权利要求1至11任一项所述的运算指令的执行方法。15.一种计算机设备,其特征在于,所述计算机设备包括处理器,所述处理器中的矩阵计算电路用于实现如权利要求1至11任一项所述的运算指令的执行方法。
技术总结
本申请公开了一种运算指令的执行方法、装置、电路、处理器及设备,涉及计算机技术领域。该方法包括:执行第一加载指令,从数据存储单元中加载得到第一矩阵数据;对于数据存储单元中第二矩阵数据对应的各个行数据向量,执行第一运算指令,加载得到行数据向量,该行数据向量以第二矩阵数据中的行元素构建,以及对行数据向量与第一矩阵数据进行向量乘矩阵运算,得到行数据向量对应的乘运算结果,并将行数据向量对应的乘运算结果输出至数据存储单元;其中,第二矩阵数据和第一矩阵数据的乘运算结果,基于各个行数据向量分别对应的乘运算结果确定。本申请通过复杂指令模式的指令实现向量乘矩阵,简化了矩阵乘算法的实现,提高了矩阵乘算法的实现效率。乘算法的实现效率。乘算法的实现效率。
技术研发人员:刘磊磊 雷东玮 章川
受保护的技术使用者:腾讯科技(深圳)有限公司
技术研发日:2023.08.18
技术公布日:2023/9/23
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/