分块方法及装置、卷积运算的方法及装置、存储介质与流程

allin2022-09-03  139



1.本公开的实施例涉及一种应用于矩阵乘法运算的分块方法、用于卷积运算的方法、应用于矩阵乘法运算的分块装置、用于卷积运算的装置和计算机可读存储介质。


背景技术:

2.神经网络(neural network,nn)作为人工智能(artificial intelligence,ai)领域的一类机器学习模型,近年来得到了很多关注。ai加速器是一类专门的硬件加速器或计算机系统,旨在加速人工智能,尤其是人工神经网络、机器视觉和机器学习等,的应用。ai加速器的典型应用包括机器人技术、物联网和其他数据密集型或传感器驱动任务的算法。目前,除了中央处理器(central processing unit,cpu)和图形处理器(graphics processing unit,gpu)等通用处理器之外,开发了基于现场可编程逻辑阵列(field programmable gate array,fpga)或专用集成电路(application specific integrated circuit,asic)的ai加速器。基于fpga的ai加速器具有更短的开发周期和灵活的可编程性,同时具备较高的计算并行度和相对适中的功耗;而基于asic的ai加速器需要付出高昂的开发时间和人力物力成本,但是可以最大程度地实现满足性能和功耗需求的定制化加速器。


技术实现要素:

3.本公开至少一个实施例提供一种分块方法,应用于矩阵乘法运算,其中,所述矩阵乘法运算用于实现第一矩阵和第二矩阵之间的乘法运算,所述分块方法包括:基于所述第一矩阵和所述第二矩阵,确定输入参数,其中,所述输入参数包括所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述第一矩阵和所述第二矩阵每个中的每个数据的数据尺寸、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽和输入缓存器的尺寸;基于所述输入参数,获得输出参数,其中,所述输出参数包括循环顺序以及与所述第一矩阵和所述第二矩阵对应的分块参数。
4.例如,在本公开的实施例提供的分块方法中,所述第一矩阵的维度参数包括第一矩阵维数和第二矩阵维数,所述第二矩阵的维度参数包括所述第二矩阵维数和第三矩阵维数,所述分块参数包括与所述第一矩阵维数有关的第一维数外层分块参数、与所述第一维数外层分块参数有关的第一维数内层分块参数、与所述第二矩阵维数有关的第二维数分块参数、与所述第三矩阵维数有关的第三维数外层分块参数和与所述第三维数外层分块参数有关的第三维数内层分块参数,所述循环顺序用于指示所述第一维数外层分块参数、所述第一维数内层分块参数、所述第二维数分块参数、所述第三维数外层分块参数和所述第三维数内层分块参数的顺序。
5.例如,在本公开的实施例提供的分块方法中,所述输入缓存器包括用于缓存所述第一矩阵中的数据的第一输入缓存器和用于缓存所述第二矩阵中的数据的第二输入缓存器,所述输入缓存器的尺寸包括所述第一输入缓存器的尺寸和所述第二输入缓存器的尺寸,基于所述输入参数,获得输出参数,包括:基于所述第一矩阵的维度参数和所述数据尺
寸,确定所述第一矩阵对应的第一矩阵尺寸;基于所述第二矩阵的维度参数和所述数据尺寸,确定所述第二矩阵对应的第二矩阵尺寸;比较所述第一矩阵尺寸和所述第一输入缓存器的尺寸并比较所述第二矩阵尺寸和所述第二输入缓存器的尺寸,以确定第一比较结果;基于所述第一比较结果,确定所述输出参数。
6.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸,确定所述第二维数分块参数为所述第二矩阵维数;比较所述第一矩阵维数和所述第三矩阵维数,以确定第二比较结果;基于所述第二比较结果,确定所述第一维数外层分块参数和所述第三维数外层分块参数。
7.例如,在本公开的实施例提供的分块方法中,基于所述第二比较结果,确定所述第一维数外层分块参数和所述第三维数外层分块参数包括:响应于所述第二比较结果表示所述第一矩阵维数小于所述第三矩阵维数:确定所述第一维数外层分块参数为所述第一矩阵维数;基于所述数据尺寸、所述第二矩阵的维度参数和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数;响应于所述第二比较结果表示所述第一矩阵维数大于等于所述第三矩阵维数:确定所述第三维数外层分块参数为所述第三矩阵维数;基于所述数据尺寸、所述第一矩阵的维度参数和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数。
8.例如,在本公开的实施例提供的分块方法中,基于所述数据尺寸、所述第一矩阵的维度参数和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数,包括:基于所述数据尺寸、所述第二矩阵维度和所述第一输入缓存器的尺寸,确定第一中间分块参数;响应于所述第一中间分块参数小于所述第一矩阵维数,确定所述第一维数外层分块参数为所述第一中间分块参数,响应于所述第一中间分块参数大于等于所述第一矩阵维数,确定所述第一维数外层分块参数为所述第一矩阵维数。
9.例如,在本公开的实施例提供的分块方法中,基于所述数据尺寸、所述第二矩阵的维度参数和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数,包括:基于所述数据尺寸、所述第二矩阵维度和所述第二输入缓存器的尺寸,确定第二中间分块参数;响应于所述第二中间分块参数小于所述第三矩阵维数,确定所述第三维数外层分块参数为所述第二中间分块参数,响应于所述第二中间分块参数大于等于所述第三矩阵维数,确定所述第三维数外层分块参数为所述第三矩阵维数。
10.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸,比较所述第一矩阵维数和所述第三矩阵维数,以确定第二比较结果;基于所述第二比较结果,确定外层循环标志。
11.例如,在本公开的实施例提供的分块方法中,基于所述第二比较结果,确定外层循环标志包括:响应于所述第二比较结果表示所述第一矩阵维数小于所述第三矩阵维数:确定所述外层循环标志为第一标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序,所述第一标志指示在所述
循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之前;响应于所述第二比较结果表示所述第一矩阵维数大于等于所述第三矩阵维数:确定所述外层循环标志为第二标志,其中,所述第二标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之后。
12.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输出参数,还包括:基于所述外层循环标志,确定所述循环顺序中所述第一维数外层分块参数和所述第三维数外层分块参数的顺序。
13.例如,在本公开的实施例提供的分块方法中,所述输入参数还包括:累加缓存器的最大尺寸和硬件算力,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸大于所述第一输入缓存器的尺寸且所述第二矩阵尺寸大于所述第二输入缓存器的尺寸,响应于不对所述第二矩阵维数进行切分,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一输入缓存器的尺寸和所述第二输入缓存器的尺寸,计算第一利用率;响应于对所述第二矩阵维数进行切分,将所述累加缓存器的最大尺寸作为当前计算尺寸,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一输入缓存器的尺寸、所述第二输入缓存器的尺寸和所述当前计算尺寸,计算第一切分利用率;当所述第一利用率大于等于所述第一切分利用率时:确定所述第二维数分块参数为所述第二矩阵维数;基于所述第二矩阵维数、所述数据尺寸和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数;基于所述第二矩阵维数、所述数据尺寸和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数。
14.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输出参数,还包括:当所述第一利用率小于所述第一切分利用率时:基于调节系数和所述当前计算尺寸,确定调节后尺寸,将所述调节后尺寸作为所述当前计算尺寸迭代地计算利用率,直到得到小于所述第一切分利用率的利用率作为目标切分利用率;基于所述第一矩阵维数、所述第三矩阵维数、所述数据尺寸、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽和与所述目标切分利用率对应的当前计算尺寸,确定所述第一维数外层分块参数和所述第三维数外层分块参数;基于所述第一输入缓存器的尺寸、所述第二输入缓存器的尺寸、所述第一维数外层分块参数、所述第三维数外层分块参数和所述数据尺寸,确定所述第二维数分块参数。
15.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输出参数,还包括:当所述第一利用率大于等于所述第一切分利用率时:响应于所述第一矩阵对应的加载带宽小于所述第二矩阵对应的加载带宽,确定外层循环标志为第一标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序,所述第一标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之前,响应于所述第一矩阵对应的加载带宽大于等于所述第二矩阵对应的加载带宽,确定所述外层循环标志为第二标志,其中,所述第二标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之后。
16.例如,在本公开的实施例提供的分块方法中,基于所述第一比较结果,确定所述输
出参数,还包括:当所述第一利用率小于所述第一切分利用率时,确定外层循环标志为外层预设标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序。
17.例如,在本公开的实施例提供的分块方法中,所述输入参数还包括同步粒度和最小数据块对应的第一块参数和第二块参数,基于所述输入参数,获得输出参数,包括:基于所述第一块参数、所述第二块参数、所述第一维数外层分块参数、所述同步粒度和所述数据尺寸,确定所述第一维数内层分块参数和所述第三维数内层分块参数。
18.例如,在本公开的实施例提供的分块方法中,所述输入参数还包括硬件算力,所述输出参数还包括以下中的至少一个:维度切分标识、累加缓存器标识、累加缓存器的目标尺寸、所述第一矩阵对应的第一矩阵加载次数、所述第二矩阵对应的第二矩阵加载次数和矩阵乘法运算的目标利用率,其中,所述维度切分标识用于指示是否需要对所述第二矩阵维数进行切分,所述累加缓存器标识用于指示是否需要累加缓存器,所述累加缓存器的目标尺寸表示在需要累加缓存器时所需的累加缓存器的尺寸,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸:确定所述第一矩阵加载次数和所述第二矩阵加载次数均为1;确定所述维度切分标识为第一切分子标识、所述累加缓存器标识为第一缓存器子标识、所述累加缓存器的目标尺寸为0,其中,所述维度切分标识为所述第一切分子标识表示不需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第一缓存器子标识表示不需要累加缓存器;基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述矩阵乘法运算的目标利用率。
19.例如,在本公开的实施例提供的分块方法中,所述输出参数还包括以下中的至少一个:维度切分标识、累加缓存器标识、累加缓存器的目标尺寸、所述第一矩阵对应的第一矩阵加载次数、所述第二矩阵对应的第二矩阵加载次数和矩阵乘法运算的目标利用率,其中,所述维度切分标识用于指示是否需要对所述第二矩阵维数进行切分,所述累加缓存器标识用于指示是否需要累加缓存器,所述累加缓存器的目标尺寸表示在需要累加缓存器时所需的累加缓存器的尺寸,基于所述第一比较结果,确定所述输出参数,包括:当所述第一利用率大于等于所述第一切分利用率:确定所述维度切分标识为第一切分子标识、所述累加缓存器标识为第一缓存器子标识、所述累加缓存器的目标尺寸为0,其中,所述维度切分标识为所述第一切分子标识表示不需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第一缓存器子标识表示不需要累加缓存器,响应于所述第一矩阵对应的加载带宽小于所述第二矩阵对应的加载带宽,确定所述第一矩阵加载次数为1,基于所述第一维数外层分块参数和所述第一矩阵维数确定所述第二矩阵加载次数,响应于所述第一矩阵对应的加载带宽大于等于所述第二矩阵对应的加载带宽,基于所述第三维数外层分块参数和所述第三矩阵维数确定所述第一矩阵加载次数,确定所述第二矩阵加载次数为1,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述矩阵乘法运算的目标利用率;以及当所述第一利用率小于所述第一切分利用率:确定所述维度切分标识为所述第二切分子标识、所述累加缓存器标识为第二缓存器子标识、所述累加缓存器的目标尺寸为与所述
目标切分利用率对应的当前计算尺寸,其中,所述维度切分标识为所述第二切分子标识表示需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第二缓存器子标识表示需要累加缓存器,基于与所述目标切分利用率对应的当前计算尺寸、所述第一矩阵维数、所述第三矩阵维数、所述数据尺寸、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述第一矩阵加载次数和所述第二矩阵加载次数,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一矩阵加载次数和所述第二矩阵加载次数,确定所述矩阵乘法运算的目标利用率。
20.本公开至少一个实施例还提供一种用于卷积运算的方法,其中,所述卷积运算表示利用卷积核对输入图像进行运算,所述方法包括:基于所述卷积运算的卷积输入参数,确定第一卷积运算矩阵和第二卷积运算矩阵,其中,所述卷积输入参数包括与所述卷积核对应的参数和与所述输入图像对应的参数;将所述第一卷积运算矩阵作为第一矩阵和将所述第二卷积运算矩阵作为第二矩阵,执行根据本公开任一实施例所述分块方法。
21.例如,在本公开的实施例提供的方法中,与所述卷积核对应的参数包括每个卷积核的第一核尺寸、第二核尺寸、输入通道数和卷积核数量,与所述输入图像对应的参数包括第一图像尺寸、第二图像尺寸和输入图像数量,所述第一卷积运算矩阵具有第一卷积矩阵维数和第二卷积矩阵维数,所述第二卷积运算矩阵具有所述第二卷积矩阵维数和第三卷积矩阵维数,基于所述卷积运算的卷积输入参数,确定第一卷积运算矩阵和第二卷积运算矩阵,包括:基于所述卷积核数量,确定所述第一卷积矩阵维数;基于所述第一核尺寸、所述第二核尺寸、所述输入通道数,确定所述第二卷积矩阵维数;基于所述输入图像数量、所述第一图像尺寸和所述第二图像尺寸,确定所述第三卷积矩阵维数。
22.本公开至少一个实施例还提供一种分块装置,应用于矩阵乘法运算,且包括存储器和处理器,其中,所述存储器存储有适于由所述处理器运行的计算机可执行指令,所述计算机可执行指令被所述处理器运行时执行根据本公开任一实施例所述的分块方法中的一个或多个步骤。
23.本公开至少一个实施例还提供一种用于卷积运算的装置,包括存储器和处理器,其中,所述存储器存储有适于由所述处理器运行的计算机可执行指令,所述计算机可执行指令被所述处理器运行时执行根据本公开任一实施例所述的用于卷积运算的方法中的一个或多个步骤。
24.本公开至少一个实施例还提供一种计算机可读存储介质,非瞬时性地存储有计算机可执行指令其中,所述计算机可执行指令被计算机运行时执行根据本公开任一实施例所述的分块方法中的一个或多个步骤或执行根据本公开任一实施例所述的用于卷积运算的方法中的一个或多个步骤。
附图说明
25.为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
26.图1为本公开的实施例提供的一种带有ai加速器的系统模型的示意图;
27.图2为本公开至少一个实施例提供的一种分块方法的示意性流程图;
28.图3a为本公开一些实施例提供的第一矩阵和第二矩阵的示意图;
29.图3b为图3a所示的矩阵块c0的示意图;
30.图4为本公开一些实施例提供的另一种第一矩阵和第二矩阵的示意图;
31.图5为本公开一些实施例提供的一种分块方法的示意性流程图;
32.图6为本公开一些实施例提供的一种用于卷积运算的方法的示意性流程图;
33.图7为本公开至少一个实施例提供的一种分块装置的示意性框图;
34.图8为本公开至少一个实施例提供的一种用于卷积运算的装置的示意性框图;
35.图9为本公开至少一个实施例提供的一种计算机可读存储介质的示意图。
具体实施方式
36.为了使得本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
37.除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
38.为了保持本公开实施例的以下说明清楚且简明,本公开省略了部分已知功能和已知部件的详细说明。
39.图1为本公开的实施例提供的一种带有ai加速器的系统模型的示意图,如图1所示,带有ai加速器的系统模型包括ai加速器、外部存储器(external memory)、内部存储器(internal memory)和处理器核(例如,gpu/gpgpu(general purpose graphics processing unit)core)。ai加速器包括输入缓存器(input buffer,例如,近核输入缓存器(near-core input buffer))、矩阵乘法单元(matrix multiplication unit)和累加器(accumulator)。处理器核包括寄存器堆(register file)和单指令多数据流处理器(simd(single instruction multiple data)processor)。寄存器堆也可以被ai core(即ai加速器)访问。simd处理器可以通过执行一条指令同时控制多个线程执行相同的操作。
40.对于矩阵乘法运算,数据(矩阵乘法运算中的两个矩阵matrixa和matrixb中的数据)从外部存储器或者内部存储器加载到输入缓存器中,由于输入缓存器的存储空间有限,常常无法同时装载下两个矩阵matrixa和matrixb中的所有数据,只能将该两个矩阵matrixa和matrixb中的数据分批次(分块)加载进来,然后,通过矩阵乘法单元(matrix multiplication unit)按块进行矩阵乘法运算,接着,通过累加器(accumulator)对矩阵乘法单元计算的结果进行累加,经过多次循环之后才能得到对两个矩阵matrixa和matrixb进
行运算的完整的计算结果。最后,该计算结果被传输至处理器核。
41.不同的分块(tiling)方式会导致不同的周期成本(cycle cost,即性能performance),有时,还会导致重复加载数据,甚至使得加载数据成为性能瓶颈。所以,需要寻找合适的分块尺寸(tiling size)和循环顺序(loop sequence),以获得最优的性能;而对于不同形状的矩阵和矩阵的数据位于不同位置(外部存储器或者内部存储器)的情况,最优的tiling size和loop sequence也会有所差别。
42.目前,确定tiling size和loop sequence的方法包括:第一、针对具体的输入情况进行按照case-by-case(逐案)的手工调优的方法;第二、固定loop sequence然后搜索最优的tiling shape(分块形状)的方法;第三、直接盲搜,即:遍历所有可能的tiling shape和loop sequence,计算每种组合下的cycle cost,从而找到最优的组合。
43.case-by-case手工调优的方法是一种定制化方法,无法对所有不同的输入场景得到性能最优的tiling shape和loop sequence;固定loop sequence然后搜索最优的tiling shape的方法缩小了搜索空间,不一定总能找到性能最优的tiling shape和loop sequence;而遍历所有可能的组合的暴力搜索的方法会带来较大、甚至不可接受的时间开销。
44.本公开至少一个实施例提供一种应用于矩阵乘法运算的分块方法。矩阵乘法运算用于实现第一矩阵和第二矩阵之间的乘法运算,分块方法包括:基于第一矩阵和第二矩阵,确定输入参数,其中,输入参数包括第一矩阵的维度参数、第二矩阵的维度参数、第一矩阵和第二矩阵每个中的每个数据的数据尺寸、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽和输入缓存器的尺寸;基于输入参数,获得输出参数,其中,输出参数包括循环顺序以及与第一矩阵和第二矩阵对应的分块参数。
45.在本公开的实施例提供的分块(tiling)处理方法中,对于任意输入场景(不同输入场景,输入参数不相同),基于该输入场景下的输入参数,则可以确定性能最优时的分块参数(tiling shape)和循环顺序(loop sequence),节省确定分块参数和循环顺序的时间开销,提高效率和运算性能。
46.本公开提供的分块方法可以应用于深度神经网络或高性能计算领域。针对基于ai加速器的矩阵乘法运算或者卷积运算的计算场景,本公开的实施例提供的分块方法对各种输入场景和不同尺寸的数据均可以充分发挥硬件算力、提高计算性能。
47.本公开至少一个实施例还提供一种用于卷积运算的方法、应用于矩阵乘法运算的分块装置、用于卷积运算的装置和计算机可读存储介质。
48.本公开实施例提供的分块方法可应用于本公开实施例提供的分块装置中,该分块装置可被配置于电子设备上。该电子设备可以是个人计算机、移动终端等,该移动终端可以是智能手机、平板电脑等硬件设备。
49.需要说明的是,在本公开中,“尺寸”的单位可以为比特(bit),但本公开不限于此,“尺寸”的单位可以根据实际情况设置。
50.下面结合附图对本公开的实施例进行详细说明,但是本公开并不限于这些具体的实施例。
51.图2为本公开至少一个实施例提供的一种分块方法的示意性流程图。
52.例如,分块方法可以应用于矩阵乘法运算,例如,矩阵乘法运算用于实现第一矩阵
和第二矩阵之间的乘法运算。例如,矩阵乘法运算用于实现将第一矩阵和第二矩阵进行乘法运算,以得到第三矩阵,第三矩阵中的数据即为矩阵乘法运算的多个运算结果。
53.例如,该分块方法可以应用于bert large网络中的各个矩阵乘法运算,相对于case-by-case的手工调优的方法,该分块方法针对所有输入场景(case)获得了同等的最优理论性能,并且使用的本地寄存器(local registers)更少。
54.如图2所示,本公开的实施例提供的分块方法包括步骤s10至s20。在步骤s10,基于第一矩阵和第二矩阵,确定输入参数;在步骤s20,基于输入参数,获得输出参数。
55.例如,在步骤s10,输入参数包括第一矩阵的维度参数、第二矩阵的维度参数、第一矩阵和第二矩阵每个中的每个数据的数据尺寸、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽和输入缓存器的尺寸。
56.例如,在步骤s20,输出参数包括循环顺序以及与第一矩阵和第二矩阵对应的分块参数。
57.例如,第一矩阵的维度参数包括第一矩阵维数和第二矩阵维数,第二矩阵的维度参数包括第二矩阵维数和第三矩阵维数。第一矩阵维数、第二矩阵维数和第三矩阵维数均为正整数,且第一矩阵维数的类型和第二矩阵维数的类型不相同,第二矩阵维数的类型和第三矩阵维数的类型不相同。例如,对于第一矩阵,第一矩阵维数表示第一矩阵的行数,第二矩阵维数表示第一矩阵的列数,对于第二矩阵,第二矩阵维数表示第二矩阵的行数,第三矩阵维数表示第二矩阵的列数。例如,若第一矩阵为m*k的矩阵,即该第一矩阵的第一矩阵维数为m(例如,在一些示例中,m=8),该第一矩阵的第二矩阵维数为k(例如,在一些示例中,k=4),若第二矩阵为k*n的矩阵,即该第二矩阵的第二矩阵维数为k(例如,在一些示例中,k=4),该第二矩阵的第三矩阵维数为n(例如,在一些示例中,n=8)。需要说明的是,虽然第二矩阵维数表示第一矩阵的列数,且表示第二矩阵的行数,但是对于第一矩阵和第二矩阵,第二矩阵维数是相同的,也就是说,第一矩阵的列数和第二矩阵的行数是相等的。
58.例如,分块参数包括与第一矩阵维数有关的第一维数外层分块参数、与第一维数外层分块参数有关的第一维数内层分块参数、与第二矩阵维数有关的第二维数分块参数、与第三矩阵维数有关的第三维数外层分块参数和与第三维数外层分块参数有关的第三维数内层分块参数。
59.例如,第一维数外层分块参数、第一维数内层分块参数、第二维数分块参数、第三维数外层分块参数和第三维数内层分块参数均为正整数。
60.例如,循环顺序用于指示第一维数外层分块参数、第一维数内层分块参数、第二维数分块参数、第三维数外层分块参数和第三维数内层分块参数的顺序。例如,在一些实施例中,在循环顺序中,第一维数外层分块参数和第三维数外层分块参数位于第二维数分块参数之前,第一维数内层分块参数和第三维数内层分块参数位于第二维数分块参数之后,在一个示例中,循环顺序为:第一维数外层分块参数、第三维数外层分块参数、第二维数分块参数、第一维数内层分块参数和第三维数内层分块参数。
61.需要说明的是,本公开的实施例提供的分块方法具有以下准则(guideline):第一、非必要不要重复加载矩阵的数据,防止重复加载数据成为性能瓶颈;第二、非必要不要拆分第二矩阵维数(即k维),如果不引起重复加载数据,则应该在ai加速器的通用矩阵乘法(general matrix multiplication,gemm)单元中执行累加计算;第三、如果在gemm之外,可
以采用累加缓存器实现数据累加,则应该使用拆分第二矩阵维数来避免或最小化重复加载矩阵的数据;第四、在累加缓存器资源可用的情况下,优先考虑理论性能而不是同步开销。
62.图3a为本公开一些实施例提供的第一矩阵和第二矩阵的示意图,图3b为图3a所示的矩阵块c0的示意图。
63.下面结合图3a说明本公开的实施例提供的分块参数和循环顺序。
64.如图3a所示,在一些示例中,第一矩阵表示为m*k,第二矩阵表示为k*n。m为第一矩阵维数,k为第二矩阵维数,n为第三矩阵维数。k、m、n均为正整数。第一矩阵和第二矩阵相乘得第三矩阵,第三矩阵表示m*n。
65.例如,如图3a所示,在该示例中,在加载数据的过程中,第一矩阵维数m需要被切分,第二矩阵维数k也需要被切分,第三矩阵维数n也需要被切分。下面简单说明第三矩阵中的矩阵块c0的计算过程,对第一矩阵中的矩阵块m00和第二矩阵中的矩阵块n00进行乘法运算,从而得到矩阵块c0中的每个元素(数据)的第一次计算值,该第一次计算值作为矩阵块c0中的各个元素的第一次运算结果。对第一矩阵中的矩阵块m01和第二矩阵中的矩阵块n01进行乘法运算,从而第三矩阵c中的矩阵块c0中的每个元素的第二次计算值,第二次计算值与第一次运算结果,即第一次计算值,进行累加,以得到矩阵块c0中的各个元素的第二次运算结果。对第一矩阵中的矩阵块m02和第二矩阵中的矩阵块n02进行乘法运算,从而第三矩阵c中的矩阵块c0中的每个元素的第三次计算值,第三次计算值与第二次运算结果进行累加,以得到矩阵块c0中的各个元素的第三次运算结果。该第三次运算结果即为矩阵块c0的各个元素的最终运算结果。
66.如图3a所示,分块参数包括第一维数外层分块参数partition_m、第三维数外层分块参数partition_n和第二维数分块参数partition_k。第一维数外层分块参数partition_m表示第一矩阵中的第一矩阵维数m在外层循环中切分的步长,第三维数外层分块参数partition_n表示第二矩阵中的第三矩阵维数n在外层循环中切分的步长,第二维数分块参数partition_k表示第二矩阵维数k的切分的步长(第一矩阵和第二矩阵中的均切分)。
67.例如,如图3a和图3b所示,第三矩阵包括多个矩阵块c0~c7,各个矩阵块的尺寸是相同的,以矩阵块c0为例,第一维数外层分块参数partition_m和第三维数外层分块参数partition_n对应第三矩阵中的矩阵块c0的高度(行数)与宽度(列数),即矩阵块c0可以表示为partition_m*partition_n。
68.例如,还可以对第三矩阵的每个矩阵块进行切分,如图3b所示,分块参数还包括第一维数内层分块参数tile_m和第三维数内层分块参数tile_n。如图3b所示,对矩阵块c0进行切分,以得到子矩阵块c0b0、子矩阵块c0b1、子矩阵块c0b2、子矩阵块c0b3,第一维数内层分块参数tile_m表示矩阵块c0中的高度在内层循环中切分的步长,即在内存循环中,第一维数外层分块参数partition_m的切分的步长,第三维数内层分块参数tile_n表示矩阵块c0中的宽度在内层循环中切分的步长,即在内存循环中,第三维数外层分块参数partition_n的切分的步长。矩阵块c0被划分为多个子矩阵块c0b0~c0b3,各个子矩阵块的尺寸是相同的,以子矩阵块c0b0为例,第一维数内层分块参数tile_m和第三维数内层分块参数tile_n对应于子矩阵块c0b0的高度与宽度,即子矩阵块c0b0可以表示为tile_m*tile_n。
69.需要说明的是,外层循环表示对第一矩阵和第二矩阵的切分,内存循环表示对第
三矩阵中的每个矩阵块的切分。
70.需要说明的是,若第二矩阵维数k没有被切分,则第二维数分块参数partition_k与第二矩阵维数k是相等的。
71.最终的循环顺序的一个示例如下:
72.for(out_m=0;out_m《m;out_m+=partition_m)
73.for(out_n=0;out_n《n;out_n+=partition_n)
74.for(k=0;k《k;k+=partition_k)
75.for(in_m=0;in_m《partition_m;in_m+=tile_m)
76.for(in_n=0;in_n《partition_n;in_n+=tile_n)
77.{
78.//ai core process
79.//gpu core process
80.}
81.例如,在上述示例中,在循环顺序中,第一维数外层分块参数partition_m位于第三维数外层分块参数partition_n之前,其表示先对第三矩阵维数n的方向进行遍历,再对第一矩阵维数m的方向进行遍历;第一维数内层分块参数tile_m位于第三维数内层分块参数tile_n之前,其表示先对第三矩阵中的矩阵块的partition_n方向进行遍历,再对第三矩阵中的矩阵块的partition_m方向进行遍历。
82.如图3a所示,对于第一矩阵和第二矩阵,若先对第三矩阵维数n的方向进行遍历,再对第一矩阵维数m的方向进行遍历,则首先计算得到矩阵块c0,然后计算得到矩阵块c1,然后计算得到矩阵块c2,然后计算得到矩阵块c3,然后计算得到矩阵块c4,然后计算得到矩阵块c5,然后计算得到矩阵块c6,然后计算得到矩阵块c7;若先第一矩阵维数m对的方向进行遍历,再对第三矩阵维数n的方向进行遍历,则首先计算得到矩阵块c0,然后计算得到矩阵块c2,然后计算得到矩阵块c4,计算得到矩阵块c6,然后计算得到矩阵块c1,然后计算得到矩阵块c3,然后计算得到矩阵块c5,然后计算得到矩阵块c7。
83.类似地,如图3b所示,对于矩阵块c0,若先对矩阵块c0的partition_n方向进行遍历,再对矩阵块c0的partition_m方向进行遍历,则首先计算得到子矩阵块c0b0,然后计算得到子矩阵块c0b2,然后计算得到子矩阵块c0b1,然后计算得到子矩阵块c0b3;若先对矩阵块c0的partition_m方向进行遍历,再对矩阵块c0的partition_n方向进行遍历,则首先计算得到子矩阵块c0b0,然后计算得到子矩阵块c0b1,然后计算得到子矩阵块c0b2,然后计算得到子矩阵块c0b3。
84.例如,在一些实施例中,如图1所示,ai加速器包括输入缓存器,输入缓存器包括用于缓存第一矩阵中的数据的第一输入缓存器和用于缓存第二矩阵中的数据的第二输入缓存器,输入缓存器的尺寸包括第一输入缓存器的尺寸和第二输入缓存器的尺寸。
85.需要说明的是,第一输入缓存器和第二输入缓存器可以为两个独立的缓存器,第一输入缓存器和第二输入缓存器也可以为同一个缓存器中的两个不同的缓存区域。
86.例如,第一矩阵中的每个数据的数据尺寸与第二矩阵中的每个数据的数据尺寸相同。
87.例如,在一些实施例中,在步骤s10中,基于第一矩阵,可以确定第一矩阵的维度参
数、第一矩阵对应的存储位置、用于缓存第一矩阵的数据的第一输入缓存器和数据尺寸,然后基于第一输入缓存器则可以确定第一输入缓存器的尺寸,基于第一矩阵对应的存储位置则可以确定第一矩阵对应的加载带宽;基于第二矩阵,可以确定第二矩阵的维度参数、第二矩阵对应的存储位置、用于缓存第二矩阵的数据的第二输入缓存器和数据尺寸,然后基于第二输入缓存器则可以确定第二输入缓存器的尺寸,基于第二矩阵对应的存储位置则可以确定第二矩阵对应的加载带宽。
88.例如,如图1所示,以第一矩阵为例,当第一矩阵存储在外部存储器时,第一矩阵对应的加载带宽为与外部存储器相关的第一加载带宽,当第二矩阵存储在内部存储器时,第二矩阵对应的加载带宽为与内部存储器相关的第二加载带宽,例如,第一加载带宽通常小于第二加载带宽。例如,加载带宽影响加载数据的速度,加载带宽越大,则加载数据的速度越大。
89.例如,第一矩阵对应的加载带宽和第二矩阵对应的加载带宽可以相同,也可以不相同,具体根据第一矩阵和第二矩阵的存储位置确定。
90.例如,第一输入缓存器的尺寸与第二输入缓存器的尺寸可以相同,也可以不相同。在本公开的实施例中,以第一输入缓存器的尺寸与第二输入缓存器的尺寸相同为例进行描述。
91.例如,在一些实施例中,步骤s20可以包括:基于第一矩阵的维度参数和数据尺寸,确定第一矩阵对应的第一矩阵尺寸;基于第二矩阵的维度参数和数据尺寸,确定第二矩阵对应的第二矩阵尺寸;比较第一矩阵尺寸和第一输入缓存器的尺寸并比较第二矩阵尺寸和第二输入缓存器的尺寸,以确定第一比较结果;基于第一比较结果,确定输出参数。
92.例如,第一矩阵对应的第一矩阵尺寸表示为:mata_size=m*k*d_s,mata_size表示第一矩阵尺寸,m表示第一矩阵维数,k表示第二矩阵维数,d_s表示数据尺寸。第二矩阵对应的第二矩阵尺寸表示为:matb_size=n*k*d_s,matb_size表示第二矩阵尺寸,n表示第三矩阵维数。
93.首先,根据矩阵的形状(shape)信息(即第一矩阵的维度参数和第二矩阵的维度参数),确定第一输入缓存器是否可以缓存第一矩阵中的所有数据以及第二输入缓存器是否可以缓存第二矩阵中的所有数据,即比较第一矩阵尺寸和第一输入缓存器的尺寸以及比较第二矩阵尺寸和第二输入缓存器的尺寸,以确定第一比较结果,然后,基于第一比较结果,确定输出参数。
94.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,包括:响应于第一比较结果表示第一矩阵尺寸小于等于第一输入缓存器的尺寸和/或第二矩阵尺寸小于等于第二输入缓存器的尺寸,确定第二维数分块参数为第二矩阵维数;比较第一矩阵维数和第三矩阵维数,以确定第二比较结果;基于第二比较结果,确定第一维数外层分块参数和第三维数外层分块参数。
95.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,包括:响应于第一比较结果表示第一矩阵尺寸小于等于第一输入缓存器的尺寸和/或第二矩阵尺寸小于等于第二输入缓存器的尺寸,比较第一矩阵维数和第三矩阵维数,以确定第二比较结果;基于第二比较结果,确定外层循环标志。
96.例如,第一矩阵尺寸小于等于第一输入缓存器的尺寸或第二矩阵尺寸小于等于第
二输入缓存器的尺寸,则第一矩阵和第二矩阵中的一个矩阵可以通过适当的循环顺序固定加载(load)进输入缓存器中,第一矩阵和第二矩阵中的另一个矩阵的所有数据无论是否可以被其对应的输入缓存器完全缓存,该另一个矩阵中的数据都将线性的load进输入缓存器中,从而不会涉及到矩阵的重复加载数据的操作,也就是说,此时,第一矩阵和第二矩阵都不存在重复加载数据的问题。第一矩阵尺寸小于等于第一输入缓存器的尺寸和第二矩阵尺寸小于等于第二输入缓存器的尺寸,则第一矩阵和第二矩阵均可以通过适当的循环顺序固定加载(load)进输入缓存器中,此时,第一矩阵和第二矩阵也都不存在重复加载数据的问题。因此,在这种情况下,也就不存在重复加载数据成为性能瓶颈的可能性,此时,无需进行k维度的拆分来避免带来的额外性能开销。
97.例如,在本公开的一些实施例中,可以基于外层循环标志指示第一维数外层分块参数partition_m和第三维数外层分块参数partition_n在循环顺序中的顺序。
98.需要说明的是,“重复加载数据”表示矩阵中的所有数据被加载至少两次。
99.由于第一矩阵和第二矩阵皆不会出现重复加载数据的情况,因此外层循环的顺序(即先对m方向进行遍历再对n方向进行遍历(column-major)或先对n方向进行遍历再对m方向进行遍历(row-major))不会对最终的gemm利用率产生影响。此时,可以基于第一矩阵维数和第三矩阵维数的比较结果,确定外层循环的顺序。
100.需要说明的是,在本公开的实施例中,“m方向”表示矩阵的行方向,“n方向”表示矩阵的列方向。
101.例如,在一些实施例中,基于第二比较结果,确定第一维数外层分块参数和第三维数外层分块参数包括:响应于第二比较结果表示第一矩阵维数小于第三矩阵维数:确定第一维数外层分块参数为第一矩阵维数;基于数据尺寸、第二矩阵的维度参数和第二输入缓存器的尺寸,确定第三维数外层分块参数。
102.例如,第一维数外层分块参数partition_m为第一矩阵维数m表示在外层循环中不对第一矩阵维数m进行拆分。
103.例如,在一些实施例中,基于第二比较结果,确定第一维数外层分块参数和第三维数外层分块参数还包括:响应于第二比较结果表示第一矩阵维数大于等于第三矩阵维数:确定第三维数外层分块参数为第三矩阵维数;基于数据尺寸、第一矩阵的维度参数和第一输入缓存器的尺寸,确定第一维数外层分块参数。
104.例如,第三维数外层分块参数partition_n为第三矩阵维数n表示在外层循环中不对第三矩阵维数n进行拆分。
105.例如,在一些实施例中,基于数据尺寸、第一矩阵的维度参数和第一输入缓存器的尺寸,确定第一维数外层分块参数,包括:基于数据尺寸、第二矩阵维度和第一输入缓存器的尺寸,确定第一中间分块参数;响应于第一中间分块参数小于第一矩阵维数,确定第一维数外层分块参数为第一中间分块参数,响应于第一中间分块参数大于等于第一矩阵维数,确定第一维数外层分块参数为第一矩阵维数。即第一维数外层分块参数partition_m为第一中间分块参数和第一矩阵维数m中的较小值。
106.例如,在一些实施例中,第一中间分块参数表示为:
107.p_md1=b_s1/(k*d_s)
108.其中,p_md1表示第一中间分块参数,b_s1表示第一输入缓存器的尺寸,k表示第二
矩阵维度,d_s表示数据尺寸。
109.例如,若第一矩阵维数m小于等于第一中间分块参数,则第一维数外层分块参数partition_m为第一矩阵维数m,此时,第一矩阵中的所有数据可以被第一输入缓存器完全缓存,第二矩阵中的所有数据也可以被第二输入缓存器完全缓存,这时,在外层循环中,m方向与n方向皆只执行一次数据加载,相当于不做外层拆分。
110.例如,若第一矩阵维数m大于第一中间分块参数,则第一输入缓存器不能缓存第一矩阵中的所有数据,第一矩阵的数据需要被多次加载到第一输入缓存器中,但是不会出现数据重复加载的情况。
111.例如,在一些实施例中,基于数据尺寸、第二矩阵的维度参数和第二输入缓存器的尺寸,确定第三维数外层分块参数,包括:基于数据尺寸、第二矩阵维度和第二输入缓存器的尺寸,确定第二中间分块参数;响应于第二中间分块参数小于第三矩阵维数,确定第三维数外层分块参数为第二中间分块参数,响应于第二中间分块参数大于等于第三矩阵维数,确定第三维数外层分块参数为第三矩阵维数。即第三维数外层分块参数partition_n为第二中间分块参数和第三矩阵维数n中的较小值。
112.例如,在一些实施例中,第二中间分块参数表示为:
113.p_md2=b_s2/(k*d_s)
114.其中,p_md2表示第二中间分块参数,b_s2表示第二输入缓存器的尺寸,k表示第二矩阵维度,d_s表示数据尺寸。
115.例如,若第三矩阵维数n小于等于第二中间分块参数,则第三维数外层分块参数partition_n为第三矩阵维数n,此时,第一矩阵中的所有数据可以被第一输入缓存器完全缓存,第二矩阵中的所有数据也可以被第二输入缓存器完全缓存,这时,在外层循环中,m方向与n方向皆只执行一次数据加载,相当于不做外层拆分。
116.例如,若第三矩阵维数n大于第二中间分块参数,则第二输入缓存器不能缓存第二矩阵中的所有数据,第二矩阵的数据需要被多次加载到第二输入缓存器中,但是不会出现数据重复加载的情况。
117.例如,在一些实施例中,基于第二比较结果,确定外层循环标志包括:响应于第二比较结果表示第一矩阵维数小于第三矩阵维数:确定外层循环标志为第一标志;响应于第二比较结果表示第一矩阵维数大于等于第三矩阵维数:确定外层循环标志为第二标志。
118.例如,外层循环标志用于指示第一维数外层分块参数和第三维数外层分块参数在循环顺序中的顺序。
119.例如,第一标志指示在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之前,此时,先对n方向进行遍历再对m方向进行遍历。
120.例如,第二标志指示在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之后,此时,先对m方向进行遍历再对n方向进行遍历。
121.例如,在一些实施例中,第一标志和第二标志均可以为二进制数,第一标志例如可以为1,第二标志可以为0。
122.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,还可以包括:基于外层循环标志,确定循环顺序中第一维数外层分块参数和第三维数外层分块参数的顺序。
123.例如,当外层循环标志为第一标志时,在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之前,此时,先对n方向进行遍历再对m方向进行遍历。
124.例如,当外层循环标志为第二标志时,在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之后,此时,先对m方向进行遍历再对n方向进行遍历。
125.例如,在一些实施例中,输入参数还包括硬件算力,输出参数还包括以下中的至少一个:维度切分标识、累加缓存器标识、累加缓存器的目标尺寸、第一矩阵对应的第一矩阵加载次数、第二矩阵对应的第二矩阵加载次数和矩阵乘法运算的目标利用率。
126.维度切分标识用于指示是否需要对第二矩阵维数进行切分,累加缓存器标识用于指示是否需要累加缓存器,累加缓存器的目标尺寸表示在需要累加缓存器时所需的累加缓存器的尺寸。
127.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,还可以包括:响应于第一比较结果表示第一矩阵尺寸小于等于第一输入缓存器的尺寸和/或第二矩阵尺寸小于等于第二输入缓存器的尺寸:确定第一矩阵加载次数和第二矩阵加载次数均为1;确定维度切分标识为第一切分子标识、累加缓存器标识为第一缓存器子标识、累加缓存器的目标尺寸为0;基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽和第二矩阵对应的加载带宽,确定矩阵乘法运算的目标利用率。
128.例如,在一些实施例中,维度切分标识为第一切分子标识表示不需要对第二矩阵维数进行切分,例如,当不需要对第二矩阵维数进行切分,则第二维数分块参数partition_k为第二矩阵维数k。
129.例如,在一些实施例中,累加缓存器标识为第一缓存器子标识表示不需要累加缓存器,“不需要累加缓存器”表示在矩阵乘法运算的过程中不要利用累加缓存器进行累加计算,此时,在处理器核中可以设置有累加缓存器,也可以不设置累加缓存器,其可以根据实际情况确定。
130.例如,第一切分子标识和第一缓存器子标识均可以为二进制数,第一切分子标识可以为0,第一缓存器子标识可以为0。
131.例如,在第一比较结果表示第一矩阵尺寸小于等于第一输入缓存器的尺寸和/或第二矩阵尺寸小于等于第二输入缓存器的尺寸的情况下,可以计算矩阵乘法运算的目标利用率,矩阵乘法运算的目标利用率表示性能评价指标,此时,矩阵乘法运算的目标利用率可以为第一gemm利用率。
132.例如,在一些实施例中,基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽和第二矩阵对应的加载带宽,确定矩阵乘法运算的目标利用率,包括:基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸和硬件算力,计算通用矩阵乘法周期数(gemm周期数);基于第一矩阵维数、第二矩阵维数、数据尺寸和第一矩阵对应的加载带宽,计算第一矩阵对应的单次加载周期数;基于第二矩阵维数、第三矩阵维数、数据尺寸和第二矩阵对应的加载带宽,计算第二矩阵对应的单次加载周期数;基于通用矩阵乘法周期数、第一矩阵对应的单次加载周期数和第二矩阵对应的单次加载周期数,确定矩阵乘法运算的目标利用率。
133.例如,在一些实施例中,在第一比较结果表示第一矩阵尺寸小于等于第一输入缓
存器的尺寸和/或第二矩阵尺寸小于等于第二输入缓存器的尺寸的情况下,第一gemm利用率的计算过程如下。
134.gemm周期数(表示为gemm_cycle)的计算涉及到硬件特性相关的ai核(ai core)的硬件算力,硬件算力为一个常量,且用hw_power表示,单位是operation per cycle,在这里,operation表示乘加运算,即每个周期(cycle)可以进行多少次乘加运算。
135.例如,gemm_cycle可以通过以下公式(1)计算:
136.gemm_cycle=m*k*n*d_s/hw_power
ꢀꢀꢀꢀ
公式(1)
137.例如,第一矩阵对应的单次加载周期数表示单次加载第一矩阵中的所有数据需要的周期数,第一矩阵对应的单次加载周期数可以采用以下公式(2)计算:
138.load_buffera_cycle=m*k*d_s/mata_bw
ꢀꢀꢀꢀ
公式(2),其中,load_buffera_cycle表示第一矩阵对应的单次加载周期数,mata_bw表示第一矩阵对应的加载带宽。
139.例如,第二矩阵对应的单次加载周期数表示单次加载第二矩阵中的所有数据需要的周期数,第二矩阵对应的单次加载周期数可以采用以下公式(3)计算:
140.load_bufferb_cycle=n*k*d_s/matb_bw
ꢀꢀꢀ
公式(3),其中,load_bufferb_cycle表示第二矩阵对应的单次加载周期数,matb_bw表示第二矩阵对应的加载带宽。
141.例如,第一gemm利用率可以采用以下公式(4)计算:
142.gemm_util=gemm_cycle/(max(gemm_cycle,load_buffera_cycle,load_bufferb_cycle))=min(1,(n*mata_bw/hw_power),(m*matb_bw/hw_power))
ꢀꢀꢀꢀꢀꢀ
公式(4),
143.其中,gemm_util表示第一gemm利用率,max(*)表示取最大值。例如,gemm_util的最大值为1。
144.例如,在一些实施例中,输入参数还包括:累加缓存器的最大尺寸和硬件算力。如图1所示,处理器核包括寄存器堆,寄存器堆包括累加缓存器。
145.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数可以包括:响应于第一比较结果表示第一矩阵尺寸大于第一输入缓存器的尺寸且第二矩阵尺寸大于第二输入缓存器的尺寸,响应于不对第二矩阵维数进行切分,基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽、第一输入缓存器的尺寸和第二输入缓存器的尺寸,计算第一利用率;响应于对第二矩阵维数进行切分,将累加缓存器的最大尺寸作为当前计算尺寸,基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽、第一输入缓存器的尺寸、第二输入缓存器的尺寸和当前计算尺寸,计算第一切分利用率;当第一利用率大于等于第一切分利用率时:确定第二维数分块参数为第二矩阵维数;基于第二矩阵维数、数据尺寸和第一输入缓存器的尺寸,确定第一维数外层分块参数;基于第二矩阵维数、数据尺寸和第二输入缓存器的尺寸,确定第三维数外层分块参数。
146.例如,在第一矩阵尺寸大于第一输入缓存器的尺寸且第二矩阵尺寸大于第二输入缓存器的尺寸的情况下,则第一矩阵和第二矩阵至少之一的重复加载是不可避免的。在这种情况下,需要计算使用split_k和不使用split_k两种情况下的性能对比,以决定是否使用split_k策略来实现在gemm之外的进行数据累加过程。使用split_k表示需要对第二矩阵维数进行切分,不使用split_k表示不需要对第二矩阵维数进行切分。
147.图4为本公开一些实施例提供的另一种第一矩阵和第二矩阵的示意图。
148.下面结合图4描述split_k的过程。
149.如图4所示,第一矩阵表示为m*k,第二矩阵表示为k*n,在该示例中,partition_m=m,即第一矩阵维数m不被切分,partition_n=n/2,即第二矩阵维数n被切分为2份,partition_k=k/n,即在第二矩阵维数k被拆分为n份,此时,第一矩阵被拆分为n个矩阵块,即矩阵块a1、矩阵块a2、

、矩阵块an,第二矩阵被拆分为2n个矩阵块,即矩阵块b1、矩阵块b2、

、矩阵块bn、矩阵块bn+1、矩阵块bn+2、

、矩阵块b2n。首先,在计算矩阵块c00时,需要加载第一矩阵中的矩阵块a1、矩阵块a2、

、矩阵块an,还需要加载第二矩阵中的矩阵块b1、矩阵块b2、

、矩阵块bn,矩阵块a1和矩阵块b1相乘得到矩阵块c00的第一次计算值(a1*b1),矩阵块c00的第一次计算值(a1*b1)被存储在累加缓存器中,矩阵块a2和矩阵块b2相乘得到矩阵块c00的第二次计算值(a2*b2),将矩阵块c00的第一次计算值(a1*b1)和矩阵块c00的第二次计算值(a2*b2)进行累加,并将累加结果存储在累加缓存器中,依此类推,矩阵块an和矩阵块bn相乘得到矩阵块c00的第n次计算值(an*bn),当该矩阵块c00的第n次计算值(an*bn)与在累加缓存器中的存储的当前值(前面n-1次计算值的和)进行叠加,则可以得到矩阵块c00中的各个元素的最终计算值。此时,第一矩阵中的所有数据均被加载一次。
150.然后,在计算矩阵块c10时,需要加载第一矩阵中的矩阵块a1、矩阵块a2、

、矩阵块an,还需要加载第二矩阵中的矩阵块bn+1、矩阵块bn+2、

、矩阵块b2n,此时,第一矩阵中的所有数据被重复加载一次。矩阵块a1和矩阵块bn+1相乘得到矩阵块c10的第一次计算值(a1*bn+1),矩阵块c10的第一次计算值(a1*bn+1)被存储在累加缓存器中,矩阵块a2和矩阵块bn+2相乘得到矩阵块c10的第二次计算值(a2*n+2),将矩阵块c10的第一次计算值(a1*bn+1)和矩阵块c10的第二次计算值(a2*bn+2)进行累加,并将累加结果存储在累加缓存器中,依此类推,矩阵块an和矩阵块b2n相乘得到矩阵块c10的第n次计算值(an*b2n),当该矩阵块c10的第n次计算值(an*b2n)与在累加缓存器中的存储的当前值(前面n-1次计算值的和)进行叠加,则可以得到矩阵块c10中的各个元素的最终计算值。
151.在该示例中,第一矩阵对应的第一矩阵加载次数为n/partition_n=2,第二矩阵没有重复加载,因此,第二矩阵对应的第二矩阵加载次数为m/partition_m=1,partition_m*partition_n即为矩阵块c00对应的尺寸,矩阵块c00对应的尺寸为累加缓存器的最大尺寸acc_buffer_max。
152.例如,当第一矩阵尺寸大于第一输入缓存器的尺寸且第二矩阵尺寸大于第二输入缓存器的尺寸,则第一矩阵和第二矩阵的全部数据都无法完整被load进输入缓存器,于是重复load将无法避免。这时需要计算使用split_k策略的必要性。
153.例如,在一些实施例中,响应于对第二矩阵维数进行切分,将累加缓存器的最大尺寸作为当前计算尺寸,基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽、第一输入缓存器的尺寸、第二输入缓存器的尺寸和当前计算尺寸,计算第一切分利用率,包括:基于当前计算尺寸、第一矩阵维数、第三矩阵维数、数据尺寸、第一矩阵对应的加载带宽和第二矩阵对应的加载带宽,计算第一矩阵加载次数和第二矩阵加载次数;基于第一矩阵维数、第二矩阵维数、第三矩阵维数、数据尺寸和硬件算力,计算通用矩阵乘法周期数;基于第一矩阵维数、第二矩阵维数、第一矩阵加载次数、数据尺寸和第一矩阵对应的加载带宽,计算第一矩阵对应的总加载周
期数;基于第二矩阵维数、第三矩阵维数、第二矩阵加载次数、数据尺寸和第二矩阵对应的加载带宽,计算第二矩阵对应的总加载周期数;基于通用矩阵乘法周期数、第一矩阵对应的总加载周期数和第二矩阵对应的总加载周期数,计算第一切分利用率。
154.例如,可以计算使用split_k时,该矩阵乘法运算对应的第一切分利用率。在使用split_k的情况下,第一矩阵对应的第一矩阵加载次数记为loada_spk,而第二矩阵对应的第二矩阵加载次数记为loadb_spk,第一矩阵加载次数loada_spk和第二矩阵加载次数loadb_spk的乘积满足与第一矩阵维数m、第三矩阵维数n、第一维数外层分块参数partition_m和第三维数外层分块参数有关partition_n有关的第一条件,例如,在一些实施例中,第一条件表示为:(m/partition_m)*(n/partition_n),其中,partition_m与partition_n的乘积为acc_buffer/d_s,acc_buffer表示累加缓存器对应的当前计算尺寸,当该当前计算尺寸为累加缓存器的最大尺寸时,acc_buffer=acc_buffer_max,acc_buffer/d_s是一个固定值,即loada_spk*loadb_spk=(m*n*d_s)/acc_buffer。
155.同时,第一矩阵加载次数loada_spk和第二矩阵加载次数loadb_spk的比值应该尽量满足与第一矩阵对应的单次加载周期数load_buffera_cycle和第二矩阵对应的单次加载周期数load_bufferb_cycle相关的第二条件,在一些实例中,第二条件为第一矩阵对应的单次加载周期数和第二矩阵对应的单次加载周期数的反比,这样可以使得第一矩阵对应的总加载周期数loada_cycle和第二矩阵对应的总加载周期数loadb_cycle尽可能接近(例如,最大允许的差异(即第一矩阵对应的总加载周期数loada_cycle和第二矩阵对应的总加载周期数loadb_cycle之间的比值loada_cycle/loadb_cycle)的范围在0.5~2之间,当小于0.5或大于2时,通过使得第一矩阵和第二矩阵中的一个矩阵对应的加载次数变为原先的2倍,而第一矩阵和第二矩阵中的另一个矩阵对应的加载次数变为原先的0.5倍,则可以满足这个限制条件),也就是说,loada_spk/loadb_spk尽量接近load_bufferb_cycle/load_buffera_cycle,基于上面的描述可知,load_buffera_cycle=m*k*d_s/mata_bw,load_bufferb_cycle=n*k*d_s/matb_bw,化简可得load_a_spk/load_b_spk需要尽量接近n*mata_bw/m*matb_bw。由loada_spk和loadb_spk的乘积关系和loada_spk和loadb_spk之间的比值关系,可以计算出在具有最优的gemm利用率的情况下的loada_spk和loadb_spk,从而可以进一步得到在这种情况下的gemm利用率的性能数据。在使用split_k的情况下的gemm利用率即为上述第一切分利用率。
156.需要说明的是,除了上述第一条件和第二条件之外,loada_spk和loadb_spk还需要满足第三条件,第三条件为loada_spk和loadb_spk均为正整数。
157.例如,在使用split_k的情况下,基于上述公式(1)可知,通用矩阵乘法周期数gemm_cycle表示为gemm_cycle=m*k*n*d_s/hw_power。
158.第一矩阵对应的总加载周期数可以采用以下公式(5)计算:
159.loada_cycle=m*k*d_s*loada_spk/mata_bw
ꢀꢀꢀ
公式(5),
160.其中,loada_cycle表示第一矩阵对应的总加载周期数。
161.第二矩阵对应的总加载周期数可以采用以下公式(6)计算:
162.loadb_cycle=n*k*d_s*loadb_spk/matb_bw
ꢀꢀ
公式(6),
163.其中,loadb_cycle表示第二矩阵对应的总加载周期数。
164.例如,第一切分利用率可以采用以下公式(7)计算:
165.util_splitk=gemm_cycle/(gemm_cycle,max(loada_cycle,loadb_cycle))公式(7),
166.其中,util_splitk表示第一切分利用率,max(*)表示取最大值。
167.例如,在一些实施例中,响应于不对第二矩阵维数进行切分,基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽、第一输入缓存器的尺寸和第二输入缓存器的尺寸,计算第一利用率,可以包括:基于第一矩阵维数、第二矩阵维数、第三矩阵维数、数据尺寸、第一输入缓存器的尺寸和第二输入缓存器的尺寸,确定第一矩阵加载次数和第二矩阵加载次数;基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸和硬件算力,计算通用矩阵乘法周期数;基于第一矩阵维数、第二矩阵维数、第一矩阵加载次数、数据尺寸和第一矩阵对应的加载带宽,计算第一矩阵对应的总加载周期数;基于第二矩阵维数、第三矩阵维数、第二矩阵加载次数、数据尺寸和第二矩阵对应的加载带宽,计算第二矩阵对应的总加载周期数;基于通用矩阵乘法周期数、第一矩阵对应的总加载周期数和第二矩阵对应的总加载周期数,计算第一利用率。
168.例如,在一些实施例中,在不对第二矩阵维数进行切分的情况下,确定第一矩阵加载次数和第二矩阵加载次数包括:响应于在外层循环中先对m方向进行遍历再对n方向进行遍历,基于第二矩阵维数、第三矩阵维数、数据尺寸和第二输入缓存器的尺寸,确定第一矩阵加载次数,确定第二矩阵加载次数为1。此时,第一矩阵加载次数loada_nspk表示为:loada_nspk=n*k*d_s/b_s2。
169.例如,在一些实施例中,在不对第二矩阵维数进行切分的情况下,确定第一矩阵加载次数和第二矩阵加载次数包括:响应于在外层循环中先对n方向进行遍历再对m方向进行遍历,确定第一矩阵加载次数为1,基于第一矩阵维数、第二矩阵维数、数据尺寸和第一输入缓存器的尺寸,确定第二矩阵加载次数。此时,第二矩阵加载次数loadb_nspk表示为:loadb_nspk=m*k*d_s/b_s1。
170.例如,可以计算不使用split_k时,该矩阵乘法运算对应的第一利用率。在一些实施例中,在不使用split_k的情况下,在外层循环中,若先进行m方向后n方向的切分(即先对m方向进行遍历再对n方向进行遍历),则第二矩阵的数据不需要被重复加载,第一矩阵对应的第一矩阵加载次数loada_nspk为n*k*d_s/b_s2,此时,第一矩阵对应的总加载周期数loada_cycle为load_buffera_cycle*loada_nspk,第二矩阵对应的总加载周期数loadb_cycle为load_bufferb_cycle,矩阵乘法运算对应的利用率util_1可以表示为:
171.util_1=gemm_cycle/(max(gemm_cycle,load_buffera_cycle*loada_nspk,load_bufferb_cycle))。
172.在外层循环中,若先进行n方向后m方向的切分(即先对n方向进行遍历再对n方向进行遍历),则第一矩阵的数据不需要被重复加载,第二矩阵对应的第二矩阵加载次数loadb_nspk为m*k*d_s/b_s1,此时,第一矩阵对应的总加载周期数loada_cycle为load_buffera_cycle,第二矩阵对应的总加载周期数loadb_cycle为load_bufferb_cycle*loadb_nspk,矩阵乘法运算对应的利用率util_2可以表示为:
173.util_2=gemm_cycle/(max(gemm_cycle,load_buffera_cycle,load_buffer b_cycle*loadb_nspk))
174.然后,基于上述两种情况,选择性能更好的一种,即选择利用率util_1和利用率util_2中较大值,从而第一利用率为利用率util_1和利用率util_2中较大值,由此,第一利用率表示为以下公式(8):
175.util_nosplitk=gemm_cycle/(max(gemm_cycle,min(load_buffera_cycle*loada_nspk,load_bufferb_cycle*loadb_nspk))
ꢀꢀꢀꢀ
公式(8),
176.其中,util_nosplitk表示第一利用率,min(*)表示取最小值。
177.例如,若不使用split_k情况下得到的gemm利用率(即第一利用率)依然高于或等于使用split_k情况下得到的gemm利用率(即第一切分利用率),则无需使用split_k带来额外的累加缓存器的资源消耗。即当第一利用率大于等于第一切分利用率时,第二维数分块参数partition_k为第二矩阵维数k,第一维数外层分块参数partition_m和第三维数外层分块参数partition_n根据第一输入缓存器和第二输入缓存器满载情况下确定,此时,基于第二矩阵维数、数据尺寸和第一输入缓存器的尺寸,确定第一维数外层分块参数partition_m,例如,partition_m=b_s1/(k*d_s);基于第二矩阵维数、数据尺寸和第二输入缓存器的尺寸,确定第三维数外层分块参数partition_n,例如,partition_n=b_s2/(k*d_s)。
178.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,还包括:当第一利用率大于等于第一切分利用率时:响应于第一矩阵对应的加载带宽小于第二矩阵对应的加载带宽,确定外层循环标志为第一标志,响应于第一矩阵对应的加载带宽大于等于第二矩阵对应的加载带宽,确定外层循环标志为第二标志。
179.需要说明的是,关于外层循环标志、第一标志和第二标志的含义的说明,可以参考上面的相关描述,重复之处不再赘述。
180.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,还包括:当第一利用率大于等于第一切分利用率时:响应于第一矩阵对应的加载带宽小于第二矩阵对应的加载带宽,确定第一矩阵加载次数为1,基于第一维数外层分块参数和第一矩阵维数确定第二矩阵加载次数;响应于第一矩阵对应的加载带宽大于等于第二矩阵对应的加载带宽,基于第三维数外层分块参数和第三矩阵维数确定第一矩阵加载次数,确定第二矩阵加载次数为1。
181.例如,当第一利用率大于等于第一切分利用率时,需要判断外层循环中先对m方向进行遍历还是先对n方向进行遍历。例如,可以基于第一矩阵对应的加载带宽mata_bw和第二矩阵对应的加载带宽matb_bw之间的关系,确定在循环顺序中,第一维数外层分块参数和第三维数外层分块参数的顺序,例如,当mata_bw大于等于matb_bw,则确定在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之后,即先对m方向进行遍历再对n方向进行遍历,因此,第一矩阵需要被重复加载,第一矩阵对应的第一矩阵加载次数loada_nspk为n/partition_n(此时,partition_n=b_s2/(k*d_s)),第二矩阵的数据不需要被重复加载,即第二矩阵对应的第二矩阵加载次数为1。当mata_bw小于matb_bw,则确定在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之前,即先对n方向进行遍历再对m方向进行遍历,因此,第一矩阵的数据不需要被重复加载,即第一矩阵对应的第一矩阵加载次数为1,第二矩阵需要被重复加载,且第二矩阵对应的第二矩阵加载次数loadb_nspk为m/partition_m(此时,partition_m=b_s1/(k*d_s))。
182.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,包括:当第一利用率大于等于第一切分利用率:确定维度切分标识为第一切分子标识、累加缓存器标识为第一缓存器子标识、累加缓存器的目标尺寸为0;基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽和第二矩阵对应的加载带宽,确定矩阵乘法运算的目标利用率。
183.例如,在第一矩阵对应的加载带宽小于第二矩阵对应的加载带宽时,矩阵乘法运算的目标利用率表示为:util=min(n*mata_bw,m*matb_bw/loadb_nspk)/hw_power,其中,loadb_nspk=m/partition_m。
184.例如,在第一矩阵对应的加载带宽大于等于第二矩阵对应的加载带宽时,矩阵乘法运算的目标利用率表示为:util=min(n*mata_bw/loada_nspk,m*matb_bw)/hw_power,其中,loada_nspk=n/partition_n。
185.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,还包括:当第一利用率小于第一切分利用率时,基于调节系数和当前计算尺寸,确定调节后尺寸,将调节后尺寸作为当前计算尺寸迭代地计算利用率,直到得到小于第一切分利用率的利用率作为目标切分利用率;基于第一矩阵维数、第三矩阵维数、数据尺寸、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽和与目标切分利用率对应的当前计算尺寸,确定第一维数外层分块参数和第三维数外层分块参数;基于第一输入缓存器的尺寸、第二输入缓存器的尺寸、第一维数外层分块参数、第三维数外层分块参数和数据尺寸,确定第二维数分块参数。
186.例如,调节系数小于1,在一些实施例中,调节系数可以为0.5,调节后尺寸可以为当前计算尺寸和调节系数之积。需要说明的是,调节系数可以根据具体情况设置,本公开对此不作限制。
187.例如,若不使用split_k的情况下得到的gemm利用率(即第一利用率)低于使用split_k的情况下得到的gemm利用率(即第一切分利用率),则需要判断是否可以使用更小尺寸的累加缓存器就可以得到相同的结果。例如,可以将用于累加计算的累加缓存器的尺寸acc_buffer(即当前计算尺寸)设置为累加缓存器的最大尺寸acc_buffer_max的一半,然后,基于该当前计算尺寸acc_buffer再次重复计算利用率,若基于该当前计算尺寸acc_buffer计算得到的利用率不低于第一切分利用率,则可以减少使用的累加缓存器,以此类推循环重复计算,直到得到的利用率低于第一切分利用率,该低于第一切分利用率的利用率为目标切分利用率。
188.例如,在第一次计算切分利用率时,将累加缓存器的最大尺寸作为当前计算尺寸(下面称为第一当前计算尺寸)以用于计算切分利用率,此时,第一当前计算尺寸acc_buffer1为acc_buffer_max,当基于第一当前计算尺寸得到的切分利用率大于第一切分利用率时,基于调节系数(例如,0.5)和第一当前计算尺寸,确定调节后尺寸(下面称为第一调节后尺寸),将该第一调节后尺寸作为当前计算尺寸(下面称为第二当前计算尺寸)以用于计算切分利用率,即在第二次计算切分利用率时,第二当前计算尺寸acc_buffer2为0.5*acc_buffer_max,当基于第二当前计算尺寸得到的切分利用率仍然大于第一切分利用率时,基于调节系数和第二当前计算尺寸,确定调节后尺寸(下面称为第二调节后尺寸),将该第二调节后尺寸作为当前计算尺寸(下面称为第三当前计算尺寸)以用于计算切分利用率,
即在第三次计算切分利用率时,第三当前计算尺寸acc_buffer3为0.5*0.5*acc_buffer_max,依次类推,指导最后得到小于第一切分利用率的切分利用率,该小于第一切分利用率的切分利用率为目标切分利用率。
189.例如,在一些实施例中,基于第一矩阵维数、第三矩阵维数、数据尺寸、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽和与目标切分利用率对应的当前计算尺寸,确定第一维数外层分块参数和第三维数外层分块参数,包括:基于与目标切分利用率对应的当前计算尺寸、第一矩阵维数、第三矩阵维数、数据尺寸、第一矩阵对应的加载带宽和第二矩阵对应的加载带宽,确定第一矩阵加载次数和第二矩阵加载次数;基于第二矩阵加载次数和第一矩阵维数,确定第一维数外层分块参数;基于第一矩阵加载次数和第三矩阵维数,确定第三维数外层分块参数。
190.例如,在第一利用率小于第一切分利用率时,则确定需要使用split_k,此时,第一维数外层分块参数partition_m表示为:partition_m=m/loadb_spk,第三维数外层分块参数partition_n表示为:partition_n=n/loada_spk,第二维数分块参数partition_k为min(b_s1/(partition_m*d_s),b_s2/(partition_n*d_s))。例如,当b_s1和b_s2相等,则第二维数分块参数partition_k表示为min(b_s1/max(parititon_m,partition_n)*d_s)。
191.例如,第一矩阵加载次数loada_spk和第二矩阵加载次数loadb_spk满足以下条件:loada_spk*loadb_spk=(m*n*d_s)/acc_buffer_needed,load_a_spk/load_b_spk=m*matb_bw/n*mata_bw,此时,acc_buffer_needed为与目标切分利用率对应的当前计算尺寸,应当知道acc_buffer_needed必然小于等于acc_buffer_max。
192.例如,在一些实施例中,在步骤s20中,基于第一比较结果,确定输出参数,包括:当第一利用率小于第一切分利用率:确定维度切分标识为第二切分子标识、累加缓存器标识为第二缓存器子标识、累加缓存器的目标尺寸为与目标切分利用率对应的当前计算尺寸;基于第一矩阵的维度参数、第二矩阵的维度参数、数据尺寸、硬件算力、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽、第一矩阵加载次数和第二矩阵加载次数,确定矩阵乘法运算的目标利用率。
193.例如,维度切分标识为第二切分子标识表示需要对第二矩阵维数进行切分,累加缓存器标识为第二缓存器子标识表示需要设置累加缓存器。
194.例如,第二切分子标识和第二缓存器子标识均可以为二进制数,第一切分子标识和第二切分子标识不相同,第一缓存器子标识和第二缓存器子标识不相同,例如,第二切分子标识可以为1,第二缓存器子标识可以为1。
195.需要说明的是,第一切分子标识、第二切分子标识、第一缓存器子标识和第二缓存器子标识的具体值可以根据实际情况设置,本公开对此不作限制,例如,第一切分子标识和第一缓存器子标识也可以不同,例如,第一切分子标识为0,第一缓存器子标识为2。
196.例如,与目标切分利用率对应的当前计算尺寸即为需要的累加缓存器的最终尺寸acc_buffer_needed。
197.例如,维度切分标识与累加缓存器标识以及累加缓存器的最终尺寸acc_buffer_needed均相关,只有当维度切分标识为第二切分子标识时,才需要累加缓存器,且可以将与目标切分利用率对应的当前计算尺寸输出以作为累加缓存器的最终尺寸acc_buffer_needed。
198.例如,只有在使用split-k的情况下,才需要累积缓存器,并确定累加缓存器的最终尺寸acc_buffer_needed,实际上,在累积缓存器中可以执行在ai加速器的外部进行数据累加的过程。
199.例如,当第一利用率小于第一切分利用率时,矩阵乘法运算的目标利用率即为上述目标切分利用率,该目标切分利用率可以采用上述公式(7)进行计算,不同之处在于,对于计算目标切分利用率,公式(7)中的loada_spk和loadb_spk是基于与目标切分利用率对应的当前计算尺寸计算得到的。
200.例如,在一些实施例中,基于第一比较结果,确定输出参数,还包括:当第一利用率小于第一切分利用率时,确定外层循环标志为外层预设标志。例如,在一些实施例中,外层预设标志指示在循环顺序中,第一维数外层分块参数位于第三维数外层分块参数之前,即先对n方向进行遍历再对n方向进行遍历。
201.例如,外层预设标志可以根据实际应用场景由用户预先设置。本公开对外层预设标志不作具体限制。
202.例如,在一些实施例中,输入参数还包括同步粒度和最小数据块对应的第一块参数和第二块参数。
203.例如,同步粒度可以表示ai加速器和处理器核之间的同步粒度。
204.例如,在一些实施例中,第一块参数和第二块参数可以相同,例如,均为64。当然,本公开不限于此,第一块参数和第二块参数也可以不相同。
205.例如,第一块参数和第二块参数可以分别为最小数据块的宽度和长度。
206.例如,在gpu中,一个kernel对应一个线程网格(grid),该线程网格又包含若干个最小数据块(block),每个block内包含若干个线程(thread)。
207.例如,在一些实施例中,基于输入参数,获得输出参数,包括:基于第一块参数、第二块参数、第一维数外层分块参数、同步粒度和数据尺寸,确定第一维数内层分块参数和第三维数内层分块参数。
208.对于内层循环,例如,如图3a所示,内层循环表示针对第三矩阵中的每个矩阵块的循环,例如,第三矩阵中的每个矩阵块可以表示为partition_m*partition_n。输入参数中的同步粒度sync_granularity决定了在内层循环中每次循环体处理的数据的数量,从而可以确定内层循环的步长。
209.例如,同步粒度sync_granularity的单位可以为最小数据块。
210.例如,在一些实施例中,基于第一块参数、第二块参数、第一维数外层分块参数、同步粒度和数据尺寸,确定第一维数内层分块参数和第三维数内层分块参数,包括:基于第一块参数和第一维数外层分块参数,确定第一数据块数量;基于第二块参数和第三维数外层分块参数,确定第二数据块数量;基于第一块参数、第二块参数、同步粒度、数据尺寸和第一数据块数量,确定第一维数内层分块参数和第三维数内层分块参数。
211.例如,在一些实施例中,基于第一块参数、第二块参数、同步粒度、数据尺寸和第一数据块数量,确定第一维数内层分块参数和第三维数内层分块参数,包括:基于同步粒度和数据尺寸,确定第一中间数据块数量;响应于第一中间数据块数量小于第一数据块数量,确定第三数据块数量为第一中间数据块数量;响应于第一中间数据块数量大于等于第一数据块数量,确定第三数据块数量为第一数据块数量;基于第一中间数据块数量和第三数据块
数量,确定第二中间数据块数量;响应于第二中间数据块数量小于1,确定第四数据块数量为1;响应于第二中间数据块数量大于等于1,确定第四数据块数量为第二中间数据块数量;基于第三数据块数量和第一块参数,确定第一维数内层分块参数;基于第四数据块数量和第二块参数,确定第三维数内层分块参数。
212.例如,对于内层循环,首先,计算在第三矩阵中的一个矩阵块(该矩阵块可以被称为partition块)对应的最小数据块的数量(最小数据块为硬件限制中的最小的数据块),partition块的尺寸为单次外层循环尺寸。
213.例如,第一数据块数量block_num_m可以为parititon_m/block_size_m,其中,block_size_m为第一块参数,第二数据块数量block_num_n可以为partition_n/block_size_n,其中,block_size_n为第二块参数。
214.例如,在一些实施例中,分块方法还可以包括:确定内层循环标志为内层预设标志。内层循环标志用于指示第一维数内层分块参数和第三维数内层分块参数在循环顺序中的顺序。
215.例如,内层预设标志可以根据实际应用场景由用户预先设置。本公开对内层预设标志不作具体限制。
216.例如,为了保证与硬件架构统一,在内层循环中,可以选择按列进行累加,此时,内层预设标志表示:在循环顺序中,第三维数内层分块参数tile_n位于第一维数内层分块参数tile_m之前。
217.在每一次累加时,parititon_m方向对应的最小数据块的数量为第三数据块数量tile_m_block,parititon_n方向对应的最小数据块的数量为第四数据块数量tile_n_block,且tile_m_block=sync_granularity/(2*d_s),此时,对应的tile_n_block为1。
218.与此同时需要受到每列对应的最小数据块的数量的约束,若sync_granularity对应的最小数据块的数量超过了第一数据块数量block_num_m,则在每次循环中,第三数据块数量tile_m_block为block_num_m,第四数据块数量tile_n_block为sync_granularity/(2*dem_size)/tile_m_block。最终,第一维数内层分块参数tile_m为tile_m_block*block_size_m,第三维数内层分块参数tile_n即为tile_n_block*block_size_n。
219.例如,在计算得到所有分块参数之后,将计算出分块参数按照由外到内顺序进行组合以得到循环顺序,循环顺序表示为“外层循环-》split-k循环-》内层循环”的顺序,在外层循环中,第一维数外层分块参数和第三维数外层分块参数的顺序基于外层循环标志确定,在内层循环中,第一维数内层分块参数和第三维数内层分块参数的顺序基于内层循环标志确定。
220.需要说明的是,第一维数外层分块参数partition_m表示在外层循环中,在第一矩阵的m方向上的步长,第三维数外层分块参数partition_n在外层循环中,在第二矩阵的n方向上的步长;第一维数内层分块参数tile_m表示在内层循环中,在每个partition块的partition_m方向上的步长,第三维数内层分块参数tile_n表示在内层循环中,在每个partition块的partition_n方向上的步长。
221.从整体结构来看,本公开的实施例提供的分块方法的流程分为两个方面:拆分k维度的必要性以及m与n维度的划分,具体为:对于是否使用split_k(在k维度上进行划分,使用累加缓存器完成通用矩阵乘法的外部数据累加)策略的判断,以及根据用于累加缓存器
对应的最大尺寸和累加缓存器对应的不同尺寸对应的性能数据决定使用split_k策略时使用的累加缓存器的最终尺寸以及对应的gemm利用率。
222.同时,在m/n维度的划分中,主要包括两个层次(即外层循环和内层循环),在外层循环中,第一维数外层分块参数和第三维数外层分块参数根据第一矩阵和第二矩阵满载情况作为切分粒度而确定的,在内层循环中,第一维数内层分块参数和第三维数内层分块参数根据设置的ai加速器与处理器核之间的同步粒度sync granularity作为切分粒度而确定的。循环顺序(row-major、column-major)根据上面描述中的不同情况而确定。
223.图5为本公开一些实施例提供的一种分块方法的示意性流程图。
224.下面结合图5简单描述本公开的实施例提供的分块方法的完整流程。
225.在该分块方法中,如图5所示,首先,在步骤s501中,基于输入参数,计算第一矩阵对应的第一矩阵尺寸mata_size和第二矩阵对应的第二矩阵尺寸matb_size,mata_size=m*k*d_s,matb_size=n*k*d_s。
226.如图5所示,输入参数包括第一矩阵维数m、第二矩阵维数k、第三矩阵维数n、数据尺寸d_s、第一矩阵对应的加载带宽mata_bw、第二矩阵对应的加载带宽matb_bw、第一输入缓存器的尺寸b_s1和第二输入缓存器的尺寸b_s2。
227.如图5所示,在步骤s502中,比较第一矩阵尺寸mata_size和第一输入缓存器的尺寸b_s1并比较第二矩阵尺寸matb_size和第二输入缓存器的尺寸b_s2。
228.当第一矩阵尺寸mata_size大于第一输入缓存器的尺寸b_s1且第二矩阵尺寸matb_size大于第二输入缓存器的尺寸b_s2时(y),执行步骤s503和步骤504。步骤s503表示不使用split_k的情况,步骤s504表示使用split_k的情况。
229.在步骤s503中,计算第一矩阵加载次数loada_nspk、第二矩阵加载次数loadb_nspk、第一矩阵对应的总加载周期数loada_cycle、第二矩阵对应的总加载周期数loadb_cycle和第一利用率。
230.例如,若先对m方向进行遍历后对n方向进行遍历,则loada_nspk=n*k*d_s/b_s1,loadb_nspk=1,loada_cycle=load_buffera_cycle*loada_nspk=m*k*loada_nspk*d_s/mata_bw,loadb_cycle=load_bufferb_cycle*loadb_nspk=n*k*d_s/matb_bw。
231.例如,若先对n方向进行遍历后m方向进行遍历,则loada_nspk=1,loadb_nspk=m*k*d_s/b_s2,loada_cycle=load_buffera_cycle*loada_nspk=m*k*d_s/mata_bw,loadb_cycle=load_bufferb_cycle*loadb_nspk=n*k*loadb_nspk*d_s/matb_bw。
232.例如,第一利用率util_nosplitk为:util_nosplitk=gemm_cycle/(max(gemm_cycle,min(loada_cycle(loada_cycle=m*k*loada_nspk*d_s/mata_bw),loadb_cycle(loadb_cycle=n*k*loadb_nspk*d_s/matb_bw)))。
233.如图5所示,在步骤s504中,在当前计算尺寸acc_buffer为累加缓存器的最大尺寸acc_buffer_max的情况下,计算第一切分利用率,即procedure“calc_util_splitk”。在执行procedure“calc_util_splitk”时,首先计算第一矩阵加载次数loada_spk和第二矩阵加载次数loadb_spk,loada_spk和loadb_spk满足以下公式:
234.(a)loada_spk*loadb_spk=m*n*d_s/(acc_buffer);
235.(b)loada_spk/loadb_spk=m*matb_bw/n*mata_bw。
236.基于上述公式(a)和(b),即可计算得到loada_spk和loadb_spk。然后,计算通用矩
阵乘法周期数gemm_cycle、第一矩阵对应的总加载周期数loada_cycle和第二矩阵对应的总加载周期数loadb_cycle。gemm_cycle=m*n*k*d_s/hw_power,loada_cycle=m*k*loada_spk*d_s/mata_bw,loadb_cycle=n*k*loadb_spk*d_s/matb_bw。最后,计算第一切分利用率util_splitk,例如,util_splitk=gemm_cycle/max(gemm_cycle,loada_cycle,loadb_cycle)
237.例如,在步骤s504中,需要获取输入参数中的累加缓存器的最大尺寸acc_buffer_max(即累加缓存器的最大可用尺寸)。
238.如图5所示,在步骤s505中,比较第一利用率util_nosplitk和第一切分利用率util_splitk。当第一利用率util_nosplitk大于第一切分利用率util_splitk时(y),执行步骤s506。
239.在步骤s506中,计算第一维数外层分块参数partition_m、第二维数分块参数partition_k和第三维数外层分块参数partition_n,partition_m=b_s1/(k*d_s),partition_n=b_s2/(k*d_s),partition_k=k。
240.然后,在步骤s507中,比较第一矩阵对应的加载带宽mata_bw和第二矩阵对应的加载带宽matb_bw。当第一矩阵对应的加载带宽mata_bw小于第二矩阵对应的加载带宽matb_bw时(y),执行步骤s508。
241.在步骤s508中,确定外层循环标志outloop_rowmajor_flag=1,计算第一矩阵加载次数loada_nspk、第二矩阵加载次数loadb_nspk和矩阵乘法运算的目标利用率,loada_nspk=1(未示出),loadb_nspk=m/partition_m,矩阵乘法运算的目标利用率util表示为:util=min(n*mata_bw,m*matb_bw/loadb_nspk)/hw_power。
242.当第一矩阵对应的加载带宽mata_bw大于等于第二矩阵对应的加载带宽matb_bw时(n),执行步骤s509。
243.在步骤s509中,确定外层循环标志outloop_rowmajor_flag=0,计算第一矩阵加载次数loada_nspk、第二矩阵加载次数loadb_nspk和矩阵乘法运算的目标利用率,loada_nspk=n/partition_n,loadb_nspk=1(未示出),矩阵乘法运算的目标利用率util表示为:util=min(n*mata_bw/loada_nspk,m*matb_bw)/hw_power。
244.如图5所示,在第一矩阵对应的加载带宽mata_bw小于第二矩阵对应的加载带宽matb_bw时,在步骤s510中,输出参数包括:第一维数外层分块参数partition_m=b_s1/(k*d_s)、第二维数分块参数partition_k=k、第三维数外层分块参数partition_n=b_s2/(k*d_s)、第一矩阵加载次数loada_nspk=1、第二矩阵加载次数loadb_nspk=m/partition_m、维度切分标识need_splitk_flag=0,累加缓存器标识acc_buffer_flag=0(未示出),累加缓存器的目标尺寸acc_buffer_needed=0,矩阵乘法运算的目标利用率gemm_utilizaition=util(步骤s508中的util)。
245.如图5所示,在第一矩阵对应的加载带宽mata_bw大于等于第二矩阵对应的加载带宽matb_bw时,在步骤s511中,输出参数包括:第一维数外层分块参数partition_m=b_s1/(k*d_s)、第二维数分块参数partition_k=k、第三维数外层分块参数partition_n=b_s2/(k*d_s)、第一矩阵加载次数loada_nspk=n/partition_n、第二矩阵加载次数loadb_nspk=1、维度切分标识need_splitk_flag=0,累加缓存器标识acc_buffer_flag=0(未示出),累加缓存器的目标尺寸acc_buffer_needed=0,矩阵乘法运算的目标利用率gemm_
utilizaition=util(步骤s509中的util)。
246.例如,如图5所示,在步骤s512中,计算第一数据块数量block_num_m和第二数据块数量block_num_n,block_num_m=partition_m/block_size_m,block_num_n=partition_n/block_size_n。
247.例如,如图5所示,在步骤s513中,基于同步粒度sync_granularity,计算第三数据块数量tile_m_block和第四数据块数量tile_n_block,tile_m_block=min(sync_granularity/(2*d_s),block_num_m),tile_n_block=max(1,sync_granularity/(2*d_s)/tile_m_block)。
248.例如,如图5所示,在步骤s514中,输出参数还包括第一维数内层分块参数tile_m和第三维数内层分块参数tile_n,tile_m=tile_m_block*block_size_m,tile_n=tile_n_block*block_size_n。
249.如图5所示,在步骤s505中,当第一利用率util_nosplitk小于等于第一切分利用率util_splitk时(n),执行步骤s515~s517。
250.例如,在步骤s515中,将当前计算尺寸acc_buffer设置为acc_buffer_max/2,然后迭代执行上述“procedure“calc_util_splitk
””
以计算新的切分利用率util_splitk_new,直到util_splitk_new==util_splitk,此时,util_splitk_new为目标切分利用率。
251.例如,在步骤s516中,计算第一维数外层分块参数partition_m、第二维数分块参数partition_k、第三维数外层分块参数partition_n,partition_m=m/loadb_spk,partition_n=n/loada_spk,partition_k=min(b_s1/(partition_m*d_s),b_s2/(partition_n*d_s))。例如,在步骤s516中,loada_spk和loadb_spk是基于与目标切分利用率对应的当前计算尺寸计算得到的。
252.例如,在步骤s517中,输出参数包括:第一维数外层分块参数partition_m、第二维数分块参数partition_k、第三维数外层分块参数partition_n、第一矩阵加载次数loada_spk、第二矩阵加载次数loadb_spk、维度切分标识need_splitk_flag=1,累加缓存器标识acc_buffer_flag=1(未示出),累加缓存器的目标尺寸acc_buffer_needed,acc_buffer_needed为与目标切分利用率对应的当前计算尺寸,矩阵乘法运算的目标利用率gemm_utilizaition=util_splitk_new。然后,在执行步骤s517之后,可以执行步骤s512~步骤514,具体参见上面的描述,此处不再赘述。
253.如图5所示,在步骤s502中,当第一矩阵尺寸mata_size小于等于第一输入缓存器的尺寸b_s1和/或第二矩阵尺寸matb_size小于等于第二输入缓存器的尺寸b_s2时(n),执行步骤s518~步骤522。
254.例如,在步骤s518中,计算矩阵乘法运算的目标利用率util,util=min(1,(n*mata_bw)/hw_power,(m*matb_bw)/hw_power)。
255.例如,在步骤s519中,比较第一矩阵维数m和第三矩阵维数n,当第一矩阵维数m小于第三矩阵维数n时(y),执行步骤s520。当第一矩阵维数m大于等于第三矩阵维数n时(n),执行步骤s521。
256.在步骤s520中,计算第一维数外层分块参数partition_m、第二维数分块参数partition_k、第三维数外层分块参数partition_n,partition_m=m,partition_n=min(b_s2/(k*d_s),n),partition_k=k。
257.在步骤s521中,计算第一维数外层分块参数partition_m、第二维数分块参数partition_k、第三维数外层分块参数partition_n,partition_m=min(b_s1/(k*d_s),m),partition_n=n,partition_k=k。
258.然后,执行步骤s520和步骤521之后,执行步骤s512,然后执行步骤s522。
259.例如,在步骤s522中,输出参数包括:第一维数外层分块参数partition_m、第二维数分块参数partition_k、第三维数外层分块参数partition_n、第一矩阵加载次数loada_nspk=1、第二矩阵加载次数loadb_spk=1、维度切分标识need_splitk_flag=0,累加缓存器标识acc_buffer_flag=0(未示出),累加缓存器的目标尺寸acc_buffer_needed=0,矩阵乘法运算的目标利用率gemm_utilizaition=util(上述步骤s518中计算得到的util)。然后,在执行步骤s522之后,可以执行步骤s513~步骤514,具体参见上面的描述,此处不再赘述。
260.需要说明的是,在步骤s522中,当第一矩阵维数m小于第三矩阵维数n时,partition_n=min(b_s2/(k*d_s),n),partition_m=m,partition_k=k;当第一矩阵维数m大于等于第三矩阵维数n时,partition_m=min(b_s1/(k*d_s),m),partition_n=n,partition_k=k。
261.本公开至少一个实施例还提供一种用于卷积运算的方法。图6为本公开一些实施例提供的一种用于卷积运算的方法的示意性流程图。
262.例如,在一些实施例中,卷积运算表示利用卷积核对输入图像进行运算。
263.如图6所示,该用于卷积运算的方法包括以下步骤s30和步骤s40。
264.步骤s30,基于卷积运算的卷积输入参数,确定第一卷积运算矩阵和第二卷积运算矩阵;
265.步骤s40,将第一卷积运算矩阵作为第一矩阵和将第二卷积运算矩阵作为第二矩阵,执行根据本公开的任一实施例所述的分块方法。
266.只需要进行简单的维度映射,本公开的实施例提供的分块方法可以应用于神经网络的卷积运算。
267.例如,在步骤s30中,卷积输入参数可以表示为卷积运算的输入张量(tensor)。卷积运算的卷积输入参数包括与卷积核对应的参数和与输入图像对应的参数。
268.例如,与卷积核对应的参数可以包括每个卷积核的第一核尺寸、第二核尺寸、输入通道数和卷积核数量,与输入图像对应的参数可以包括第一图像尺寸、第二图像尺寸和输入图像数量。
269.例如,第一核尺寸和第二核尺寸可以相同,例如均为3,即每个卷积核为3*3卷积核。本公开的实施例不限于此,第一核尺寸和第二核尺寸也可以不相同。
270.例如,第一卷积运算矩阵具有第一卷积矩阵维数和第二卷积矩阵维数,第二卷积运算矩阵具有第二卷积矩阵维数和第三卷积矩阵维数。当将第一卷积运算矩阵作为第一矩阵和将第二卷积运算矩阵作为第二矩阵时,第一卷积矩阵维数即为上述第一矩阵维数,第二卷积矩阵维数即为上述第二矩阵维数,第三卷积矩阵维数即为上述第三矩阵维数。
271.例如,在一些实施例中,步骤s30包括:基于卷积核数量,确定第一卷积矩阵维数;基于第一核尺寸、第二核尺寸、输入通道数,确定第二卷积矩阵维数;基于输入图像数量、第一图像尺寸和第二图像尺寸,确定第三卷积矩阵维数。
272.例如,第一卷积矩阵维数对应卷积核数量(即输出通道数),第二卷积矩阵维数对应第一核尺寸、第二核尺寸与输入通道数的乘积,第三卷积矩阵维数对应第一图像尺寸、第二图像尺寸与输入图像数量的乘积。
273.当将本公开的实施例提供的分块方法应用于神经网络的卷积运算时,需要进行维度映射,例如,第一核尺寸表示为kh,第二核尺寸表示为kw,输入通道数表示为ic,第一图像尺寸表示为h,第二图像尺寸表示为w,输入图像数量表示为sn,卷积核数量表示为oc(output channel),映射关系为:将卷积核数量oc映射为第一卷积矩阵维数,即上述第一矩阵维数m=oc,将ic*kh*kw映射为第二卷积矩阵维数,即上述第二矩阵维数k=ic*kh*kw,将sn*h*w映射为第三卷积矩阵维数,即上述第三矩阵维数n=sn*h*w。也就是说,上述第一矩阵即为卷积运算中的weight的映射,上述第二矩阵即为卷积运算中的activation的映射。
274.对于卷积运算,可以根据上述映射关系,即可利用本公开的实施例提供的分块方法执行相关操作,以得到分块参数和循环顺序。
275.需要注意的是,对于卷积运算,在计算数据的加载周期数(loading cost)时,由于activation的数据的可复用性,在kh和kw维度的值可复用。因此,各cycle数的计算变为:
276.gemm_cycle=oc*(sn*h*w)*(ic*kh*kw)*d_s/hw_power,
277.loada_cycle=ic*oc*kh*kw*d_s/mata_bw,
278.loadb_cycle=n*h*w*ic*d_s/matb_bw。
279.此处,d_s为卷积核和输入图像每个中的每个数据的数据尺寸。
280.其余部分的计算均与上述分块方法中的描述相同,在此不作赘述。
281.本公开至少一个实施例还提供一种分块装置,该分块装置应用于矩阵乘法运算。图7为本公开至少一个实施例提供的一种分块装置的示意性框图。
282.例如,如图7所示,分块装置70可以包括存储器705和处理器710。存储器705用于非暂时性地存储适于由处理器运行的计算机可执行指令;处理器710用于运行计算机可执行指令,计算机可执行指令被处理器710运行时可以使得处理器710执行根据本公开任一实施例所述的分块方法中的一个或多个步骤。关于该分块方法的各个步骤的具体实现以及相关解释内容可以参见上述分块方法的实施例,在此不做赘述。
283.应当注意,图7所示的分块装置70的组件只是示例性的,而非限制性的,根据实际应用需要,该分块装置70还可以具有其他组件。
284.例如,在一些实施例中,分块装置70还可以包括输入模块,该输入模块被配置为获取输入参数。例如,计算机可执行指令被处理器710运行时可以使得处理器710控制输入模块获取输入参数,并基于该输入参数执行上述分块方法中的一个或多个步骤。
285.例如,处理器710和存储器705之间可以直接或间接地互相通信。
286.例如,处理器710和存储器705可以通过网络连接进行通信。网络可以包括无线网络、有线网络、和/或无线网络和有线网络的任意组合,本公开对网络的类型和功能在此不作限制。又例如,处理器710和存储器705也可以通过总线连接进行通信。总线可以是外设部件互连标准(pci)总线或扩展工业标准结构(eisa)总线等。
287.例如,处理器710和存储器705可以设置在服务器端(或云端),也可以设置在客户端(例如,手机等移动设备)。
288.例如,处理器710可以是中央处理单元(cpu)、张量处理器(tpu)或者图形处理器
gpu等具有数据处理能力和/或指令执行能力的器件,并且可以控制分块装置70中的其它组件以执行期望的功能。中央处理元(cpu)可以为x86或arm架构等。
289.例如,存储器705可以包括一个或多个计算机程序产品的任意组合,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(rom)、硬盘、可擦除可编程只读存储器(eprom)、便携式紧致盘只读存储器(cd-rom)、usb存储器、闪存等。在计算机可读存储介质上可以存储一个或多个计算机可执行指令,处理器710可以运行计算机可执行指令,以实现分块装置70的各种功能。在存储器705中还可以存储各种应用程序和各种数据,以及应用程序使用和/或产生的各种数据等。
290.需要说明的是,分块装置70可以实现与前述分块方法相似的技术效果,重复之处不再赘述。
291.本公开至少一个实施例还提供一种用于卷积运算的装置。图8为本公开至少一个实施例提供的一种用于卷积运算的装置的示意性框图。
292.例如,如图8示,用于卷积运算的装置80可以包括存储器805和处理器810。存储器805用于非暂时性地存储适于由处理器运行的计算机可执行指令;处理器810用于运行计算机可执行指令,计算机可执行指令被处理器810运行时可以使得处理器810执行根据本公开任一实施例所述的用于卷积运算的方法中的一个或多个步骤。关于该用于卷积运算的方法的各个步骤的具体实现以及相关解释内容可以参见上述用于卷积运算的方法的实施例,在此不做赘述。
293.应当注意,图8所示的用于卷积运算的装置80的组件只是示例性的,而非限制性的,根据实际应用需要,该用于卷积运算的装置80还可以具有其他组件。
294.例如,在一些实施例中,用于卷积运算的装置80还可以包括输入模块,该输入模块被配置为获取卷积运算的卷积输入参数。例如,计算机可执行指令被处理器810运行时可以使得处理器810控制输入模块获取卷积运算的卷积输入参数,并基于该卷积运算的卷积输入参数执行上述于卷积运算的方法中的一个或多个步骤。
295.例如,处理器810和存储器805之间可以直接或间接地互相通信。
296.例如,处理器810和存储器805可以通过网络连接进行通信。网络可以包括无线网络、有线网络、和/或无线网络和有线网络的任意组合,本公开对网络的类型和功能在此不作限制。又例如,处理器810和存储器805也可以通过总线连接进行通信。总线可以是外设部件互连标准(pci)总线或扩展工业标准结构(eisa)总线等。
297.例如,处理器810和存储器805可以设置在服务器端(或云端),也可以设置在客户端(例如,手机等移动设备)。
298.例如,处理器810可以是中央处理单元(cpu)、张量处理器(tpu)或者图形处理器gpu等具有数据处理能力和/或指令执行能力的器件,并且可以控制用于卷积运算的装置80中的其它组件以执行期望的功能。中央处理元(cpu)可以为x86或arm架构等。
299.例如,存储器805可以包括一个或多个计算机程序产品的任意组合,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。非易失
性存储器例如可以包括只读存储器(rom)、硬盘、可擦除可编程只读存储器(eprom)、便携式紧致盘只读存储器(cd-rom)、usb存储器、闪存等。在计算机可读存储介质上可以存储一个或多个计算机可执行指令,处理器810可以运行计算机可执行指令,以实现用于卷积运算的装置80的各种功能。在存储器805中还可以存储各种应用程序和各种数据,以及应用程序使用和/或产生的各种数据等。
300.需要说明的是,用于卷积运算的装置80可以实现与前述用于卷积运算的方法相似的技术效果,重复之处不再赘述。
301.本公开至少一个实施例还提供一种计算机可读存储介质。图9为本公开至少一个实施例提供的一种计算机可读存储介质的示意图。
302.例如,如图9所示,在计算机可读存储介质1000上可以非瞬时性地存储一个或多个计算机可执行指令1001。
303.例如,当计算机可执行指令1001由计算机执行时可以执行根据本公开任一实施例所述的分块方法中的一个或多个步骤。
304.又例如,当计算机可执行指令1001由计算机执行时还可以执行根据本公开任一实施例所述的用于卷积运算的方法中的一个或多个步骤。
305.例如,该计算机可读存储介质1000可以应用于上述分块装置70或用于卷积运算的装置80中,例如,其可以为分块装置70中的存储器705或用于卷积运算的装置80中的存储器805。
306.例如,该计算机可读存储介质1000可以为非瞬时性计算机可读存储介质。
307.例如,关于计算机可读存储介质1000的说明可以参考分块装置70的实施例中对于存储器705的描述或参考用于卷积运算的装置80的实施例中对于存储器805,重复之处不再赘述。
308.对于本公开,还有以下几点需要说明:
309.(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
310.(2)为了清晰起见,在用于描述本发明的实施例的附图中,层或结构的厚度和尺寸被放大。可以理解,当诸如层、膜、区域或基板之类的元件被称作位于另一元件“上”或“下”时,该元件可以“直接”位于另一元件“上”或“下”,或者可以存在中间元件。
311.(3)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
312.以上所述仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,本公开的保护范围应以所述权利要求的保护范围为准。

技术特征:
1.一种分块方法,应用于矩阵乘法运算,其中,所述矩阵乘法运算用于实现第一矩阵和第二矩阵之间的乘法运算,所述分块方法包括:基于所述第一矩阵和所述第二矩阵,确定输入参数,其中,所述输入参数包括所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述第一矩阵和所述第二矩阵每个中的每个数据的数据尺寸、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽和输入缓存器的尺寸;基于所述输入参数,获得输出参数,其中,所述输出参数包括循环顺序以及与所述第一矩阵和所述第二矩阵对应的分块参数。2.根据权利要求1所述的分块方法,其中,所述第一矩阵的维度参数包括第一矩阵维数和第二矩阵维数,所述第二矩阵的维度参数包括所述第二矩阵维数和第三矩阵维数,所述分块参数包括与所述第一矩阵维数有关的第一维数外层分块参数、与所述第一维数外层分块参数有关的第一维数内层分块参数、与所述第二矩阵维数有关的第二维数分块参数、与所述第三矩阵维数有关的第三维数外层分块参数和与所述第三维数外层分块参数有关的第三维数内层分块参数,所述循环顺序用于指示所述第一维数外层分块参数、所述第一维数内层分块参数、所述第二维数分块参数、所述第三维数外层分块参数和所述第三维数内层分块参数的顺序。3.根据权利要求2所述的分块方法,其中,所述输入缓存器包括用于缓存所述第一矩阵中的数据的第一输入缓存器和用于缓存所述第二矩阵中的数据的第二输入缓存器,所述输入缓存器的尺寸包括所述第一输入缓存器的尺寸和所述第二输入缓存器的尺寸,基于所述输入参数,获得输出参数,包括:基于所述第一矩阵的维度参数和所述数据尺寸,确定所述第一矩阵对应的第一矩阵尺寸;基于所述第二矩阵的维度参数和所述数据尺寸,确定所述第二矩阵对应的第二矩阵尺寸;比较所述第一矩阵尺寸和所述第一输入缓存器的尺寸并比较所述第二矩阵尺寸和所述第二输入缓存器的尺寸,以确定第一比较结果;基于所述第一比较结果,确定所述输出参数。4.根据权利要求3所述的分块方法,其中,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸,确定所述第二维数分块参数为所述第二矩阵维数;比较所述第一矩阵维数和所述第三矩阵维数,以确定第二比较结果;基于所述第二比较结果,确定所述第一维数外层分块参数和所述第三维数外层分块参数。5.根据权利要求4所述的分块方法,其中,基于所述第二比较结果,确定所述第一维数外层分块参数和所述第三维数外层分块参数包括:响应于所述第二比较结果表示所述第一矩阵维数小于所述第三矩阵维数:
确定所述第一维数外层分块参数为所述第一矩阵维数;基于所述数据尺寸、所述第二矩阵的维度参数和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数;响应于所述第二比较结果表示所述第一矩阵维数大于等于所述第三矩阵维数:确定所述第三维数外层分块参数为所述第三矩阵维数;基于所述数据尺寸、所述第一矩阵的维度参数和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数。6.根据权利要求5所述的分块方法,其中,基于所述数据尺寸、所述第一矩阵的维度参数和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数,包括:基于所述数据尺寸、所述第二矩阵维度和所述第一输入缓存器的尺寸,确定第一中间分块参数;响应于所述第一中间分块参数小于所述第一矩阵维数,确定所述第一维数外层分块参数为所述第一中间分块参数,响应于所述第一中间分块参数大于等于所述第一矩阵维数,确定所述第一维数外层分块参数为所述第一矩阵维数。7.根据权利要求5或6所述的分块方法,其中,基于所述数据尺寸、所述第二矩阵的维度参数和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数,包括:基于所述数据尺寸、所述第二矩阵维度和所述第二输入缓存器的尺寸,确定第二中间分块参数;响应于所述第二中间分块参数小于所述第三矩阵维数,确定所述第三维数外层分块参数为所述第二中间分块参数,响应于所述第二中间分块参数大于等于所述第三矩阵维数,确定所述第三维数外层分块参数为所述第三矩阵维数。8.根据权利要求3-6任一项所述的分块方法,其中,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸,比较所述第一矩阵维数和所述第三矩阵维数,以确定第二比较结果;基于所述第二比较结果,确定外层循环标志。9.根据权利要求8所述的分块方法,其中,基于所述第二比较结果,确定外层循环标志包括:响应于所述第二比较结果表示所述第一矩阵维数小于所述第三矩阵维数:确定所述外层循环标志为第一标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序,所述第一标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之前;响应于所述第二比较结果表示所述第一矩阵维数大于等于所述第三矩阵维数:确定所述外层循环标志为第二标志,其中,所述第二标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之后。10.根据权利要求8所述的分块方法,其中,基于所述第一比较结果,确定所述输出参
数,还包括:基于所述外层循环标志,确定所述循环顺序中所述第一维数外层分块参数和所述第三维数外层分块参数的顺序。11.根据权利要求3-6任一项所述的分块方法,其中,所述输入参数还包括:累加缓存器的最大尺寸和硬件算力,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸大于所述第一输入缓存器的尺寸且所述第二矩阵尺寸大于所述第二输入缓存器的尺寸,响应于不对所述第二矩阵维数进行切分,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一输入缓存器的尺寸和所述第二输入缓存器的尺寸,计算第一利用率;响应于对所述第二矩阵维数进行切分,将所述累加缓存器的最大尺寸作为当前计算尺寸,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一输入缓存器的尺寸、所述第二输入缓存器的尺寸和所述当前计算尺寸,计算第一切分利用率;当所述第一利用率大于等于所述第一切分利用率时:确定所述第二维数分块参数为所述第二矩阵维数;基于所述第二矩阵维数、所述数据尺寸和所述第一输入缓存器的尺寸,确定所述第一维数外层分块参数;基于所述第二矩阵维数、所述数据尺寸和所述第二输入缓存器的尺寸,确定所述第三维数外层分块参数。12.根据权利要求11所述的分块方法,其中,基于所述第一比较结果,确定所述输出参数,还包括:当所述第一利用率小于所述第一切分利用率时:基于调节系数和所述当前计算尺寸,确定调节后尺寸,将所述调节后尺寸作为所述当前计算尺寸迭代地计算利用率,直到得到小于所述第一切分利用率的利用率作为目标切分利用率;基于所述第一矩阵维数、所述第三矩阵维数、所述数据尺寸、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽和与所述目标切分利用率对应的当前计算尺寸,确定所述第一维数外层分块参数和所述第三维数外层分块参数;基于所述第一输入缓存器的尺寸、所述第二输入缓存器的尺寸、所述第一维数外层分块参数、所述第三维数外层分块参数和所述数据尺寸,确定所述第二维数分块参数。13.根据权利要求11所述的分块方法,其中,基于所述第一比较结果,确定所述输出参数,还包括:当所述第一利用率大于等于所述第一切分利用率时:响应于所述第一矩阵对应的加载带宽小于所述第二矩阵对应的加载带宽,确定外层循环标志为第一标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序,所述第一标志指示在所述循环顺序中,
所述第一维数外层分块参数位于所述第三维数外层分块参数之前,响应于所述第一矩阵对应的加载带宽大于等于所述第二矩阵对应的加载带宽,确定所述外层循环标志为第二标志,其中,所述第二标志指示在所述循环顺序中,所述第一维数外层分块参数位于所述第三维数外层分块参数之后。14.根据权利要求11所述的分块方法,其中,基于所述第一比较结果,确定所述输出参数,还包括:当所述第一利用率小于所述第一切分利用率时,确定外层循环标志为外层预设标志,其中,所述外层循环标志用于指示所述第一维数外层分块参数和所述第三维数外层分块参数在所述循环顺序中的顺序。15.根据权利要求2-6任一项所述的分块方法,其中,所述输入参数还包括同步粒度和最小数据块对应的第一块参数和第二块参数,基于所述输入参数,获得输出参数,包括:基于所述第一块参数、所述第二块参数、所述第一维数外层分块参数、所述同步粒度和所述数据尺寸,确定所述第一维数内层分块参数和所述第三维数内层分块参数。16.根据权利要求3-6任一项所述的分块方法,其中,所述输入参数还包括硬件算力,所述输出参数还包括以下中的至少一个:维度切分标识、累加缓存器标识、累加缓存器的目标尺寸、所述第一矩阵对应的第一矩阵加载次数、所述第二矩阵对应的第二矩阵加载次数和所述矩阵乘法运算的目标利用率,其中,所述维度切分标识用于指示是否需要对所述第二矩阵维数进行切分,所述累加缓存器标识用于指示是否需要累加缓存器,所述累加缓存器的目标尺寸表示在需要累加缓存器时所需的累加缓存器的尺寸,基于所述第一比较结果,确定所述输出参数,包括:响应于所述第一比较结果表示所述第一矩阵尺寸小于等于所述第一输入缓存器的尺寸和/或所述第二矩阵尺寸小于等于所述第二输入缓存器的尺寸:确定所述第一矩阵加载次数和所述第二矩阵加载次数均为1;确定所述维度切分标识为第一切分子标识、所述累加缓存器标识为第一缓存器子标识、所述累加缓存器的目标尺寸为0,其中,所述维度切分标识为所述第一切分子标识表示不需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第一缓存器子标识表示不需要累加缓存器;基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述矩阵乘法运算的目标利用率。17.根据权利要求12所述的分块方法,其中,所述输出参数还包括以下中的至少一个:维度切分标识、累加缓存器标识、累加缓存器的目标尺寸、所述第一矩阵对应的第一矩阵加载次数、所述第二矩阵对应的第二矩阵加载次数和所述矩阵乘法运算的目标利用率,其中,所述维度切分标识用于指示是否需要对所述第二矩阵维数进行切分,所述累加缓存器标识用于指示是否需要累加缓存器,所述累加缓存器的目标尺寸表示在需要累加缓存器时所需的累加缓存器的尺寸,基于所述第一比较结果,确定所述输出参数,包括:
当所述第一利用率大于等于所述第一切分利用率:确定所述维度切分标识为第一切分子标识、所述累加缓存器标识为第一缓存器子标识、所述累加缓存器的目标尺寸为0,其中,所述维度切分标识为所述第一切分子标识表示不需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第一缓存器子标识表示不需要累加缓存器,响应于所述第一矩阵对应的加载带宽小于所述第二矩阵对应的加载带宽,确定所述第一矩阵加载次数为1,基于所述第一维数外层分块参数和所述第一矩阵维数确定所述第二矩阵加载次数,响应于所述第一矩阵对应的加载带宽大于等于所述第二矩阵对应的加载带宽,基于所述第三维数外层分块参数和所述第三矩阵维数确定所述第一矩阵加载次数,确定所述第二矩阵加载次数为1,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述矩阵乘法运算的目标利用率;以及当所述第一利用率小于所述第一切分利用率:确定所述维度切分标识为所述第二切分子标识、所述累加缓存器标识为第二缓存器子标识、所述累加缓存器的目标尺寸为与所述目标切分利用率对应的当前计算尺寸,其中,所述维度切分标识为所述第二切分子标识表示需要对所述第二矩阵维数进行切分,所述累加缓存器标识为所述第二缓存器子标识表示需要累加缓存器,基于与所述目标切分利用率对应的当前计算尺寸、所述第一矩阵维数、所述第三矩阵维数、所述数据尺寸、所述第一矩阵对应的加载带宽和所述第二矩阵对应的加载带宽,确定所述第一矩阵加载次数和所述第二矩阵加载次数,基于所述第一矩阵的维度参数、所述第二矩阵的维度参数、所述数据尺寸、所述硬件算力、所述第一矩阵对应的加载带宽、所述第二矩阵对应的加载带宽、所述第一矩阵加载次数和所述第二矩阵加载次数,确定所述矩阵乘法运算的目标利用率。18.一种用于卷积运算的方法,其中,所述卷积运算表示利用卷积核对输入图像进行运算,所述方法包括:基于所述卷积运算的卷积输入参数,确定第一卷积运算矩阵和第二卷积运算矩阵,其中,所述卷积输入参数包括与所述卷积核对应的参数和与所述输入图像对应的参数;将所述第一卷积运算矩阵作为第一矩阵和将所述第二卷积运算矩阵作为第二矩阵,执行根据权利要求1-17中任一所述分块方法。19.根据权利要求18所述的方法,其中,与所述卷积核对应的参数包括每个卷积核的第一核尺寸、第二核尺寸、输入通道数和卷积核数量,与所述输入图像对应的参数包括第一图像尺寸、第二图像尺寸和输入图像数量,所述第一卷积运算矩阵具有第一卷积矩阵维数和第二卷积矩阵维数,所述第二卷积运算矩阵具有所述第二卷积矩阵维数和第三卷积矩阵维数,基于所述卷积运算的卷积输入参数,确定第一卷积运算矩阵和第二卷积运算矩阵,包括:
基于所述卷积核数量,确定所述第一卷积矩阵维数;基于所述第一核尺寸、所述第二核尺寸和所述输入通道数,确定所述第二卷积矩阵维数;基于所述输入图像数量、所述第一图像尺寸和所述第二图像尺寸,确定所述第三卷积矩阵维数。20.一种分块装置,应用于矩阵乘法运算,且包括存储器和处理器,其中,所述存储器存储有适于由所述处理器运行的计算机可执行指令,所述计算机可执行指令被所述处理器运行时执行根据权利要求1-17中任一项所述的分块方法中的一个或多个步骤。21.一种用于卷积运算的装置,包括存储器和处理器,其中,所述存储器存储有适于由所述处理器运行的计算机可执行指令,所述计算机可执行指令被所述处理器运行时执行根据权利要求18或19所述的用于卷积运算的方法中的一个或多个步骤。22.一种计算机可读存储介质,非瞬时性地存储有计算机可执行指令,其中,所述计算机可执行指令被计算机运行时执行根据权利要求1-17中任一项所述的分块方法中的一个或多个步骤或执行根据权利要求18或19所述的用于卷积运算的方法中的一个或多个步骤。

技术总结
一种应用于矩阵乘法运算的分块方法、用于卷积运算的方法、应用于矩阵乘法运算的分块装置、用于卷积运算的装置和计算机可读存储介质。该分块方法应用于矩阵乘法运算,矩阵乘法运算用于实现第一矩阵和第二矩阵之间的乘法运算,分块方法包括:基于第一矩阵和第二矩阵,确定输入参数,其中,输入参数包括第一矩阵的维度参数、第二矩阵的维度参数、第一矩阵和第二矩阵每个中的每个数据的数据尺寸、第一矩阵对应的加载带宽、第二矩阵对应的加载带宽和输入缓存器的尺寸;基于输入参数,获得输出参数,其中,输出参数包括循环顺序以及与第一矩阵和第二矩阵对应的分块参数。第二矩阵对应的分块参数。第二矩阵对应的分块参数。


技术研发人员:ꢀ(74)专利代理机构
受保护的技术使用者:上海壁仞智能科技有限公司
技术研发日:2022.04.25
技术公布日:2022/7/5
转载请注明原文地址: https://www.8miu.com/read-2863.html

最新回复(0)