一种基于隐式GEMM卷积的数据加载方法、装置、设备及介质转让专利

申请号 : CN202310375946.5

文献号 : CN116088773B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 商秋阙恒王斐戴一飞

申请人 : 南京砺算科技有限公司砺算科技(上海)有限公司

摘要 :

本发明公开了一种基于隐式GEMM卷积的数据加载方法、装置、设备及介质。包括:接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与计算模式匹配的指令序列;当确定计算模式为第一模式时,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;根据块数据和拼接数据构成指定分块。从全局内存中分次读取指定分块的块数据加载到匹配寄存器中,基于所加载的块数据进行拼接获取拼接数据,基于所加载的块数据和拼接数据构成指定分块,通过分次读取再拼接的方式显著降低寄存器的数据加载量,减轻寄存器的带宽压力,加快矩阵乘法的计算。

权利要求 :

1.一种基于隐式GEMM卷积的数据加载方法,其特征在于,包括:接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与所述计算模式匹配的指令序列,其中,所述计算模式包括第一模式或第二模式,所述第一模式所对应的卷积输出通道不是32的倍数,所述第二模式所对应的卷积输出通道为32的倍数;

当确定所述计算模式为第一模式时,根据所述指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;

将所述块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;

根据所述块数据和所述拼接数据构成所述指定分块;

当确定所述计算模式为第二模式时,将所述指令序列中的特征加载指令发送给GPU的纹理单元加载模块;

通过所述纹理单元加载模块按照所述特征加载指令从所述全局内存中读取特征图的第一分块,并将所述第一分块加载到指定寄存器中。

2.根据权利要求1所述的方法,其特征在于,所述根据所述指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中,包括:将所述指令序列中的特征加载指令发送给GPU的纹理单元加载模块;

通过所述纹理单元加载模块按照所述特征加载指令从所述全局内存中分次读取特征图中指定分块的块数据;

将各所述块数据按照加载列表加载到所述匹配寄存器中,其中,所述加载列表中包含各块数据与所加载的寄存器的对应关系。

3.根据权利要求1所述的方法,其特征在于,所述将所述块数据按照指定规则在目标寄存器中进行拼接获取拼接数据,包括:获取特征图中所述指定分块进行完全加载所需的全部寄存器;

将所述全部寄存器中删除所述匹配寄存器后的剩余寄存器作为所述目标寄存器;

从各所述块数据中确定出目标数据,将各所述目标数据按照指定规则在所述目标寄存器中进行拼接获取所述拼接数据,其中,所述指定规则包括按照指定顺序或者按照指定类型。

4.根据权利要求3所述的方法,其特征在于,所述从各所述块数据中确定出目标数据,包括:确定各匹配寄存器与所述目标寄存器的共享数据;

将所述匹配寄存器中所包含的共享数据作为所述目标数据。

5.根据权利要求1所述的方法,其特征在于,所述根据所述块数据和所述拼接数据构成所述指定分块之后,还包括:判断在所述匹配寄存器和所述目标寄存器中是否涵盖了所述指定分块的全部数据,若是,则确定加载拼接成功,否则,确定加载拼接失败并进行报警提示。

6.根据权利要求1所述的方法,其特征在于,所述将所述第一分块加载到指定寄存器中之后,还包括:当需要加载与所述第一分块相邻的第二分块时,确定所述指定寄存器中所述第一分块与所述第二分块的非重叠数据;

将所述非重叠数据在所述指定寄存器中删除,将删除后的剩余数据按指定方向进行移动以预留出空闲寄存器;

从所述全局内存中读取所述第二分块相对于所述第一分块的新增数据,并将所述新增数据加载到所述空闲寄存器中。

7.一种基于隐式GEMM卷积的数据加载装置,其特征在于,包括:指令序列生成模块,用于接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与所述计算模式匹配的指令序列,其中,所述计算模式包括第一模式或第二模式,所述第一模式所对应的卷积输出通道不是32的倍数,所述第二模式所对应的卷积输出通道为32的倍数;

数据加载模块,用于当确定所述计算模式为第一模式时,根据所述指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;

拼接模块,用于将所述块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;

指定分块获取模块,用于根据所述块数据和所述拼接数据构成所述指定分块;

所述数据加载模块,还用于当确定所述计算模式为第二模式时,将所述指令序列中的特征加载指令发送给GPU的纹理单元加载模块;

通过所述纹理单元加载模块按照所述特征加载指令从所述全局内存中读取特征图的第一分块,并将所述第一分块加载到指定寄存器中。

8.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1‑6中任一项所述的方法。

9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1‑6中任一项所述的方法。

说明书 :

一种基于隐式GEMM卷积的数据加载方法、装置、设备及介质

技术领域

[0001] 本发明涉及人工智能芯片技术,尤其涉及一种基于隐式GEMM卷积的数据加载方法、装置、设备及介质。

背景技术

[0002] 卷积神经网络中的卷积算子属于计算密集型,它的运算量占据整个神经网络计算量的绝大部分。因此卷积计算优化成为了一项非常重要也非常有意义的工作。
[0003] 传统的隐式GEMM卷积计算在进行数据加载时,需要额外的空间保存预计算的索引值,以便将张量数据转换为矩阵形式加载至功共享内存中,但是这种方式并没有减少共享内存至寄存器的数据传输量,从而导致内存带宽压力大,降低了整体执行效率。

发明内容

[0004] 本发明提供一种基于隐式GEMM卷积的数据加载方法、装置、设备及介质,以实现高效的数据加载。
[0005] 第一方面,本发明提供了一种基于隐式GEMM卷积的数据加载方法,包括:接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与所述计算模式匹配的指令序列,其中,所述计算模式包括第一模式或第二模式;
[0006] 当确定所述计算模式为第一模式时,根据所述指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;
[0007] 将所述块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;
[0008] 根据所述块数据和所述拼接数据构成所述指定分块。
[0009] 第二方面,本发明提供了一种基于隐式GEMM卷积的数据加载转置,包括:指令序列生成模块,用于接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与所述计算模式匹配的指令序列,其中,所述计算模式包括第一模式或第二模式;
[0010] 数据加载模块,用于当确定所述计算模式为第一模式时,根据所述指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;
[0011] 拼接模块,用于将所述块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;
[0012] 指定分块获取模块,用于根据所述块数据和所述拼接数据构成所述指定分块。
[0013] 第三方面,本发明提供了计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上所述的方法。
[0014] 第四方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述方法。
[0015] 通过从全局内存中分次读取指定分块的块数据加载到匹配寄存器中,基于所加载的块数据进行拼接获取拼接数据,并基于所加载的块数据和拼接数据构成指定分块,通过分次读取再拼接的方式可以显著降低寄存器的数据加载量,从而减轻寄存器的带宽压力,加快矩阵乘法计算。

附图说明

[0016] 图1是本发明实施例一提供的一种基于隐式GEMM卷积的数据加载方法的流程图;
[0017] 图2是本发明实施例一提供的进行加载的全部寄存器的示意图;
[0018] 图3是本发明实施例一提供的第一模式下的数据拼接示意图;
[0019] 图4是本发明实施例二提供的一种基于隐式GEMM卷积的数据加载方法的流程图;
[0020] 图5是本发明实施例二提供的第一分块和第二分块的水平方向数据复用示意图;
[0021] 图6是本发明实施例二提供的第一分块和第二分块的竖直方向数据复用示意图;
[0022] 图7是本发明实施例三提供的一种基于隐式GEMM卷积的数据加载装置的结构示意图;
[0023] 图8是本发明实施例四提供的一种计算机设备的结构示意图。

具体实施方式

[0024] 下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
[0025] 实施例一
[0026] 图1为本发明实施例一提供的一种基于隐式GEMM卷积的数据加载方法的流程图,本实施例可适用于卷积计算时高效的数据加载的情况,该方法可以由基于隐式GEMM卷积的数据加载装置来执行,该装置可以由软件和/或硬件的方式实现,方法包括:
[0027] 步骤S101,接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与计算模式匹配的指令序列。
[0028] 具体的说,计算模式包括第一模式或第二模式,而第一模式具体可是axe模式,第二模式具体可以是spear模式,并且spear模式所对应的卷积输出通道为32的倍数,axe模式所对应的卷积输出通道不是32的倍数。因此当用户根据特征图和卷积核确定出卷积输出通道后,可以根据卷积输出通道确定所对应的计算模式,并将所确定的计算模式进行输入。因此当用户输入的是axe模式时,编译器可以根据用户所输入的计算模式生成与axe模式匹配的指令序列。其中,指令序列中包括用于加载特征图的特征加载指令,例如LDM指令,当然本实施方式中仅是举例说明,而并不对指令序列中所包含的指令数量和指令类型进行限定。并且本实施方式中通过LDM指令可以直接从全局内存中获取分块,而无需对特征图进行展开的操作,从而减少了大量的计算量,并且避免了共享内存的使用。本实施方式中会将展开后的特征图划分为32*32的分块,因此在读取每个分块时,具体是按照LDM指令从全局内存中分次读取特征图中指定分块的块数据,并将各块数据按照加载列表加载到匹配寄存器中。
[0029] 步骤S102,当确定计算模式为第一模式时,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中。
[0030] 可选的,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中,包括:将指令序列中的特征加载指令发送给GPU的纹理单元加载模块;通过纹理单元加载模块按照特征加载指令从全局内存中分次读取特征图中指定分块的块数据;将各块数据按照加载列表加载到匹配寄存器中,其中,加载列表中包含各块数据与所加载的寄存器的对应关系。
[0031] 具体的说,在进行常规的GEMM卷积计算的过程中,当特征图和卷积核中每个分块的大小都为32*32时,在使用im2col的方式展开的情况下会占用大量内存,并且每个分块会存在的大量的重复数据。而在本申请中所采用的隐式GEMM不会将特征图进行上述的展开操作,而是已知各分块和原始特征数据,以及各分块和原始卷积核的映射关系,并通过指令将所需要的块直接加载到寄存器中。
[0032] 其中,当在第一模式下进行矩阵运算时,即axe模式下的矩阵运算,在C=B*A的运算过程中,A是特征图,B是卷积核,C是矩阵相乘的结果,A的大小为(H*W) * (R*S*Cin)。axe模式一般适用于卷积输出通道非32倍数的情况,此时对应的GEMM算法卷积核的数据广播率高于特征图。
[0033] 在一个具体实现中,如图2所示为进行加载的全部寄存器的示意图,axe模式下3x3尺寸的卷积核,原始特征图中数据分块的几何意义。观察可以发现:第二排的3个块数据(对应寄存器r3 r5),它们的数据完整包含在第一排的3个块数据(对应寄存器r0 r2)和第三排~ ~的3个块数据(对应寄存器r6 r8)中。因此可以通过如下的分块读取指令:LDM.axe r0, (0,~
0);LDM.axe r1, (0,1);LDM.axe r2, (0,2);LDM.axe r6, (2,0);LDM.axe r7, (2,1);
LDM.axe r8, (2,2)指令根据输入的坐标,读取特征图中第一排的数据,并存储在寄存器r0,r1,r2。之后用相同的方法读取第三排的数据,存储在寄存器r6,r7,r8中,通过上述操作数据的分次读取完成。
[0034] 步骤S103,将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据。
[0035] 可选的,将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据,包括:获取特征图中指定分块进行完全加载所需的全部寄存器;将全部寄存器中删除匹配寄存器后的剩余寄存器作为目标寄存器;从各块数据中确定出目标数据,将各目标数据按照指定规则在目标寄存器中进行拼接获取拼接数据,其中,指定规则包括按照指定顺序或者按照指定类型。
[0036] 可选的,从各块数据中确定出目标数据,包括:确定各匹配寄存器与目标寄存器的共享数据;将匹配寄存器中所包含的共享数据作为目标数据。
[0037] 其中,通过上述内容可以得知指定分块进行完全加载所需的全部寄存器为r0‑r7,由于已经分六次将指定分块的块数据加载到六个匹配寄存器r0、r1、r2、r6、r7和r8中,并将剩余的r3、r4和r5三个寄存器作为目标寄存器,之后则可以从各块数据中确定出目标数据,将各目标数据可以按照指定顺序在上述的目标寄存器中进行拼接获取拼接数据。
[0038] 在一个具体实现中,如图3所示为第一模式下的数据拼接示意图,具体是通过r0与r6中的块数据拼接得到r3中目标数据的示意图,中间的黑粗线框即为r3需要的数据,可以选择r0或r6中部分lane的数据,完成r3.ln0 ln31的数据拼接。具体实现中,我们选择~r0.ln8 ln15、 r6.ln0 ln7、 r0.ln24 ln31和 r6.ln16 ln23来完成r3的拼接。具体为先使~ ~ ~ ~
用SHUF.rp2 r9, r0.ln8.ln15, r0.ln24.ln31指令,将r0 r2的ln8 ln15,ln24 ln31存储~ ~ ~
在r9 r11对应的lane中。同样,用SHUF.rp2 r12, r6.ln0.ln7, r6.ln16.ln23指令,将r6~ ~
r8的ln0 ln7;ln16 ln23存储在r12 r14对应的lane中。最后,使用SEL.rp2 r3, r12, r9指~ ~ ~
令完成r3.ln0 ln31的数据拼接。当然,本实施方式中仅以获取r3中的拼接数据为例进行说~
明,对于获取r4和r5中拼接数据的方式与此大致相同,本实施方式中不再进行赘述。
[0039] 步骤S104,根据块数据和拼接数据构成指定分块。
[0040] 其中,本实施方式中通过这样的分词读取再拼接的方法,根据所加载的块数据以及所获取的拼接数据,构造出完整的指定块数据,并按照一定的排序方式保存到寄存器r0~r8中。并且由于使用LDM指令读取了9个数据分块中的6块,在axe模式下特征图的总数据加载量为原始数据加载量的66.67%。
[0041] 可选的,根据块数据和拼接数据构成指定分块之后,还包括:判断在匹配寄存器和目标寄存器中是否涵盖了指定分块的全部数据,若是,则确定加载拼接成功,否则,确定加载拼接失败并进行报警提示。
[0042] 值得一提的是,本实施方式中在根据块数据和拼接数据构成指定分块之后,还会查看寄存器r0‑r8中是否涵盖了指定分块的全部数据,在确定全部涵盖的情况下则确定本次加载拼接成功,但是当确定没有全部涵盖的情况下,则会进行报警提示,具体可以采用语音提示的方式或者图像提示的方式,本实施方式中并不限定报警的具体方式。并且通过报警可以提示用户及时对寄存器或软件进行检修,以保证数据加载的正常运行。
[0043] 通过从全局内存中分次读取指定分块的块数据加载到匹配寄存器中,基于所加载的块数据进行拼接获取拼接数据,并基于所加载的块数据和拼接数据构成指定分块,通过分次读取再拼接的方式可以显著降低寄存器的数据加载量,从而减轻寄存器的带宽压力,加快矩阵乘法计算。
[0044] 实施例二
[0045] 图4是本发明实施例二提供的一种基于隐式GEMM卷积的数据加载方法的流程图,本实施例以上述实施例为基础,当确定计算模式为第二模式,即spear模式时,对数据加载的方式进行具体说明,方法包括:
[0046] 步骤S201,当确定计算模式为第二模式时,将指令序列中的特征加载指令发送给GPU的纹理单元加载模块。
[0047] 具体的说,当用户输入的是spear模式时,编译器可以根据用户所输入的计算模式生成与spear模式匹配的指令序列,在指令序列中包括用于加载特征图的LDM指令,其中,在指令序列中包括用于加载特征图的LDM指令。但是此时所生成的LDM序列的内容与axe模式下所生成的LDM指令的内容是不相同的,并且会将所生成的指令序列发送给GPU的纹理单元加载模块,以便于后续纹理单元加载模块根据指令序列从全局内存中读取相应的数据。
[0048] 步骤S201,通过纹理单元加载模块按照特征加载指令从全局内存中读取特征图的第一分块并加载到指定寄存器。
[0049] 其中,当在第二模式下进行矩阵运算时,即spear模式下的矩阵运算,在C=AxB的运算过程中,A是特征图,B是卷积核,C是矩阵相乘的结果,A的大小为(H*W) * (R*S*Cin)。当卷积核为3x3时,在计算时将A划分为32*32的9个分块,并且特征图A所划分的分块的数量具体是与卷积核的大小相关的,如上述所示,当卷积核大小为3*3时,则A能够划分出9个分块,当然,本实施方式中仅是举例说明,而并不对特征图A所划分的分块的数量进行限定。在获取到A所划分的分块后,能够便于后续矩阵乘法运算和累加,而本实施方式中则主要关注各分块从全局内存高效的加载到寄存器的过程。
[0050] 具体的说,纹理单元加载模块按照特征加载指令可以直接从全局内存中获取分块,而无需对特征图进行展开的操作,从而减少了大量的计算量,并且避免了共享内存的使用。其中,本实施方式中会将展开后的特征图划分为32*32的分块,针对第一个分块tile1则可以通过纹理单元加载模块按照LDM指令从全局内存中读取特征图的第一分块,并将第一分块加载到指定寄存器中。
[0051] 例如,当使用独立的LDM指令分别加载tile1和tile2,就会造成内存带宽的浪费。因此当卷积核尺寸为RxS = 3x3,Cin = 32时,此时一个卷积核在8*4特征图上的滑动轨迹,被划分为9个32*32的分块。如图5所示为第一分块和第二分块的水平方向数据复用示意图,对于A矩阵中第一组相邻的两个分块,第一分块tile1和第二分块tile2,图5展示了它们之间的数据重叠关系,这种重叠关系,也对应两者在特征图中实际的几何意义,并且具体是将每个分块加载到8个寄存器中。直观的可以看到,tile1和tile2包含大量的数据复用,首先,tile1使用LDM指令“LDM.spear.tile1 r0 r7”加载保存到r0‑r7中。
~
[0052] 步骤S203,当需要加载与第一分块相邻的第二分块时,确定指定寄存器中第一分块与第二分块的非重叠数据。
[0053] 可选的,确定指定寄存器中第一分块与第二分块的非重叠数据,包括:调取特征数据映射关系,其中,映射关系中包括各分块与特征图原始数据的对应关系;根据映射关系确定第一分块所对应的第一特征数据,以及第二分块所对应的第二特征数据;确定第一特征数据相对于第二特征数据中的第一区别数据,将第一区别数据作为非重叠数据。
[0054] 具体的说,当接收到“LDM.spear.tile2 r0 r7”指令,确定需要加载与tlie1相邻~的tlie2时,会调取包含分块与特征图原始数据的映射关系,并根据映射关系确定出tile1所对应的第一特征数据A1,以及tlie2所对应的第二特征数据A2,并将A1与A2中所不相同的第一区别数据作为非重叠数据A3。
[0055] 步骤S204,将非重叠数据在指定寄存器中删除,将删除后的剩余数据按指定方向进行移动以预留出空闲寄存器。
[0056] 其中,在执行“LDM.spear.tile2 r0 r7”指令时,具体是先将r0.ln8 r0.ln31,~ ~r1.ln0 r1.ln31原样移动至r0.ln0 r0.ln31,r1.ln0 r1.ln23;r2.ln8 r2.ln31,r3.ln0~ ~ ~ ~ ~
r3.ln31原样移动至r2.ln0 r0.ln31, r3.ln0 r3.ln23;r4.ln8 r4.ln31,r5.ln0 r5.ln31~ ~ ~ ~
原样移动至r4.ln0 r4.ln31, r5.ln0 r5.ln23;r6.ln8 r6.ln31,r7.ln0 r7.ln31原样移~ ~ ~ ~
动至r6.ln0 r6.ln31, r7.ln0 r7.ln23。即通过移动实现将非重叠数据c在r0‑r7寄存器中~ ~
的删除,将删除后的剩余数据按照水平方向进行向前移动以预留出空闲寄存器:r1.ln24~
r1.ln31、r3.ln24 r3.ln31、r5.ln24 r5.ln31和r7.ln24 r7.ln31。
~ ~ ~
[0057] 步骤S205,从全局内存中读取第二分块相对于第一分块的新增数据,并将新增数据加载到空闲寄存器中。
[0058] 可选的,从全局内存中读取第二分块相对于第一分块的新增数据,包括:确定第二特征数据相对于第一特征数据的第二区别数据;将第二区别数据作为新增数据。
[0059] 具体的说,本实施方式中还会确定第二特征数据A2相对于第一特征数据A1的第二区别数据A4,并将A4作为新增数据。在获取到新增数据A4后,会将新增数据加载到空闲寄存器:r1.ln24 r1.ln31、r3.ln24 r3.ln31、r5.ln24 r5.ln31和r7.ln24 r7.ln31中。因此当~ ~ ~ ~采用上述的数据复用的加载方式,在加载tlle2时,仅需要加载tile2全部数据的1/8,而无需将tile2的全部数据进行加载。tile2‑tile3的情况与tile1‑tile2类似:
“LDM.spear.tile3 r0 r7”指令的数据加载量同样占完整加载量的1/8。
~
[0060] 需要说明的是,本实施方式中第一分块和第二分块还会存在竖直方向排列的情况,如图6所示为第一分块和第二分块竖直方向数据复用示意图,对于A矩阵中第三组相邻的两个分块tile3和tile4,当根据前述操作将tile3加载到寄存中之后,当接收到指令“LDM.spear.tile4 r0 r7”时,会先将r2.ln0 r2.ln31,r3.ln0 r3.ln31原样移动至r0.ln0~ ~ ~r0.ln31,r1.ln0 r1.ln31;r4.ln0 r4.ln31,r5.ln0 r5.ln31原样移动至r2.ln0~ ~ ~ ~ ~
r2.ln31,r3.ln0 r3.ln31; r6.ln0 r6.ln31, r7.ln0 r7.ln31原样移动至r4.ln0~ ~ ~ ~
r4.ln31,r5.ln0 r5.ln31。即通过移动实现将非重叠数据c在r0‑r7寄存器中的删除,将删~
除后的剩余数据按照竖直方向进行向上移动以预留出空闲寄存器:r6.ln24 r6.ln31,~
r7.ln24 r7.ln31,并将新增数据A4加载到空闲寄存器中。从上可以得知在加载tile4时,仅~
需要加载tile4全部数据的1/4。以此类推,tile4‑tile5的情况与tile1‑tile2类似,数据加载量是完整加载量的1/8;tile5‑tile6的情况与tile2‑tile3类似,数据加载量是完整加载量的1/8。综合以上9个tile的数据加载量,可以得到:使用LDM指令数据复用的加载方法,总数据加载量为原始数据加载量的25%,具体可以按照如下公式进行计算获得,即(1+1/8+1/8+1/4+1/8+1/8+1/4+1/8+1/8)/9=25%。
[0061] 其中,spear模式中被划分的特征块的数量具体是与卷积核的尺寸有关系,由于一个特则块要存到多个寄存器中,因此重点关注的是块与块之间的数据存在重叠的情况。每个寄存器为32个线程,一个线程能放4bit的数据,所以8个寄存器总共能存放1024bit的数据,一个特征块的大小为32*32=1024,所以8个寄存器正好可以放的下一个特征块的数据。所以先将第一个特征块全部存放到8个寄存器中。在第一个特征块加载完成并进行运算后,在加载第二个特征块时,由于也想将第二个特征块加载到刚才所使用的8个寄存器中,由于第二个特征块和第一个特征块之间存在数据重叠,因此不必要加载第二个特征块的全部数据,仅需要加载与第一个特征块不同的数据,具体是将非重叠数据进行删除,预留出第一空闲寄存器,针对水平排布的情况则是将重叠的数据向前移动指定位置,将第一空闲寄存器空间进行填满,从而预留出第二空闲寄存器,并将第二特征块中与第一特征块非重叠的新增数据添加到第二空闲寄存器中。
[0062] 本申请通过将从全局内存中读取的特征图的第一分块直接加载的指定寄存器中,无需共享内存的参与并且在加载相邻的第二分块时,复用寄存器中第二分块与第一分块的重叠数据,仅需加载第二分块相对于第一分块的新增数据,从而显著减少了数据的加载量。
[0063] 实施例三
[0064] 图7为本发明实施例四提供的一种基于隐式GEMM卷积的数据加载装置的结构示意图,该装置可以执行上述各实施例中涉及到的基于隐式GEMM卷积的数据加载方法。该装置可采用软件和/或硬件的方式实现,如图7所示,基于隐式GEMM卷积的数据加载装置,包括:
[0065] 指令序列生成模块310,用于接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与计算模式匹配的指令序列,其中,计算模式包括第一模式或第二模式;
[0066] 数据加载模块320,用于当确定计算模式为第一模式时,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;
[0067] 拼接模块330,用于将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;
[0068] 指定分块获取模块340,用于根据块数据和拼接数据构成指定分块。
[0069] 可选的,第一模式所对应的卷积输出通道不是32的倍数,数据加载模块,用于将指令序列中的特征加载指令发送给GPU的纹理单元加载模块;
[0070] 通过纹理单元加载模块按照特征加载指令从全局内存中分次读取特征图中指定分块的块数据;
[0071] 将各块数据按照加载列表加载到匹配寄存器中,其中,加载列表中包含各块数据与所加载的寄存器的对应关系。
[0072] 可选的,拼接模块,用于获取特征图中指定分块进行完全加载所需的全部寄存器;
[0073] 将全部寄存器中删除匹配寄存器后的剩余寄存器作为目标寄存器;
[0074] 从各块数据中确定出目标数据,将各目标数据按照指定规则在目标寄存器中进行拼接获取拼接数据,其中,指定规则包括按照指定顺序或者按照指定类型。
[0075] 可选的,拼接模块中包括目标数据确定子模块,用于确定各匹配寄存器与目标寄存器的共享数据;
[0076] 将匹配寄存器中所包含的共享数据作为目标数据。
[0077] 可选的,装置还包括报警模块,用于判断在匹配寄存器和目标寄存器中是否涵盖了指定分块的全部数据,若是,则确定加载拼接成功,
[0078] 否则,确定加载拼接失败并进行报警提示。
[0079] 可选的,数据加载模块,还用于当确定计算模式为第二模式时,将指令序列中的特征加载指令发送给GPU的纹理单元加载模块,其中,第二模式所对应的卷积输出通道为32的倍数;
[0080] 通过纹理单元加载模块按照特征加载指令从全局内存中读取特征图的第一分块,并将第一分块加载到指定寄存器中。
[0081] 可选的,数据加载模块,还用于当需要加载与第一分块相邻的第二分块时,确定指定寄存器中第一分块与第二分块的非重叠数据;
[0082] 将非重叠数据在指定寄存器中删除,将删除后的剩余数据按指定方向进行移动以预留出空闲寄存器;
[0083] 从全局内存中读取第二分块相对于第一分块的新增数据,并将新增数据加载到空闲寄存器中。
[0084] 本发明实施例所提供的一种基于隐式GEMM卷积的数据加载装置可执行本发明任意实施例所提供的一种基于隐式GEMM卷积的数据加载方法,具备执行方法相应的功能模块和有益效果。
[0085] 实施例四
[0086] 图8为本发明实施例四提供的一种计算机设备的结构示意图,如图8所示,该计算机设备包括处理器510、存储器520、输入装置530和输出装置540;计算机设备中处理器510的数量可以是一个或多个,图8中以一个处理器510为例;计算机设备中的处理器510、存储器520、输入装置530和输出装置540可以通过总线或其他方式连接,图8中以通过总线连接为例。
[0087] 存储器520作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的基于GPU的隐式GEMM卷积计算方法对应的程序指令/模块。处理器510通过运行存储在存储器520中的软件程序、指令以及模块,从而执行计算机设备的各种功能应用以及数据处理,即实现上述的基于隐式GEMM卷积的数据加载方法。
[0088] 一种基于隐式GEMM卷积的数据加载方法,包括:
[0089] 接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与计算模式匹配的指令序列,其中,计算模式包括第一模式或第二模式;
[0090] 当确定计算模式为第一模式时,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;
[0091] 将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;
[0092] 根据块数据和拼接数据构成指定分块。
[0093] 存储器520可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器520可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器520可进一步包括相对于处理器510远程设置的存储器,这些远程存储器可以通过网络连接至计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0094] 输入装置530可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置540可包括显示屏等显示设备。
[0095] 实施例五
[0096] 本发明实施例五还提供一种包含计算机可读存储介质,计算机可读存储介质在由计算机处理器执行时用于执行一种基于隐式GEMM卷积的数据加载方法,包括:
[0097] 接收用户输入的隐式GEMM卷积计算模式,并通过编译器生成与计算模式匹配的指令序列,其中,计算模式包括第一模式或第二模式;
[0098] 当确定计算模式为第一模式时,根据指令序列从全局内存中分次读取特征图中指定分块的块数据,并将各块数据加载到匹配寄存器中;
[0099] 将块数据按照指定规则在目标寄存器中进行拼接获取拼接数据;
[0100] 根据块数据和拼接数据构成指定分块。
[0101] 当然,本发明实施例所提供的一种包含计算机可读存储介质,其计算机可执行指令不限于如上的方法操作,还可以执行本发明任意实施例所提供的基于隐式GEMM卷积的数据加载方法中的相关操作。
[0102] 通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read‑Only Memory, ROM)、随机存取存储器(Random Access Memory, RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。
[0103] 值得注意的是,上述基于隐式GEMM卷积的数据加载装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
[0104] 注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。