发明内容
有鉴于此,本申请实施例提供了一种矩阵乘运算方法、装置和电子设备,以改善进行BLAS库中通用矩阵乘的算子具体实现时,运算量会非常巨大,运算速度较慢的问题。
第一方面,本申请实施例提供了一种矩阵乘运算方法,应用于电子设备,所述电子设备上设置有加速运算器,所述加速运算器包括:多个加速处理单元,该方法包括:
分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元;
基于拆分得到的所述多个第一数据单元和所述多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组,每个目标数据单元组包括用于进行矩阵乘运算的一个第一数据单元和一个第二数据单元;
采用所述每个加速处理单元,分别对各自被分配的所述多个目标数据单元组进行矩阵乘运算,得到所述每个加速处理单元各自对应的多个输出数据单元;
根据所述多个加速处理单元中所有加速处理单元的多个输出数据单元,确定所述第一输入数据和所述第二输入数据的运算结果。
在该实施方式中,面临数据量大的通用矩阵乘运算,将待进行矩阵乘运算的第一输入数据和第二输入数据进行拆分、组合,并将组合得到的数据单元组分配给具有多个加速运算单元的加速运算器,以使各加速运算单元进行并行计算,将各加速运算单元的运算结果进行组合,得到第一输入数据和第二输入数据的运算结果。从而加速了运算过程,提高了运算速度。
在一可选的实施方式中,所述基于拆分得到的所述多个第一数据单元和所述多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组,包括:
对所述多个第一数据单元和所述多个第二数据单元进行组合,得到多个数据单元组;
获取每个数据单元组中的第一数据单元在所述第一输入数据中的第一索引以及所述每个数据单元组中的第二数据单元在所述第二输入数据中的第二索引;
根据所述第一索引和所述第二索引,从所述多个数据单元中为所述每个加速处理单元分配所述多个目标数据单元组。
在该实施方式中,根据第一索引和第二索引,从多个数据单元组中为每个加速处理单元分配待处理的多个目标数据单元组,提高了目标数据单元组的确定灵活性。
在一可选的实施方式中,所述根据所述第一索引和所述第二索引,从所述多个数据单元中为所述每个加速处理单元分配所述多个目标数据单元组,包括:
根据所述第一索引和所述第二索引,确定所述每个数据单元组对应的输出数据单元的第三索引;
根据所述第三索引,从所述多个数据单元组中为所述每个加速处理单元分配所述多个目标数据单元组。
在该实施方式中,根据第一索引和第二索引,确定输出数据单元的第三索引,然后根据第三索引为每个加速处理单元分配多个目标数据单元组,提高了目标数据单元组的确定灵活性,并使得加速处理单元所处理的目标数据单元组具有一定规律,即遵循一定规律。
在一可选的实施方式中,所述根据所述第三索引,从所述多个数据单元组中为所述每个加速处理单元分配所述多个目标数据单元组,包括:
根据所述第三索引和所述多个加速处理单元的数量进行求余,得到余数;
根据所述余数,从所述多个数据单元组中为所述每个加速处理单元分配所述多个目标数据单元组。
在该实施方式中,根据第三索引,确定余数,然后根据余数为每个加速处理单元分配多个目标数据单元组,提高了目标数据单元组的确定灵活性,并使得加速处理单元所处理的目标数据单元组具有一定规律,即遵循一定规律。
在一可选的实施方式中,所述分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元,包括:
若所述第一输入数据和所述第二输入数据满足预设均分条件,则将所述第一输入数据均分为所述多个第一数据单元,以及将所述第二输入数据均分为所述多个第二数据单元。
在该实施方式中,在满足预设均分条件时,对输入数据进行均分,使得加速处理单元所运算的目标数据单元组的大小一致,提高加速处理单元的同步运算性能。
在一可选的实施方式中,所述分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元,包括:
若所述第一输入数据和所述第二输入数据中的至少一个输入数据不满足预设均分条件,则将所述至少一个输入数据拆分为前p-1个数据单元以及第p个数据单元,其中,所述前p-1个数据单元的数据形状相等,且所述前p-1个数据单元和所述第p个数据单元的数据形状不相同。
在该实施方式中,在不满足预设均分条件时,优先保证前p-1个 数据单元均分,尽可能保证大多数加速处理单元所计算的数据大小基本一致,从而提高加速处理单元的同步运算性能。
在一可选的实施方式中,所述采用所述每个加速处理单元,分别对各自被分配的所述多个目标数据单元组进行矩阵乘运算,得到所述每个加速处理单元各自对应的多个输出数据单元之前,所述方法还包括:
根据预设补偿数据,对所述第p个数据单元进行数据补偿,以使补偿后的第p个数据单元和所述前p-1个数据单元的数据形状相同;
所述根据所述多个加速处理单元中所有加速处理单元的多个输出数据单元,确定所述第一输入数据和所述第二输入数据的运算结果,包括:
从所述所有加速处理单元的多个输出数据单元中,将所述预设补偿数据对应的运算数据结果剔除;
根据剔除后的各加速处理单元的多个输出数据单元进行拼接,确定所述第一输入数据和所述第二输入数据的运算结果。
在该实施方式中,通过引入预设补偿数据以保证数据单元的数据形状相同,这样可保证运算过程中使用相同的内核函数,省去运算过程中需另外编译多个内核函数的过程和需要的内存空间,在运算完毕,可将预设补偿数据对应的运算数据结果剔除,以保证最终数据运算正确性。
在一可选的实施方式中,所述采用所述每个加速处理单元,分别对各自被分配的所述多个目标数据单元组进行矩阵乘运算,得到所述每个加速处理单元各自对应的多个输出数据单元,包括:
创建所述每个加速处理单元的数据处理流,并采用所述数据处理流,加载一个目标数据单元组;
采用所述数据处理流,对所述一个目标数据单元组进行通用矩阵乘运算,得到所述一个目标数据单元组的输出数据单元,并加载下一个目标数据单元组;
采用所述数据处理流,对所述下一个目标数据单元组进行通用矩阵乘运算,得到所述下一个目标数据单元组的输出数据单元,直至得到所述多个输出数据单元。
在该实施方式中,将Gemm 算子的运算过程并行化,由流stream机制的方式保证了并行数据之间的隔离,在加速了运算过程的同时保证了运算结果的正确性,并且通过将加载数据和加速处理单元计算数据的过程异步化,比单一只处理一组数据要更加高效,提高了数据运算速度。
第二方面,本申请实施例还提供了一种矩阵乘运算装置,包括:
拆分模块,用于分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元;
分配模块,用于基于拆分得到的所述多个第一数据单元和所述多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组,每个目标数据单元组包括用于进行矩阵乘运算的一个第一数据单元和一个第二数据单元;
运算模块,用于采用所述每个加速处理单元,分别对各自被分配的所述多个目标数据单元组进行通用矩阵乘运算,得到所述每个加速处理单元各自对应的多个输出数据单元;
确定模块,用于根据所述多个加速处理单元中所有加速处理单元的多个输出数据单元,确定所述第一输入数据和所述第二输入数据的运算结果。
第三方面,本申请实施例还提供了一种电子设备,包括:处理器、加速运算器、存储器,所述存储器存储有机器可读指令,所述处理器、所述加速运算单元用于执行所述机器可读指令,以执行前述第一方面所述的矩阵乘运算方法。
第四方面,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器、加速运算单元运行时执行前述第一方面所述的矩阵乘运算方法。
基于本申请实施例提供的内容,在面临数据量大的通用矩阵乘运算时,将待进行矩阵乘运算的第一输入数据和第二输入数据进行拆分、组合,并将组合得到的数据单元组分配给具有多个加速运算单元的加速运算器,以使各加速运算单元进行并行计算,将各加速运算单元的运算结果进行组合,得到第一输入数据和第二输入数据的运算结果,从而加速了整体运算过程,提高了整体运算速度。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。在不冲突的情况下,本申请的实施例或实施方式可以相互组合。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释,此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
基础线性代数子程序库(Basic Linear Algebra Subprograms,BLAS)是一系列线性代数运算函数的接口标准,这里的线性代数运算是指例如矢量的线性组合,矩阵乘以矢量,矩阵乘以矩阵等,这里的接口指的是比如哪个函数名该有什么功能,函数该有几个输入和几个输出,每个分别代表什么意义。
BLAS被广泛应用在科学计算和工业界,已成为业界标准,不同的作者可以各自写出不同版本的BLAS算子库,实现同样的接口和功能,但是内部的算法不同,这点导致了在不同设备上不同版本BLAS性能会存在差异。
BLAS官网Netlib实现的版本,通常被称为reference BLAS,运行速度较慢,通常被其他版本用于衡量性能,在Intel (英特尔)的中央处理器(Central Processing Unit,CPU)上性能表现最好的BLAS是Intel的数学核心函数库(Intel Math Kernel Library,MKL)中提供的BLAS实现,但是它只针对CPU设备的平台具有良好性能表现,对于带有图形处理器(graphics processing unit,GPU)设备的平台,并没有发挥出来GPU并行计算能力强的特点。而面向GPU设备的平台,Nvidia(英伟达) 推出了cuBLAS,其针对带有Nvidia GPU的平台,对BLAS中各种接口的算法进行了优化,发挥了GPU上并行处理大量数据的优势,接口的处理速度有了大幅提升,但是该cuBLAS算子库只能在带有Nvidia GPU的平台上使用,具有明显的专用性,在其他平台上不具有普适性,不能在其他处理器平台上使用。
其中,对于BLAS算子库中的通用矩阵乘(General Matrix Multiplication,Gemm),该运算过程需要mn/>k次乘法和m/>n/>k次加法运算,当m, n, k 很大(比如超过1024)时,运算量会非常巨大,运算处理速度慢。
基于此,本申请为了优化BLAS算子库中面临大数据量(Shape)的Gemm算子,对Gemm算子的运算过程进行了优化,利用加速运算器中的多个加速处理单元进行并行运算,将Gemm算子的运算过程并行化,加速整体运算速度。
下面结合几个具体实施例对本申请提供的矩阵乘运算方法进行说明。
图1为本申请实施例提供的一种矩阵乘运算方法的流程示意图,本实施例的执行主体可以为电子设备,电子设备上设置有加速运算器,加速运算器包括:多个加速处理单元。当然,电子设备上还可以有能够与加速运算器进行直接或间接通信的中央处理器,加速运算器可视为协助中央处理器执行运算任务的协处理器。
其中,加速运算器可以为AI加速计算卡、AI加速器,加速运算器包括多个加速处理单元,加速处理单元(可记为cluster)可基于CUDA、OpenCL等架构运行,该多个加速运算单元可集成在同一芯片中。
如图1所示,该方法可以包括:
S101、分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元。
第一输入数据和第二输入数据为待进行矩阵乘运算的数据,第一输入数据可以为矩阵形式,将第一输入数据拆分为多个第一数据单元,每个第一数据单元包括第一输入数据中的多个第一矩阵元素,同样地,第二输入数据可以为矩阵形式,将第二输入数据拆分为多个第二数据单元,每个第二数据单元包括第二输入数据中的多个第二矩阵元素。步骤S101可以由电子设备的中央处理器执行。
其中,可以从行维度对第一输入数据进行拆分,得到多个第一数据单元,并从列维度对第二输入数据进行拆分,得到多个第二数据单元,例如,第一输入数据的矩阵形式记为a(mk),m为第一输入数据的行数,k为第一输入数据的列数,将第一输入数据a拆分为多个第一数据单元tile_m/>k,tile_m为第一数据单元的行数,k为第一数据单元的列数,其中,第一数据单元可简记为in_a_item,这样第一输入数据a(m/>k)共被拆分为count_m个第一数据单元in_a_item。
类似地,第二输入数据为b(kn),k为第二输入数据的行数,n为第二输入数据的列数,将第二输入数据b拆分为多个第二数据单元k/>tile_n,k为第二数据单元的行数,tile_n为第二数据单元的列数,其中,第二数据单元可简记为in_b_item,这样第二输入数据b(k/>n)共被拆分为count_n个第二数据单元in_b_item。
图2为本申请实施例提供的一种第一输入数据的拆分方式示意图,如图2所示,将第一输入数据a(mk)拆分为多个第一数据单元,以图2中填充部分的第一数据单元(1)为例,该第一数据单元(1)的行数为tile_m,列数为 k。
图3为本申请实施例提供的一种第二输入数据的拆分方式示意图,如图3所示,将第二输入数据b(kn)拆分为多个第二数据单元,以图3中填充部分的第二数据单元(1)为例,该第二数据单元(1)的行数为k,列数为tile_n。
S102、基于拆分得到的多个第一数据单元和多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组。
每个目标数据单元组包括用于进行矩阵乘运算的一个第一数据单元和一个第二数据单元。
在一些实施例中,可以根据预设规则,从多个第一数据单元中确定部分第一数据单元以及从多个第二数据单元中确定部分第二数据单元,并将部分第一数据单元和部分第二数据单元进行两两组合,从而为每个加速处理单元分配各自待处理的多个目标数据单元组,每个目标数据单元组都有用于进行矩阵乘运算的一个第一数据单元和一个第二数据单元。
其中,预设规则例如可以为从多个第一数据单元中依次确定预设数量的第一数据单元为部分第一数据单元,以及从多个第二数据单元中依次确定预设数量的第二数据单元为部分第二数据单元。
值得说明的是,对于多个加速处理单元而言,各加速处理单元各自待处理的目标数据单元组的数量可以相同,也可以不同,具体可根据实际情况确定,例如,可根据各加速处理单元的实际空闲程度确定各自需要处理的目标数据单元组,任务繁重的就少分配一些,本实施例对此不做特别限定。
S103、采用每个加速处理单元,分别对各自被分配的多个目标数据单元组进行通用矩阵乘运算,得到多个输出数据单元。
其中,采用加速运算器中的多个加速处理单元,利用每个加速处理单元分别对各自分配得到的多个目标数据单元组中的第一数据单元和第二数据单元进行通用矩阵乘运算,得到多个目标数据单元组对应的多个输出数据单元,其中,一个目标数据单元对应一个输出数据单元,一个加速处理单元对应多个输出数据单元。
例如,第一输入数据a(mk)拆分为count_m个 in_a_item,第二输入数据b(k/>n)拆分为count_n个 in_b_item,则输出数据单元为tile_m/>tile_n,tile_m为输出数据单元的行数,tile_n为输出数据单元的列数,输出数据单元可简称为out_c_item。
S104、根据多个加速处理单元中所有加速处理单元的多个输出数据单元,确定第一输入数据和第二输入数据的运算结果。
将多个加速处理单元中所有加速处理单元的多个输出数据单元进行拼接,得到第一输入数据和第二输入数据的运算结果,即第一输入数据和第二输入数据的通用矩阵乘的运算结果。其中,该运算结果可以为矩阵形式。
例如,第一输入数据a(mk)拆分为count_m个 in_a_item,第二输入数据b(k/>n)拆分为count_n个 in_b_item,则多个加速处理单元对应的多个输出数据单元共有count_mcount_n个,则将(count_m/>count_n)个输出数据单元out_c_item进行拼接得到第一输入数据和第二输入数据的运算结果c,运算结果c的行维度有m个数据输出单元,列维度上有n个数据输出单元。
在图2-3的基础上,图4为本申请实施例提供的一种输出数据单元的原理示意图,如图4所示,图2中填充部分的第一数据单元(1)和图3中填充部分的第二数据单元(1)进行通用矩阵乘运算得到一个输出数据单元(1)。
对第一数据单元(1)的下一个第一数据单元(2)和第二数据单元(1)的下一个第二数据单元(2)进行通用矩阵乘运算,得到输出数据单元(2),拆分出的其它数据单元依次类推,从上到下第x个第一数据单元与从左到右第y个第二数据单元进行通用矩阵乘运算,对应的输出数据单元在运算结果中的位置为第x行第y列,即,将第x个第一数据单元和第y个第二数据单元进行通用矩阵乘运算得到的输出数据单元作为运算结果的第x行第y列的输出数据单元,重复该过程进行通用矩阵乘运算,直至将所有目标数据单元组中的第一数据单元和第二数据单元都完成通用矩阵乘运算,将所有目标数据单元组的输出数据单元进行拼接,得到第一输入数据和第二输入数据的运算结果。
值得说明的是,步骤S101-S102以及S104可以为电子设备中的中央处理器所执行的步骤,步骤S103可以为电子设备中的加速处理单元中的加速处理单元所执行的步骤。
在本实施例的矩阵乘运算方法中,面临数据量大的通用矩阵乘运算,将待进行矩阵乘运算的第一输入数据和第二输入数据进行拆分、组合,并将组合得到的数据单元组分配给具有多个加速运算单元的加速运算器,以使各加速运算单元进行并行计算,将各加速运算单元的运算结果进行组合,得到第一输入数据和第二输入数据的运算结果,从而加速了运算过程,提高了运算速度。
图5为本申请实施例提供的矩阵乘运算方法的流程示意图二,如图5所示,在一可选的实施方式中,步骤S102,基于拆分得到的多个第一数据单元和多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组,可以包括:
S201、对多个第一数据单元和多个第二数据单元进行组合,得到多个数据单元组。
对多个第一数据单元和多个第二数据单元进行两两组合,得到多个数据单元组,一个数据单元组包括:一个第一数据单元和一个第二数据单元。
S202、获取每个数据单元组中的第一数据单元在第一输入数据中的第一索引以及每个数据单元组中的第二数据单元在第二输入数据中的第二索引。
第一索引用于指示第一数据单元在第一输入数据中的位置,即第一数据单元在第一输入数据的多个第一数据单元中的次序,可以表示为以图2为例,从上到下的顺序位置,依次为第一个第一数据单元、第二个第一数据单元等。
第二索引用于指示第二数据单元在第二输入数据中的位置,即第二数据单元在第二输入数据的多个第二数据单元中的次序,以图3为例,从左到右,依次为第一个第二数据单元、第二个第二数据单元等。
S203、根据第一索引和第二索引,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组。
加速处理单元具有索引,该索引用于指示加速处理单元在加速运算器中的位置,如第一个加速处理单元、第二个加速处理单元等。
加速处理单元的索引和第一数据单元的第一索引、第二数据单元的第二索引可以具有对应关系,根据该对应关系、每个数据单元组中第一数据单元的第一索引以及第二数据单元的第二索引,可确定每个数据单元组对应的加速处理单元,以将该数据单元组作为加速处理单元的目标数据单元组,这样,可从多个数据单元组中为每个加速处理单元分配待处理的多个目标数据单元组。
在本实施例的矩阵乘运算方法中,根据第一索引和第二索引,从多个数据单元组中为每个加速处理单元分配待处理的多个目标数据单元组,提高了目标数据单元组的确定灵活性。
在一可选的实施方式中,步骤S203、根据第一索引和第二索引,从多个数据单元中为每个加速处理单元分配多个目标数据单元组,可以包括:
S301、根据第一索引和第二索引,确定每个数据单元组对应的输出数据单元的第三索引。
每个数据单元组对应的输出数据单元的第三索引为输出数据单元在运算结果中的索引,第三索引用于指示输出数据单元在运算结果中的位置,即输出数据单元在运算结果的多个输出数据单元中的次序,以图4为例,第x个第一数据单元和第y个第二数据单元进行通用矩阵乘运算,则输出数据单元在运算结果中的第x行第y列。
在一些实施例中,第三索引可以表示为:
compute_idx = in_a_idx(count_m) + in_b_idx
其中,compute_idx为第三索引,in_a_idx为第一数据单元的第一索引,in_b_idx为第二数据单元的第二索引,count_m为多个第一数据单元的数量。
S302、根据第三索引,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组。
每个数据单元组对应的输出数据单元的第三索引和加速处理单元的索引可以具有对应关系,根据第三索引以及该对应关系,可以确定每个数据单元组对应的加速处理单元的索引,以将该数据单元组作为加速处理单元的目标数据单元组,进而根据每个加速处理单元的索引,从多个数据单元组中为每个加速处理单元分配待处理的多个目标数据单元组。
在一可选的实施方式中,步骤302,根据第三索引,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组,可以包括:根据第三索引和多个加速处理单元的数量进行求余,得到余数;根据余数,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组。
由第三索引对多个加速处理单元的数量进行求余,得到余数,将该余数作为加速处理单元的索引,从多个加速处理单元中确定本次需要分配的加速处理单元,然后将第三索引对应的数据单元组作为本次需要分配的加速处理单元的待处理的目标数据单元组。参考如下表达式:
cluster_idx=compute_idx % cluster_num
cluster_idx为加速处理单元的索引,cluster_num为多个加速处理单元的数量。
在本实施例的矩阵乘运算方法中,根据第一索引和第二索引,确定输出数据单元的第三索引,然后根据第三索引确定为每个加速处理单元分配多个目标数据单元组,提高了目标数据单元组的确定灵活性,并使得加速处理单元所处理的目标数据单元组具有一定规律,即遵循一定规律。
图6为本申请实施例提供的矩阵乘运算方法的流程示意图三,如图6所示,在一可选的实施方式中,步骤S101,分别将第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元,包括:
S401、若第一输入数据和第二输入数据满足预设均分条件,则将第一输入数据均分为多个第一数据单元,以及将第二输入数据均分为多个第二数据单元。
预设均分条件用于指示将输入数据均分为行数相等且列数相等的多个数据单元,即,每个数据单元的数据形状相同。
若第一输入数据和第二输入数据均满足预设均分条件,则将第一输入数据均分为多个第一数据单元,每个第一数据单元的行数相等且每个第一数据单元的列数相等,即,每个第一数据单元的数据形状相同,以及将第二输入数据均分为多个第二数据单元,每个第二数据单元的行数相等且每个第二数据单元的列数均相等,即,每个第二数据单元的数据形状相同。
S402、若第一输入数据和第二输入数据中的至少一个输入数据不满足预设均分条件,则将至少一个输入数据拆分为前p-1个数据单元以及第p个数据单元。
若第一输入数据和第二输入数据中的至少一个输入数据不满足预设均分条件,则将至少一个输入数据拆分为前p-1个数据单元和第p个数据单元,其中,至少一个输入数据中的一个输入数据划分为:前p-1个数据单元和第p个数据单元,共p个数据单元,前p-1个数据单元的数据形状相同,且前p-1个数据单元和第p个数据单元的数据形状不相同。
也就是说,在不满足预设均分条件时,优先保证前p-1个数据单元能够均分,前p-1个数据单元中每个第一数据单元的行数相等,且每个第一数据单元的列数相等,例如,若第一输入数据不满足预设均分条件,则将第一输入数据划分为前p-1个第一数据单元和第p个第一数据单元,前p-1个第一数据单元的数据形状相同,且前p-1个第一数据单元和第p个第一数据单元的数据形状不相同。
类似地,若第二输入数据不满足预设均分条件,则将第二输入数据划分为前p-1个第二数据单元和第p个第二数据单元,前p-1个第二数据单元的数据形状相同,且前p-1个第二数据单元和第p个第二数据单元的数据形状不相同。
值得说明的是,前p-1个第一数据单元可以为按第一索引in_a_idx遍历的前p-1个的第一数据单元,第p个第一数据单元可以为按第一索引in_ a _idx遍历的最后一个第一数据单元;类似地,前p-1个第二数据单元可以为按第二索引in_b_idx遍历的前p-1个的第二数据单元,第p个第二数据单元可以为按第二索引in_ b _idx遍历的最后一个第二数据单元。
在本实施例的矩阵乘运算方法中,在满足预设均分条件时,对输入数据进行均分,使得加速处理单元所运算的目标数据单元组的大小一致,提高加速处理单元的同步运算性能,在不满足预设均分条件时,优先保证前p-1个数据单元均分,尽可能保证大多数加速处理单元所计算的数据大小基本一致,从而提高加速处理单元的同步运算性能。
在一些实施例中,每个加速处理单元都有各自的:片上存储器(scratchpadmemory,SPM)和运算模块(如Tu,Tensor unit,能够进行乘加计算的张量计算模块),Tu能够加速乘加运算,SPM能够加速数据的读写,在加速处理单元对多个目标数据单元组进行通用矩阵乘运算时,在Tu 运算模块上运行计算会需要调用为该Tu模块编译好的特定内核函数Tu kernel,而决定Tu kernel 特性的参数是输入/输出的形状(input/output shape),以及Tu 算子的类型,因此,当输入(目标数据单元组中第一数据单元和第二数据单元)和输出数据(输出数据单元)的数据形状(shape)没有发生改变时,不需要重新编译一个Tu kernel来处理新shape的数据,这样节省了编译新的Tu kernel的时间和所需的内存。在一些应用场景下,每个加速处理单元还有各自的数据搬运模块(DMA)。在一些应用场景下,每个加速处理单元中还有各自的通用处理模块,用于在加速运算器内部进行计算任务的调度和/或控制运算模块的执行,从而为中央处理器分担处理压力。
基于此,在不满足预设均分条件时,还可以对第p个数据单元进行数据补偿,并采用补偿后的数据进行运算,以复用同一个Tu kernel,在运算完毕后,可通过偏移以舍去补偿部分对应的数据,以保证拼接数据的正确性。
在一可选的实施方式中,步骤S103,采用每个加速处理单元,分别对各自被分配的多个目标数据单元组进行矩阵乘运算,得到每个加速处理单元各自对应的多个输出数据单元之前,该方法还可以包括:S501。
S501、根据预设补偿数据,对第p个数据单元进行数据补偿,以使补偿后的第p个数据单元和前p-1个数据单元的数据形状相同。
根据预设补偿数据,对第p个数据单元进行数据补偿,以使补偿后的第p个数据单元和前p-1个数据单元的数据形状相同,即,第p个数据单元的行数与前p-个数据单元的行数相等,且第p个数据单元的列数与前p-个数据单元的列数相等。
其中,多个第一数据单元包括:前p-1个数据单元和补偿后的第p个数据单元,预设补偿数据例如可以为0。
基于S501,相应地,步骤S104,根据多个加速处理单元中所有加速处理单元的多个输出数据单元,确定第一输入数据和第二输入数据的运算结果,可包括:S502、S503。
S502、从所有加速处理单元的多个输出数据单元中,将预设补偿数据对应的运算数据结果剔除。
其中,根据预设补偿数据对第p个数据单元进行数据补偿后,基于补偿后的第p个数据单元进行矩阵乘运算得到的输出数据单元记为目标输出数据单元,为所有加速处理单元的多个输出数据单元中的基于补偿后的第p个数据单元进行矩阵乘运算得到的输出数据单元。预设补偿数据对应的运算数据结果是目标输出数据单元中对应的运算数据。将所有加速处理单元的多个输出数据单元中预设补偿数据对应的目标输出数据单元中对应的运算数据剔除,从而得到剔除后的各加速处理单元的多个输出数据单元(未进行补偿的就不用剔除)。
S503、根据剔除后的各加速处理单元的多个输出数据单元进行拼接,确定所述第一输入数据和所述第二输入数据的运算结果。
剔除后的各加速处理单元的多个输出数据单元包括:在所有加速处理单元的多个输出数据单元中,经过数据剔除后的目标输出数据单元以及除目标输出数据单元外的其它输出数据单元,将剔除后的目标输出数据单元以及其它输出数据单元进行拼接得到第一输入数据和第二输入数据的运算结果。
其中,补偿后的第p个数据单元所分配的加速处理单元为多个加速处理单元中的目标加速处理单元,从目标加速处理单元的多个输出数据单元中确定补偿后的第p个数据单元对应的输出数据单元,补偿后的第p个数据单元对应的输出数据单元为预设补偿数据对应的目标输出数据单元,对预设补偿数据对应的目标输出数据单元对应的运算数据结果进行剔除,得到剔除后的目标输出数据单元。可根据该目标加速处理单元的多个输出数据单元中剔除后的目标输出数据单元、该目标加速处理单元的多个输出数据单元中除了目标输出数据单元外的其它输出数据单元,以及所述多个加速处理单元中除了目标加速处理单元外的其它加速处理单元的多个输出数据单元,拼接确定第一输入数据和第二输入数据的运算结果,拼接时也可根据索引位置(例如根据第三索引)进行。
值得说明的是,在加速处理单元进行数据运算过程中,可将索引为in_a_idx的in_a_item,和索引为in_b_idx的in_b_item数据读入到SPM,同时launch到Tu模块进行计算,得到索引为compute_idx的out_c_item。
在本实施例的矩阵乘运算方法中,通过引入预设补偿数据以保证数据单元的数据形状相同,这样可保证运算过程中使用相同的Tu kernel,省去编译多个Tu kernel的过程和需要的内存空间,在运算完毕,可将预设补偿数据对应的运算数据剔除,以保证数据运算正确性。
在一些实施例中,在加速处理单元上加载数据和数据运算过程是一个线性过程,为了充分利用加速处理单元的性能,可以对同一个数据处理流的加载数据和数据运算过程进行一定处理,具体参见下面实施例。
图7为本申请实施例提供的矩阵乘运算方法的流程示意图四,如图7所示,在一可选的实施方式中,步骤S103,采用每个加速处理单元,分别对多个目标数据单元组进行通用矩阵乘运算,得到多个输出数据单元,包括:
S601、创建每个加速处理单元的数据处理流,并采用数据处理流,加载一个目标数据单元组。
其中,每个in_a_itemin_b_item = out_c_item的运算过程是独立的,互相没有数据的依赖,因此各加速处理单元可以并行处理。
针对每个加速处理单元,创建每个加速处理单元的数据处理流(stream),例如,加速运算器包括4个加速处理单元,则创建4个数据处理流,以保证每个数据处理流之间数据在运算过程中的读写不会冲突,如无需串行等待。
创建每个加速处理单元的数据处理流,并采用该数据处理流,加载该加速处理单元对应的一个目标数据单元组(可记作data_0)。
值得说明的是,一个stream的处理过程通常包含三个步骤:将属于该stream的数据从CPU内存转移到GPU内存、GPU进行运算并将结果保存在GPU内存、将该stream的结果从GPU内存拷贝到CPU内存,因此,对每个加速处理单元创建stream,并采用其加载并进行数据运算时,不会对其它加速处理单元的加载以及数据运算过程造成干扰,保证了每个stream之间数据在运算过程中的读写不会冲突,从而实现多个stream在矩阵乘场景的并行运算。
S602、采用数据处理流,对一个目标数据单元组进行通用矩阵乘运算,得到一个目标数据单元组的输出数据单元,并加载下一个目标数据单元组。
采用该数据处理流,对一个目标数据单元组中的第一数据单元和第二数据单元进行通用矩阵乘运算,得到一个目标数据单元组的输出数据单元,并加载多个目标数据单元组中该一个目标数据单元组中的下一个目标数据单元组(可记作data_1)。
值得说明的是,同一数据处理流上处理计算data_0和加载data_1的过程并不会冲突和相互影响。
S603、采用数据处理流,对下一个目标数据单元组进行通用矩阵乘运算,得到下一个目标数据单元组的输出数据单元,直至得到多个输出数据单元。
采用数据处理流,对下一个目标数据单元组中的第一数据单元和第二数据单元进行通用矩阵乘运算,得到下一个目标数据单元的输出数据单元,并加载新的目标数据单元组,重复该过程对数据的处理(计算一组、加载另一组,将同一组数据的加载和运算过程进行异步化),直至将该加速运算单元需要处理的多个目标数据单元组都完成了加载和计算,得到该多个目标数据单元组对应的多个输出数据单元。
图8为本申请实施例提供的数据运算过程的示意图,如图8所示,以具有4个加速处理单元的加速运算器为例,创建了4个数据处理流,分别记为Sub_stream_0computeC、Sub_stream_1computeC、Sub_stream_2computeC、Sub_stream_3computeC。
A/B tile(缩写为A/B t)表示第一数据单元和第二数据单元,即目标数据单元组,采用每个加速处理单元对应的数据处理流,对对应的目标数据单元组并行进行通用矩阵乘运算,得到输出数据单元Ctile(缩写为C t)。
值得说明的是,所有加速处理单元共用默认数据处理流(default stream),因此还可将每个创建的数据处理流和默认数据处理流做同步操作,即等待创建的数据处理流运算完毕,以保证默认数据处理流写出数据完整。
在本实施例的矩阵乘运算方法中,将Gemm 算子的运算过程并行化,由数据流stream机制的方式保证了并行数据之间的隔离,在加速了运算过程的同时保证了运算结果的正确性,并且通过将加载数据和加速处理单元计算数据的过程异步化,比单一只处理一组数据要更加高效,提高了数据运算速度。
在一些实施例中,还可以为每个加速处理单元创建2个数据处理流,若采用第一个数据处理流加载一个目标数据单元组时,第二个数据处理流可以对一个目标数据单元组进行通用矩阵乘运算,并写出一个目标数据单元组的输出数据单元;若采用第一个数据处理流对一个目标数据单元组进行通用矩阵乘运算,第二个数据处理流可以加载下一个目标数据单元组。
在上述实施例的基础上,下面以一个流程示例对本申请的矩阵乘运算的过程进行说明,具体包括如下步骤:
步骤1:拆分待进行矩阵乘运算的第一输入数据a和第二输入数据b,得到count_m个第一数据单元in_a_item,count_n个第二数据单元in_b_item。
步骤2:针对加速运算器中的四个加速处理单元创建4个数据处理流(stream),这样保证了每个stream之间数据在运算过程中的读写不会冲突。
步骤3:循环遍历count_m个in_a_item,取第一数据单元 in_a_item,同时记录其在a中的索引idx(in_a_idx)。
步骤4:循环遍历count_n 个in_b_item,取第二数据单元in_b_item,同时记录其在b中的索引idx(in_b_idx)。
步骤5:由in_a_idx和in_b_idx计算得到输出数据单元在运算结果c的索引compute_idx。
compute_idx = in_a_idx(count_m) + in_b_idx
步骤6:由compute_idx对加速处理单元的数量进行求余,得到本次计算需要分配到的cluster_idx。
cluster_idx = compute_idx % cluster_num
步骤7:将索引为in_a_idx的第一数据单元in_a_item,和索引为in_b_idx的第二数据单元in_b_item读入到加速处理单元的片上内存(SPM)上,同时launch到加速处理单元中的特定运算模块(Tu模块)进行矩阵乘计算,得到索引为compute_idx的输出数据单元out_c_item。
步骤8:循环执行步骤3-7,直至得到全部输出数据单元,为保证默认数据流写出数据完整,将创建的数据处理流和默认数据处理流进行同步。
基于同一发明构思,本申请实施例中还提供了与矩阵乘运算方法对应的矩阵乘运算装置,由于本申请实施例中的装置解决问题的原理与本申请实施例上述矩阵乘运算方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
图9为本申请实施例提供的矩阵乘运算装置的结构示意图,该装置中的功能模块可以集成在电子设备中,也可以被部署在不同的设备载体上。如图9所示,该装置可以包括:
拆分模块701,用于分别将待进行矩阵乘运算的第一输入数据和第二输入数据拆分为多个第一数据单元和多个第二数据单元;
分配模块702,用于基于拆分得到的多个第一数据单元和多个第二数据单元,为每个加速处理单元分配待处理的多个目标数据单元组,每个目标数据单元组包括用于进行矩阵乘运算的一个第一数据单元和一个第二数据单元;
运算模块703,用于采用每个加速处理单元,分别对各自被分配的多个目标数据单元组进行通用矩阵乘运算,得到多个输出数据单元;
确定模块704,用于根据多个加速处理单元中所有加速处理单元的多个输出数据单元,确定第一输入数据和第二输入数据的运算结果。
在一可选的实施方式中,分配模块702,具体用于:对多个第一数据单元和多个第二数据单元进行组合,得到多个数据单元组;获取每个数据单元组中的第一数据单元在第一输入数据中的第一索引以及每个数据单元组中的第二数据单元在第二输入数据中的第二索引;根据第一索引和第二索引,从多个数据单元中为每个加速处理单元分配多个目标数据单元组。
在一可选的实施方式中,分配模块702,具体用于:根据第一索引和第二索引,确定每个数据单元组对应的输出数据单元的第三索引;根据第三索引,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组。
在一可选的实施方式中,分配模块702,具体用于:根据第三索引和多个加速处理单元的数量进行求余,得到余数;根据余数,从多个数据单元组中为每个加速处理单元分配多个目标数据单元组。
在一可选的实施方式中,拆分模块701,具体用于:若第一输入数据和第二输入数据满足预设均分条件,则将第一输入数据均分为多个第一数据单元,以及将第二输入数据均分为多个第二数据单元。
在一可选的实施方式中,拆分模块701,具体用于:若第一输入数据和第二输入数据中的至少一个输入数据不满足预设均分条件,则将至少一个输入数据拆分为前p-1个数据单元以及第p个数据单元,其中,前p-1个数据单元的数据形状相等,且前p-1个数据单元和第p个数据单元的数据形状不相同。
在一可选的实施方式中,该装置还包括:
补偿模块705,用于根据预设补偿数据,对第p个数据单元进行数据补偿,以使补偿后的第p个数据单元和前p-1个数据单元的数据形状相同;
确定模块704,具体用于:从所有加速处理单元的多个输出数据单元中,将预设补偿数据对应的运算数据结果剔除;根据剔除后的各加速处理单元的多个输出数据单元进行拼接,确定第一输入数据和第二输入数据的运算结果。
在一可选的实施方式中,运算模块703,具体用于:
创建每个加速处理单元的数据处理流,并采用数据处理流,加载一个目标数据单元组;
采用数据处理流,对一个目标数据单元组进行通用矩阵乘运算,得到一个目标数据单元组的输出数据单元,并加载下一个目标数据单元组;
采用数据处理流,对下一个目标数据单元组进行通用矩阵乘运算,得到下一个目标数据单元组的输出数据单元,直至得到多个输出数据单元。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
图10为本申请实施例提供的电子设备的结构示意图,如图10所示,该设备可以包括:处理器801、加速运算器802、存储器803和总线804,存储器803存储有处理器801、加速运算器802可执行的机器可读指令(可理解的是,存储器803可以有不止一个,例如其中一份存储器用于存储处理器801可执行的指令,另一份用于存储加速运算器802可执行的指令),处理器801、加速运算器802与存储器803之间可通过总线804直接或间接通信,处理器801、加速运算器802执行机器可读指令,以执行上述方法。该处理器801具有数据处理能力,可以是中央处理器(CPU),也可以是能够执行前述S103步骤外其余步骤的其他任何类型的处理器。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器、加速运算器运行时执行上述方法。
在本申请实施例中,该计算机程序被处理器运行时还可以执行其它机器可读指令,以执行如实施例中其它所述的方法,关于具体执行的方法步骤和原理参见实施例的说明,在此不再详细赘述。
在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,即可以位于一个地方,也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请提供的实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本申请的具体实施方式,用以说明本申请的技术方案,而非对其限制,本申请的保护范围并不局限于此。本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本申请实施例技术方案的精神和范围,都应涵盖在本申请的保护范围之内。