CN112559163A - 优化张量计算性能的方法及装置 - Google Patents

优化张量计算性能的方法及装置 Download PDF

Info

Publication number
CN112559163A
CN112559163A CN201910854534.3A CN201910854534A CN112559163A CN 112559163 A CN112559163 A CN 112559163A CN 201910854534 A CN201910854534 A CN 201910854534A CN 112559163 A CN112559163 A CN 112559163A
Authority
CN
China
Prior art keywords
tensor
operator
processor
block
output
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201910854534.3A
Other languages
English (en)
Other versions
CN112559163B (zh
Inventor
王雪莹
张臻
李广利
李翀
刘雷
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Original Assignee
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd, Institute of Computing Technology of CAS filed Critical Huawei Technologies Co Ltd
Priority to CN201910854534.3A priority Critical patent/CN112559163B/zh
Priority to CN202310588572.5A priority patent/CN116775277A/zh
Publication of CN112559163A publication Critical patent/CN112559163A/zh
Application granted granted Critical
Publication of CN112559163B publication Critical patent/CN112559163B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals

Abstract

本申请公开优化张量计算性能的方法及装置,涉及深度学习技术领域,有助于加快待执行任务的执行速度,从而有助于提升张量计算的整体性能。该方法包括:第一处理器接收待执行任务的第一代码,待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的任务,第一算子的输出张量为第二算子的一个输入张量;第一处理器确定存储分配规则;其中,存储分配规则包括:将第一算子的输出张量存储至第二处理器内部的存储介质的规则;第一处理器生成待执行任务的第二代码,第二代码为能够在第二处理器上的张量加速硬件并行执行的代码,第二代码描述了存储分配规则;第一处理器向第二处理器发送第二代码。

Description

优化张量计算性能的方法及装置
技术领域
本申请涉及深度学习技术领域,尤其涉及优化张量计算性能的方法及装置。
背景技术
随着人工智能产业链的迅速发展,深度学习已经成为研究和应用的热点。多层神经网络的深度学习也变得越来越复杂,因此对于处理器的计算能力要求也越来越高。张量计算作为深度学习最核心的计算,占据了深度学习计算量的百分之九十以上,因此,基于运行在张量计算加速硬件的代码的调优,尤为重要。其中,张量计算加速硬件是集成在处理器上执行张量计算的硬件。
现有技术中,对于待执行任务的代码的调优通常仅限于对单个算子的优化,此种优化方式只能提升单个算子的性能,因此对提升张量计算的性能(如减少执行张量计算的时间)的效果不是很好。
发明内容
本申请实施例提供了优化张量计算性能的方法及装置,有助于提升张量计算的性能。
第一方面,提供了一种优化张量计算性能的方法,包括:首先,第一处理器接收待执行任务的第一代码,该待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的任务,第一算子的输出张量为第二算子的一个输入张量;然后,第一处理器确定存储分配规则;其中,存储分配规则包括:将第一算子的输出张量存储至第二处理器内部的存储介质的规则;接着,第一处理器生成待执行任务的第二代码,第二代码为能够在第二处理器上的张量加速硬件并行执行的代码,第二代码描述了存储分配规则;最后,第一处理器向第二处理器发送第二代码。这样,由于将可复用的张量块存储至第二处理器的近端存储介质上,因此在第二处理器执行第二算子时可以直接从第二处理器的近端存储介质上读取该张量块,这样,有助于缩短数据的读取时间,从而有助于加快待执行任务的执行速度,进而有助于提升张量计算的整体性能。
在一种可能的实现方式中,该方法还可以包括:对第一算子和第二算子进行优化。也就是说,本申请实施例支持“在张量计算的过程中,在单个算子的优化的基础上,考虑了算子间的优化”的技术方案,这样有助于提升张量计算的整体性能。
在一种可能的实现方式中,该方法还包括:第一处理器确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;其中,输入张量块是对算子的输入张量进行划分得到的张量块;第一处理器确定第一算子和第二算子间具有依赖关系的张量块的执行顺序;存储分配规则具体包括:将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码还描述了:与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序。这样,根据划分规则对张量进行划分,有助于满足第二处理器的块状访存需求,从而有助于提升张量计算的整体性能。
在一种可能的实现方式中,并行线程层次指示对第二处理器上的多个线程进行分组的分组层级。关于并行线程层级的详细解释及示例可以参考下文具体实施方法部分。
在一种可能的实现方式中,第一处理器确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,包括:第一处理器分别确定在一个线程上和第二处理器的每个并行线程层次上,第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;第一处理器确定第一算子和第二算子间具有依赖关系的张量块的执行顺序,包括:第一处理器分别确定在一个线程上和每个并行线程层次上,第一算子和第二算子间具有依赖关系的张量块的执行顺序;存储分配规则具体包括:在一个线程上和每个并行线程层次上,将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码具体描述了:在一个线程上和每个并行线程层次上,与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序。这样,基于一个线程和每个并行线程层次为粒度对第二代码进行描述,使得该第二代码符合第二处理器的线程和并行线程层次,从而能够在第二处理器上并行执行该第二代码。
在一种可能的实现方式中,第一处理器确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,包括:第一处理器确定对第二算子的输出张量进行划分的第二划分规则;第一处理器确定与每个第二类输出张量块分别具有依赖关系的输入张量块和对第一算子的输出张量进行划分的第一划分规则;第二类输出张量块是基于第二划分规则得到的第二算子的输出张量的张量块;第一处理器确定与每个第一类输出张量块分别具有依赖关系的输入张量块;其中,第一类输出张量块是基于第一划分规则得到的第一算子的输出张量的张量块。这样,有助于使得该第一算子的输出张量的划分可以满足第二算子的输出张量块对输入张量块的要求,进而使得该第一算子的输出张量块为第二算子所需要的输入张量块,即可复用的张量块。这样一来,有助于将该方法确定的可复用张量块存储至近端存储介质,有助于加快待执行任务的执行速度,提升张量计算的整体性能。
在一种可能的实现方式中,第一处理器确定对第二算子的输出张量进行划分的第一划分规则,包括:第一处理器根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则。这样,可以满足第二处理器上张量计算加速硬件的要求,从而能够在张量计算加速硬件上执行第二代码。
在一种可能的实现方式中,第一处理器根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则,包括:当第一算子的输出张量的类型和第二算子的输出张量的类型,满足张量计算加速硬件可支持的张量块的类型时,第一处理器根据张量计算加速硬件可支持的最小张量块的大小,确定第二算子的输出张量可划分的输出张量块的大小的范围;第一处理器根据该范围中的目标值,确定第二划分规则。
在一种可能的实现方式中,第一处理器根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则,包括:当第一算子的输出张量的类型和第二算子的输出张量的类型,满足张量计算加速硬件可支持的张量块的类型时,第一处理器根据张量计算加速硬件可支持的最小张量块的大小,确定第二算子的输出张量可划分的输出张量块的大小的范围;第一处理器根据该范围中的至少两个目标值中的每个目标值,分别确定一个第二划分规则;第一处理器生成待执行任务的第二代码,包括:第一处理器生成待执行任务的多个第二代码;其中,基于每个第二划分规则,生成一个第二代码。
在一种可能的实现方式中,该方法还包括:第一处理器接收第二处理器发送的指示信息,该指示信息用于指示多个第二代码中执行时间最短的第二代码。这样,能够在再次接收到类似待执行任务(其中,类似待执行任务为:与待执行任务中的张量的大小相同,且与待执行任务中的算子相同的任务)时,第一处理器可以直接根据该执行时间最短的第二代码确定目标值,从而生成该目标值对应的第二代码,使得第二处理器直接执行该第二代码时,其执行时间最短。
在一种可能的实现方式中,在第一处理器向第二处理器发送第二代码之前,该方法还包括:第一处理器对第一算子和第二算子进行算子融合,得到新的算子;第二代码还描述了该新的算子。这样,经过算子融合得到新的算子,可以使得执行第二代码时,能够按照正确的执行顺序执行每个算子。
第二方面,提供了一种优化张量计算性能的方法,该方法包括:第二处理器接收待执行任务的第二代码;其中,待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的,第一算子的输出张量为第二算子的一个输入张量;第二代码描述了存储分配规则;存储分配规则包括:将第一算子的输出张量存储至第二处理器内部的存储介质的规则;第二处理器上的张量加速硬件并行执行第二代码。在一种可能的实现方式中,存储分配规则具体包括:将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码还描述了:与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及第一算子和第二算子间具有依赖关系的张量块的执行顺序;第二处理器上的张量加速硬件并行执行第二代码,包括:第二处理器根据存储分配规则、与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序,并行执行第二代码。
在一种可能的实现方式中,存储分配规则具体包括:在一个线程上和第二处理器的每个并行线程层次上,将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码具体描述了:在一个线程上和每个并行线程层次上,与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序。
在一种可能的实现方式中,该优化张量计算性能的方法还包括:第二处理器向第一处理器发送指示信息,该指示信息用于指示多个第二代码中执行时间最短的第二代码。这里需要说明的是,第二方面的有益效果可以参照上述第一方面,第二方面的所有可能的实现方式的有益效果可以参照上述第一方面对应的实现方式,这里就不再赘述。
第三方面,提供了一种第一处理器,该第一处理器用于执行上述第一方面,或者第一方面中的任意一种可能的实现方式中的方法的模块(或单元)。
第四方面,提供了一种第二处理器,该第二处理器用于执行上述第二方面,或者第二方面中的任意一种可能的实现方式中的方法的模块(或单元)。
第五方面,一种优化张量计算性能的系统,该系统包括第一处理器和第二处理器,该第一处理器用于执行上述第一方面,或者第一方面中的任意一种可能的实现方式中的方法的部分或全部步骤;该第二处理器用于执行上述第二方面,或者第二方面中的任意一种可能的实现方式中的方法的部分或全部步骤。
第六方面,提供了一种计算机可读存储介质,该计算机可读存储介质中包含指令,当该指令在计算机上运行时,使得该计算机执行第一方面或第二方面的任意一种可能的实现方式,或第二方面或第二方面的任意一种可能的实现方式提供的任一种方法被执行。
第七方面,提供了一种计算机程序产品,当其在计算机上运行时,使得第一方面或第二方面的任意一种可能的实现方式,或第二方面或第二方面的任意一种可能的实现方式提供的任一种方法被执行。
第八方面,提供了一种处理器,该处理器与存储器耦合,当该处理器执行该存储器中的计算机程序或指令时,使得第一方面或第二方面的任意一种可能的实现方式,或第二方面或第二方面的任意一种可能的实现方式提供的任一种方法被执行。
第九方面,提供了一种芯片,包括:处理电路和接口,该处理电路用于从存储介质中调用并运行该存储介质中存储的计算机程序,以执行第一方面或第二方面的任意一种可能的实现方式中第一处理器所执行的步骤,或执行第二方面或第二方面的任意一种可能的实现方式提供的任一种方法中第二处理器所执行的步骤。
第十方面,提供一种优化张量计算性能的装置,该装置包括处理器和存储器。该存储器中存储有指令,该处理器用于调用该指令,以执行上述第一方面,或者第一方面中的任意一种可能的实现方式中第一处理器所执行的部分或全部步骤;或者执行上述第二方面,或者第二方面中的任意一种可能的实现方式中第二处理器所执行的部分或全部步骤。
应当理解的是,上述提供的任一种第一处理器、第二处理器、优化张量计算性能的系统、计算机可读存储介质、计算机程序产品以及芯片的有益效果均可以对应参考上文对应方面提供的方法实施例的有益效果,此处不再赘述。
附图说明
图1为可用于本申请实施例的一种实例的张量计算系统示意性框图;
图2为本申请实施例提供的一种张量计算过程的示意图;
图3为本申请实施例提供的一种建立优化模型的方法的流程示意图;
图4为本申请实施例提供的一种并行线程层次的关系示意图;
图5为本申请实施例提供的一种通过输出张量块中所包括的元素的位置信息来确定与该输出张量块具有依赖关系的输入张量块的方法的示意图;
图6为本申请实施例提供的一种优化模型的示意图;
图7为本申请实施例提供一种优化张量计算性能的方法的流程示意图;
图8为本申请实施例提供一种优化张量计算性能的方法的流程示意图;
图9为本申请实施例提供一种优化张量计算性能的方法的流程示意图;
图10为本申请实施例提供的一种第一处理器101的示意性框图;
图11为本申请实施例提供的一种第二处理器102的示意性框图。
具体实施方式
为便于更好的理解本申请实施例的技术方案,下面首先对其中的一些术语进行简单介绍。
1)、算子
算子,是一个函数空间到另一个函数空间上的映射。对任何自变量进行某一项操作都可以认为是一个算子,如求幂次,求开方都可以认为是一个算子。
2)、张量(tensor)、张量块、张量块的大小,张量计算加速硬件
张量,是向量的推广。假设向量是一维的“表格”(即分量按照顺序排成一排),矩阵是二维的“表格”(即分量按照纵横位置排列),那么n阶张量就是n维的“表格”;其中,n是大于或等于1的张量。在本申请实施例中,为了便于描述,将一个算子中作为自变量的张量称为输入张量,作为因变量的张量称为输出张量;将输入张量进行划分得到的张量块称为输入张量块,将输出张量进行划分得到的张量块称为输出张量块。本申请实施例中的张量块(包括输入张量块和输出张量块)所包含的元素的个数大于或等于2。
张量块的大小,用于表征该张量块的每个维度上所包含的元素的个数。例如,当一个张量块的是二维张量块(即矩阵)时,该张量块的大小可以是a*b,其中,a表示该张量块的行数,b表示该张量块的列数。
张量计算加速硬件,是用于计算张量乘加等的专用加速计算硬件。例如,张量计算加速硬件可以为:谷歌公司推出的张量处理单元(tensor processing unit,TPU)上的矩阵乘单元 (matrix multiply unit,MMU);英伟达公司推出的图形处理器(graphicsprocessing unit,GPU) 中的张量计算核心(Tensor core);或寒武纪公司推出的机器学习单元100(machine learning unit 100,MLU100)的中的MLU等。
3)、处理器的并行线程层次
处理器可以对线程进行分组,得到多个线程组;并对该多个线程组进行分层管理,如将处理器的所有线程组进一步分为多个线程组集合,每个线程组集合包括多个线程组等。在本申请实施例中,处理器的并行线程层次,是指处理器对线程进行分组的分组层级(如线程组层级和线程组集合层级)。例如,GPU对应的软件上的并行编程模型结构统一计算设备架构 (compute unified device architecture,CUDA)中,处理器的并行线程层次为:栅格(grid) 层和线程块(block)层。又如,GPU(具体可以是Arm MaliGpu)对应的软件上的并行编程模型结构OpenCL中,处理器的并行线程层次为:工作项目(work items)层和工作组(work groups)层。
同一线程层次可以包括一个或多个线程组。例如,grid层包括一个或多个grid,block层包括一个或多个block。其中,block是多个线程构成的线程组。grid是多个block构成的线程组。例如,如图4所示,一个grid包括4个block,一个block包括6个线程。同一个线程组中的线程可以并行执行任务(或子任务)。例如,一个block中的多个线程可以并行执行任务;一个grid中的多个block(具体为该多个block中的线程)可以并行执行任务。因此,本申请实施例中,将处理器对线程进行分组的分组层级称为处理器的并行线程层次。
4)、待执行任务
待执行任务,是对至少一个输入张量执行一种或多种运算得到一个输出张量的任务。其中,该运算可以为至少一个算子。
5)、依赖关系
依赖关系,可以包括:算子内张量之间的依赖关系、算子间的依赖关系、算子内张量块之间的依赖关系,以及算子间张量块之间的依赖关系。以下分别进行说明:
算子内张量之间的依赖关系:在一个算子内,输出张量与每个输入张量之间均具有依赖关系。该依赖关系可以被称作算子内张量之间的依赖关系。例如,若一个算子是A1*B1=C1,则输出张量C1与输入张量A1、B1均具有依赖关系。
算子间的依赖关系:在算子间,若算子1的输出张量可以作为算子2的输入张量,则算子2与算子1之间具有依赖关系。该依赖关系可以被称作算子间的依赖关系。
算子内张量块之间的依赖关系:在一个算子内,输出张量中的任意一个输出张量块,与输入张量所划分的用于参与得到该输出张量块的输入张量块之间具有依赖关系。该依赖关系也可以被称作算子内张量块之间的依赖关系。例如,以一个算子是A1*B1=C1为例,对于输出张量C1的任意一个输出张量块C1’而言,假设该输出张量块C1’是“由输入张量A1中的输入张量块A1’和输入张量B1的输入张量块B1’”计算得到的,那么,该输出张量块C1’与该输入张量块A1’和B1’具有依赖关系。更具体的,若算子1的输入张量A1、B1和输出张量C1均是矩阵,且该输出张量块C1’是输出张量C1中第1行第1个元素和第1行第2个元素构成的集合,则由于C1中的第1行第1个元素是基于输入张量A1的第1行元素和输入张量B1的第1列元素得到的,且C1中的第1行第2个元素是基于输入张量A1的第1行元素和输入张量B1的第2列元素得到的,因此,该输出张量块C1’与输入张量块A1’和B1’具有依赖关系,具体为:该输出张量块C1’与“输入张量A1的第1行元素构成的集合(即该输入张量块A1’)”和“输入张量B1的第1、2列元素构成的集合(即该输入张量块B1’)”之间具有依赖关系。
算子间张量块之间的依赖关系:基于算子间依赖关系和算子内张量块之间的依赖关系,可以确定出算子间张量块之间的依赖关系。例如,假设一个算子是A1*B1=C1,且A1’*B1’=C1’,A1’、B1’和C1’分别是A1、B1和C1的张量块,并且,另一个算子是C1*B2=C2,且C1’*B2’=C2’,B2’和C2’分别是B2和C2的张量块,那么,这两个算子之间具有依赖关系的张量块可以为:A1’、B1’、C1’、B2’和C2’。这些张量块可以认为是这两个算子间的一组具有依赖关系的张量块。这些张量块之间的依赖关系可以被称作算子间张量块之间的依赖关系。基于该示例,这两个算子之间具有依赖关系的张量块的执行顺序可以为:先执行A1’*B1’得到C1’,再执行C1’*B2’得到C2’。
6)、其他术语
本申请说明书和权利要求书及附图中的术语“第一”、“第二”和“第三”等是用于区别不同对象,而不是用于限定特定顺序。
在本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
在本申请实施例中,“至少一个”是指一个或多个。“多个”是指两个或两个以上。
在本申请实施例中,“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
图1为可用于本申请实施例的一种实例的张量计算系统示意性框图。如图1所示,该系统可以包括:第一处理器101、第二处理器102、集成在第二处理器上的张量计算加速硬件 1021和第一存储介质1022,以及第二存储介质103。另外,该系统还可以包括通信线路104,存储器105以及至少一个接口106等。其中,第一存储介质1022可以称作第二处理器的近端存储介质1022,第二存储介质103可以称作第二处理器的远端存储介质103。
第一处理器101,用于对待执行任务的第一代码进行优化,得到待执行任务的第二代码。待执行任务是对至少两个输入张量进行多个算子的运算(如A1*B1=C1,C1*B2=C2,A1、 B1、C1、B2和C2均是张量)得到输出张量的任务。待执行任务的第一代码为串行代码,且该串行代码为描述了待执行任务的串行指令序列。具体的,第一代码主要描述了待执行任务的嵌套循环、循环上下界和计算语句执行顺序等。本申请实施例对第一代码的具体内容不进行限定。待执行任务的第二代码为在张量计算加速硬件1021上并行执行的代码,即该第二代码符合第二处理器的并行线程层次,且可由并行线程层次并行执行该第二代码中描述的对应的每个并行线程层次的代码。执行第二代码时张量计算系统的性能高于执行第一代码时该系统的性能,具体的,执行第二代码的时间少于执行第一代码的时间。
第二处理器102,用于运行待执行任务的第二代码,得到待执行任务的执行结果。第二处理器102上集成了张量计算加速硬件1021。例如,当第二处理器102为GPU时,张量计算加速硬件1021为GPU上的Tensor Core;或者当第二处理器102为MLU100时,张量计算加速硬件1021为MLU100上的MLU等。张量计算加速硬件1021是专用于执行待执行任务的硬件,通过使用张量计算加速硬件对张量进行运算,有助于提升运算速度。
第一处理器101和第二处理器102上都可以有用于输入信息和输出信息的引脚。这些引脚可以与通信线路104电连接。
第二处理器的近端存储介质1022,用于存储执行第二代码过程中所生成的中间数据(如执行代码过程中所输出的临时数据,该临时数据作为执行该代码的下一步输入数据等),其容量较小,但读写速度块。近端存储介质1022可以为GPU中的共享存储器和寄存器等。
第二处理器的远端存储介质103,用于存储第二代码执行过程中所产生的全部数据(包括执行代码所需要的输入数据、执行代码过程中的中间数据以及执行代码结束后的输出数据等),其容量大,但读写速度慢。远端存储介质103可以为GPU中的全局存储器。如图2所示,为本申请实施例提供的一种张量计算过程的示意图。
在一个示例中,近端存储介质1022可以为近端内存。远端存储介质103可以为远端内存。
通信线路104可包括一通路,在上述组件(如第一处理器101、第二处理器102、存储器 105和接口106)之间传送信息。
存储器105可以是只读存储器(read-only memory,ROM)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(random access memory,RAM)或者可存储信息和指令的其他类型的动态存储设备,也可以是电可擦可编程只读存储器(electricallyerasable programmable read-only memory,EEPROM)、只读光盘(compact disc read-only memory, CD-ROM)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储器105可以是独立存在,通过通信线路104与第一处理器101和第二处理器102相连接。存储器105 也可以与第一处理器101和/或第二处理器102集成在一起。本申请实施例提供的存储器105 通常可以具有非易失性。其中,存储器105用于存储执行本申请方案的计算机指令,并由第一处理器101或第二处理器102来执行该计算机指令,从而实现本申请下述实施例提供的相应方法。
在一个示例中,远端存储介质103可以是存储器105中的一部分,也可以是独立于存储器105的存储介质。也就是说,存储器105与远端存储介质103可以是集成在一起的,也可以是独立设置的。
接口106用于该系统与其他设备或器件进行通信。示例的,接口106可以是通信电路。
需要说明的是,图1仅为示例,其不对本申请实施例所适用的张量计算系统的结构示意图构成限定。实际实现时,张量计算系统可以包括比图1更多或更少的器件。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供了一种优化张量计算性能的方法,在执行该方法之前,可以先建立优化模型。如图3所示,为本申请实施例提供的一种建立优化模型的方法的示意图。其中,图 3中是以一组具有依赖关系的算子包括第一算子和第二算子,且第一算子的输出张量可以作为第二算子的输入张量为例进行说明的。图3所示的方法可以包括以下步骤:
S101:第一处理器获取第二处理器的硬件参数。第二处理器的硬件参数可以包括:第二处理器的并行线程层次、每个并行线程层次上可并行执行的线程块或线程的数量、第二处理器的存储参数和张量计算加速硬件的参数。
以下,对第二处理器的硬件参数进行具体说明:
1)、第二处理器的并行线程层次。例如,当第二处理器是GPU,且第二处理器的并行编程逻辑架构为CUDA时,第二处理器的并行线程层次为:grid层和block层。
2)、每个并行线程层次上可并行执行的线程块或线程的数量。例如,若并行线程层次为 grid层和block层,则每个并行线程层次上可并行的线程块或线程的数量可以为:grid层上可并行α个block,block层上可并行β个线程,α和β都是大于0的正整数。
如图4所示,为基于上述示例的并行线程层次的关系示意图。其中,最大的方框指gird 层,该grid包括4个block(如图4中所示的block(0,0)和block(1,0)等)。一个block包括6个线程(如图4中所示的线程(0,0)和线程(1,0)等)。
3)、第二处理器的存储参数,可以包括:多层次存储介质的结构和多层次存储介质的容量等。
其中,多层次存储介质的结构是计算机体系结构下,根据数据的读写速度由慢到快、存储数据的容量由大到小,将存储系统划分出的多个级别层次的存储介质。按照距离第二处理器远近,可以将多层次存储介质分为远端存储介质(如上述远端存储介质103)和近端存储介质(如上述近端存储介质1022)。多层次存储介质的容量是多层次存储介质中每一层次存储介质可存储的数据量的最大值,一般以吉字(gigabyte,GB)或兆字节(millionbyte,MB) 等为单位。
可选的,第二处理器的存储参数还可以包括:第二处理器包括的寄存器的数量。
可选的,若多层次存储介质的结构为近端存储介质和远端存储介质,则第二处理器的存储参数还可以包括张量计算内存。其中,张量计算内存为在近端存储介质上为张量计算加速硬件所划分出的一块内存,该内存仅用于存储执行张量的计所产生的数据。这样由于该内存仅供张量计算加速硬件使用,因此可以加快计算速度。
4)、张量计算加速硬件的参数,可以包括张量计算加速硬件可支持的张量块的类型和最小张量块的大小等。例如最小张量块的大小为2*2。可以理解的是,当张量计算加速硬件确定后,其可支持的最小张量块的大小就是确定的。张量块的类型可以为张量块的维度,如一维张量块即向量,二维张量块即矩阵等。一个张量计算加速硬件可支持的张量块的类型可以有一种或多种。可选的,张量计算加速硬件的参数还可包括张量间的运算关系,如乘运算或加运算等。
S102:第一处理器确定将每个并行线程层次和一个线程上第一算子的输出张量的每个输出张量块均作为可复用张量块,并确定存储分配规则。该存储分配规则为“将每个并行线程层次和一个线程上可复用张量块(如每个可复用张量块)分配至近端存储介质”的规则。
可以理解的是,执行S102时,第一处理器还未获得第一算子的输出张量,自然还对第一算子的输出张量进行划分,但是,可以确定的是:无论第一处理器如何对第一算子的输出张量进行划分,划分得到的每个输出张量块均可以作为可复用张量块。
可选的,当第二处理器的存储参数中包括张量计算内存时,该存储分配规则为“将每个并行线程层次和一个线程上的可复用张量块(如每个可复用张量块)分配至近端存储介质中的张量计算内存”的规则。
将每个并行线程层次和一个线程上的可复用张量块分配至近端存储介质,一方面,第二处理器执行第二算子时,可以直接从近端存储介质上读取该可复用张量块,而不需要从远端存储介质上读取,这样可以缩短数据读取时间;另一方面,有助于提高近端存储介质使用率。
S103:第一处理器根据第二处理器的每个并行线程层次上可并行的线程和线程块的数量、张量计算加速硬件可支持的最小张量块的大小和存储参数,分别在每个并行线程层次和一个线程上,确定第一算子和第二算子的输出张量可划分的输出张量块的大小的取值范围。
具体的,第一处理器根据张量计算加速硬件可支持的最小张量块的大小和存储参数中的多层次存储介质的容量(如近端存储介质上可允许同时访问的容量),确定第一算子和第二算子中的每个算子的输出张量在一个线程上可划分的输出张量块大小的取值范围。然后,对于第一算子和第二算子中的每个算子来说,根据该算子的输出张量在一个线程上可划分的输出张量块大小的取值范围以及每个并行线程层次上可并行的线程和线程块的数量,确定每个并行线程层次上该算子的输出张量可划分的输出张量块大小的取值范围。
示例的,假设:第一代码是“A1x*k*B1k*y=C1x*y,C1x*y*B2y*z=C2x*z”的指令序列,且A1x*k*B1k*y=C1x*y”为第一算子,“C1x*y*B2y*z=C2x*z”为第二算子;并且,并行线程层次为grid 层和block层,grid层上最多可并行α个block,block层上最多可并行β个线程;以及,在 grid层上实际并行的block数量为a,0<a≤α,且a为正整数;在block层上实际并行的线程数量为b,0<b≤β,且b为正整数。并且,为了方便描述,下文中皆使用C1表示第一算子的输出矩阵C1x*y,A1和B1分别表示第一算子的输入矩阵A1x*k和B1k*y;C2表示第二算子的输出矩阵C2x*z,C1和B1分别表示第二算子的输入矩阵C1x*y和B2y*z。那么:
以第一算子的输出张量C1为例:
在一个线程上可划分的输出张量块的大小的取值范围为:张量计算加速硬件可支持的最小张量块的大小的T倍,即(T*m)*(T*n);其中,m*n为张量计算加速硬件可支持的最小张量块的大小(由上述张量计算加速硬件参数可以得到:m*n的大小是一个定值),T为正整数。T的取值范围受限于可允许同时访问的近端存储介质的存储容量。可允许同时访问的近端存储介质的存储容量越大,T的取值越大。
需要说明的是,当存储参数包括第二处理器包括的寄存器的数量时,上述输出张量块T 的取值范围也受限于第二处理器包括的寄存器的数量。
在block层上,基于block层上实际并行执行的线程的数量b,以及输出张量C1在一个线程上可划分的输出张量块C1’的大小(T*m)*(T*n),可以确定第一算子的输出张量C1在一个block上可划分的输出张量块大小的取值范围为:(b*(T*m))*(b*(T*n)),0<b≤β。
在gird层上,基于grid层上实际并行执行的线程块的数量a,以及输出张量C1在一个 block上可划分的输出张量块大小的取值范围(b*(T*m))*(b*(T*n)),可以确定第一算子的输出张量C1在grid层上可划分的输出张量块的大小的取值范围为:(a*b*(T*m))* (a*b*(T*n)),0<a≤α且0<b≤β。
由此可以得到:在gird层上,将一个大小为x*y的张量划分为大小为(a*b*(T*m))*(a*b* (T*n))的张量块。即可以推导出,存在等式:x*y=(a*b*(T*m))*(a*b*(T*n))。由于输出张量的大小x*y是确定的,且张量计算加速硬件的大小m*n也是确定的,因此在每个并行线程层次上以及线程上的张量块的大小的取值范围均与参数“a、b和T”取值相关。
需要说明的是,根据“0<a≤α且0<b≤β,以及T与存储参数相关”可知,a、b和T的取值是一个范围而非定值。基于此,当a、b和T取不同的值时,在一个线程上同一输出张量划分的输出张量块的大小可能不同,且在任意一个并行线程层次上同一输出张量划分的输出张量块的大小可能不同。
S104:对于第一算子和第二算子中的每个算子:第一处理器根据该算子在一个线程上输出张量可划分的输出张量块的大小的取值范围,确定该线程上该算子的输出张量的划分规则;基于该算子的输出张量的划分规则,确定该线程上该算子内张量块之间的依赖关系(即确定该线程上与该算子的每个输出张量块分别具有依赖关系的输入张量块)。同理,对于每个并行线程层次来说,第一处理器根据该算子在该并行线程层次上输出张量可划分的输出张量块的大小的取值范围,确定该并行线程层次上该算子的输出张量的划分规则;基于该算子的输出张量的划分规则,确定该并行线程层次上该算子内张量块之间的依赖关系(即确定该并行线程层次上与该算子的每个输出张量块分别具有依赖关系的输入张量块)。
一个算子在一个线程(或并行线程层次)上输出张量可划分的输出张量块的大小的一个值,可以对应该线程(或并行线程层次)上该算子的输出张量的一种划分规则。例如,假设一个算子在一个线程上输出张量可划分的输出张量块的大小为2*2,且该输出张量为4*4,则划分规则可以为将该输出张量划分为多个2*2的张量块。
可以理解的是,执行S104之后,第一处理器可以得到一个线程上和每个并行线程层次上,第一算子和第二算子中的每个算子的每个输入张量所划分的输入张量块,以及每个算子的输出张量块与相应输入张量块之间的依赖关系。
假设第一算子的输入张量为A1和B1,其各自在一个线程上所划分的张量块为输入张量块A1’和输入张量块B1’,且A1’和B1’是根据第一算子的输出张量可划分的任一输出张量块 C1’划分得到的;那么,与该输出张量块C1’具有依赖关系的输入张量块为A1’和B1’。同理,可以确定出该线程上与每个输出张量块分别具有依赖关系的输入张量块。
需要说明的是,输入张量块A1’、B1’以及输出张量块C1’的大小皆是可调的,具体根据参数“a、b和T”相关,当取定参数“a、b和T”的一组值时,输出张量块C1’的大小才是确定的,进而输入张量块A1’和B1’的大小才是确定的。也就是说,S205中,基于一个线程上输出张量可划分的输出张量块的每个可能的大小,均可以确定出一组该线程上与该算子的每个输出张量块分别具有依赖关系的输入张量块。
本申请实施例提供了一种通过输出张量块中所包括的元素的位置信息来确定与该输出张量块具有依赖关系的输入张量块的方法,具体的,可以参照图5。图5是以“在一个线程上通过第一算子的输出张量块中所包括的元素的位置信息来确定与该输出张量块具有依赖关系的输入张量块”为例进行说明。S104可以包括如下步骤:
S104-1:在一个线程上,第一处理器根据第一算子的输出张量可划分的输出张量块的大小的取值范围,确定该线程上每个可划分的输出张量块中的元素的位置信息。其中,张量块中的元素的位置信息,用于指示该元素在该张量块所在的张量中的位置。
具体的,当张量块为矩阵块时,该张量块中的元素的位置信息可以由该元素在矩阵块的行标识和列标识共同标识。
例如,如图5所示,如果一个元素C1(i,j)在输出张量块C1’所在的矩阵块中的行标识为 i,列标识为j,那么,该元素的位置信息可以表示为(i,j),其中,0<i≤Tm且0<j≤Tn。Tm*Tn 为该输出张量在一个线程上所划分的一个输出张量块C1’的大小,m*n为张量计算加速硬件可支持的最小张量块的大小;Tm和Tn均为正整数。
可选的,可以采用元素集合的方式表示输出张量块C1’中所包括的元素的位置信息。例如,元素集合可以表示为{{C1(i,j)|e<i≤e+Tm,f<j≤f+Tn,e∈{p*Tm},f∈{q*Tn}};其中,C1(i,j)为输出张量C1中第i行第j列的元素。i、j、e和f均为正整数;p和q为整数且满足条件:0≤p≤(x/(a*b*Tm)-1)和0≤q≤(y/(a*b*Tn)-1)。可以理解的是,当e取不同值时, i可以取其所属范围内任一个值;同理,当f取不同值时,j可以取其所属范围内任一个值。当p和q取不同的值时,e和f取不同的值,此时该元素集合表示不同的输出张量块。
可以理解的是,每个并行线程层次上的输出张量块中元素的位置信息也可以通过元素集合的方式表示。这里仅以确定一个线程上的每个输出张量块中元素的位置信息为例进行说明:
例如,当p和q皆取0时(即此时e=0且f=0),可以确定第一算子的输出张量C1在一个线程上的第一个输出张量块中的元素所构成的集合可以表示为:{C1(i,j)|0<i≤Tm,0<j≤Tn}。由此,可以确定第一个输出张量块中每个元素的位置信息,如C1(1,1),C1(1,2)…C1(Tm, Tn)。当p=1且q=0(即此时e=Tm且f=0)时,第一算子的输出张量C1在一个线程上的第二个输出张量块中元素所构成的集合为:{C1(i,j)|Tm<i≤2Tm,0<j≤Tn}。由此可以确定出第二个输出张量块的所包含的元素的位置信息为:C1(Tm+1,1)、C1(Tm+1,2)…C1(2Tm,Tn)。以此类推,根据p和q的取值范围,得到不同的e和f的取值,从而可以确定出第一算子的输出张量C1中的每个张量块所包括的元素的位置信息。
可以理解的是,这里仅是以元素集合表示张量块中所包括的元素的位置信息。当然,也可以采用其他方法来确定元素的位置信息,本申请对此不作具体限定。
需要说明的是,由于上述步骤S103所确定的输出张量块的大小为一个取值范围而非定值,因此,不同的张量块大小的取值,所确定的张量块中包括的元素的位置信息是不同的。
S104-2:在该线程上,第一处理器根据第一算子的输出张量可划分的输出张量块中所包含的元素的位置信息,以及第一算子的输出张量与输入张量的运算关系,确定该算子中与该输出张量块具有依赖关系的输入张量块。
具体的,以确定一个输入张量可划分的输入张量块为例进行说明,S104-2包括如下步骤:
步骤1:在该线程上,第一处理器根据第一算子的输出张量可划分的输出张量块中所包含的元素的位置信息,以及第一算子的输入张量和输出张量之间的运算关系,确定该输入张量中与该线程上的每个输出张量块中各元素具有依赖关系的元素。
步骤2:在该线程上,针对第一算子的每个输出张量块,将第一算子的各输入张量中的且与该输出张量块中各元素具有依赖关系的元素,作为该输入张量可划分的一个输入张量块。
示例的,如图5所示,以对第一算子的两个输入张量A1和B1在一个block层上的一个张量块进行划分,得到一个线程上的输入张量块A1’和B1’为例,并基于上述S104-1中的示例进行说明:
当p和q皆取0时,第一个输出张量块C1’中的元素构成的集合为元素集合{C1(i,j)|0<i≤Tm,0<j≤Tn}。由此,可以确定第一个输出张量块C1’中每个元素的位置信息,如C1(1, 1),C1(1,2)…C1(Tm,Tn)。根据矩阵运算关系,可以得到:与元素C1(1,1)具有依赖关系的元素为:输入张量A1的第1行中的所有元素和输入张量B1的第1列中的所有元素。同理,可以得到与元素C1(Tm,Tn)具有依赖关系的元素为:输入张量A1的第Tm行中的所有元素和输入张量B1的第Tn列中的所有元素。基于此,第一处理器可以将与第一输出张量块 C1’中每个元素都具有依赖关系的,且属于输入张量A1的元素,作为输入张量A1的一个张量块A1’。同理,将与第一输出张量块C1’中每个元素都具有依赖关系的且属于输入张量B1 的元素作为输入张量B1的一个张量块B1’。
同理,在block层上,由于输出张量C1可划分的张量块的大小为(b*T*m)*(b*T*n)。基于上述同样的划分方法,可以对输入张量A1在block层上和输入张量B1在block层上进行划分,得到不同的张量块。在grid层上,由于输出张量C1可划分的张量块的大小为(a*b*Tm)*(a*b*Tn),那么对于输入张量A1和B1在gird层上进行划分得到张量块的方法同上,此处就不再赘述。
S105:第一处理器根据第一算子与第二算子之间的依赖关系、一个线程上第一算子内张量块之间的依赖关系,以及该线程上第二算子内张量块之间的依赖关系,确定该线程上第一算子和第二算子之间具有依赖关系的张量块的执行顺序。同理,对于每个并行线程层次来说,第一处理器根据第一算子与第二算子之间的依赖关系、该并行线程层次上第一算子内的输入张量块与输出张量块之间的依赖关,以及该并行线程层次上第二算子内张量块之间的依赖关系,确定该并行线程层次上第一算子和第二算子间具有依赖关系的张量块的执行顺序。
例如,对于第二算子中的目标输出张量块(即第二算子的任意一个输出张量块)来说,在一个线程(或一个并行线程层次)上,如果该输出张量块依赖于第一输入张量块和第二输入张量块,且第二输入张量块为第一算子与第二算子之前的可复用张量块(即第二输入张量块为第一算子的输出张量块,将该输出张量块标记为第一算子的目标输出张量块);并且,对于第一算子来说,第二输入张量块(即第一算子的目标输出张量块)依赖于第三输入张量块和第四输入张量块,则先根据第三输入张量块和第四输入张量块,计算得到第一算子的目标输出张量块(即第二算子的第二输入张量块),再基于第二输入张量块与第一输入张量块计算得到第一算子的目标输出张量块。依此,得到第一算子和第二算子之间具有依赖关系的每组张量块的执行顺序。更具体的示例可以参考上文对算子间具有依赖关系的张量块的描述部分。
可以理解的是,线程是block层上的最小任务执行单元,block是gird层上的任务执行单元,因此,当确定了一个线程上的张量块信息(如输出张量块的大小取值范围、算子内输出张量块与输入张量块的依赖关系、第一算子和第二算子间具有依赖关系的张量块的执行顺序等)时,根据并行线程层次和每个并行线程层次上可并行执行的线程块或线程的数量,则可以确定出一个block上的张量块信息以及一个gird上的张量块信息。
本申请实施例对S102和S103~S105的执行顺序不进行限定,例如可以先执行S102再执行S103~S105;或者,可以先执行S103~S105再执行S102;或者,可以在执行S103~S105的过程中,执行S102等。
S106:第一处理器根据一个线程上第一算子内张量块之间的依赖关系、第二算子内张量块之间的依赖关系,以及第一算子和第二算子间具有依赖关系的张量块的执行顺序,在该线程上对第一算子和第二算子进行基于张量块的算子融合,得到一个新的算子。同理,对于每个并行线程层次,根据该并行线程层次上第一算子内张量块之间的依赖关系、第二算子内张量块之间的依赖关系,以及第一算子和第二算子间具有依赖关系的张量块的执行顺序,在该并行线程层次上对第一算子和第二算子进行基于张量块的算子融合,得到一个新的算子。
其中,在一个线程上或任意一个并行线程层次上,新的算子的运算结果等价于第一算子与第二算子的运算结果。执行算子融合的过程可以参考现有技术。
以第一算子是A1*B1=C1,第二算子是C1*B2=C2为例,第一算子与第二算子之间的算子融合结果为A1*B1*B2=C2。该算子融合结果为基于张量粒度的融合结果。基于张量块的算子融合可以为“根据算子内张量块之间的依赖关系,以及第一算子和第二算子之间具有依赖关系的张量块的执行顺序”所确定的获得输出张量C2的每个输出张量块的一组算子。例如,该组算子中的其中一个算子可以为:A1’*B1’*B2’=C2’,其中,C2’为输出张量C2的任一个输出张量块,B2’为输入张量B2所划分的与输出张量块C2’之间具有依赖关系的输入张量块, A1’和B1’分别为输入张量A1和B1所划分的与可复用张量块C1’之间具有依赖关系的输入张量块,C1’为可复用张量块C1所划分的与输出张量块C2’之间具有依赖关系的输入张量块。
可以理解的是,一方面,如果张量加速硬件多个处理单元,则一个算子的运算过程通常会由同一个处理单元来执行,而不同算子的运算过程可以由同一处理单元或不同处理单元来执行;并且,每个处理单元可以独立对应近端存储介质和远端存储介质。另一方面,同一处理单元执行算子的过程中产生的数据会存储至同一处理单元所对应的近端存储介质或远端存储介质。因此,在张量加速硬件包含多个处理单元的场景中,为了保证第一算子与第二算子之间的可复用张量块存储均存储至同一处理单元所对应的近端存储介质,需要限定第一算子和第二算子由同一处理单元执行,因此,需要将第一算子与第二算子进行算子融合。
由此可知,S106是可选的步骤。例如,当张量加速硬件仅包含一个处理单元,或者即使包含多个处理单元,但这多个处理单元对应同一近端存储介质时,可以不需要执行算子融合。
上文中是以具有依赖关系的算子包括第一算子和第二算子为例进行说明的,假设一组具有依赖关系的算子为:第一算子的输出张量可以作为第二算子的输入张量、第二算子的输出张量可以作为第三算子的输入张量,那么,S106中的算子融合具体可以为:在一个线程上和每个并行线程层次上,对第一算子、第二算子和第三算子进行算子融合,得到一个新的算子。
执行S106之后,第一处理器建立好了优化模型。如图6所示,为本申请实施例提供的一种优化模型的示意图。具体的,优化模型的输入参数为具有依赖关系的一组算子(即第一算子和第二算子),以及第二处理器的硬件参数;优化模型的输出参数包括:每个并行线程层次和一个线程上的存储分配规则,每个并行线程层次和一个线程上每个算子内张量块之间的依赖关系,每个并行线程层次和一个线程上该组算子的输入张量块与输出张量块的执行顺序。可选的,优化模型的输出参数还包括该组算子的算子融合结果。可选的,优化模型的输出参数还包括S103得到的输出张量可划分的输出张量块的大小的取值范围。
可以理解的是,如果将优化模型的所有输出参数统称为一个输出参数组,那么,基于该组算子的输出张量可划分的输出张量块的大小的取值范围中的每个取值,可以得到该输出参数组的一种可能的结果。
可选的,优化模型可以随着第二处理器的硬件参数的更新而更新。可以理解的是,由于优化模型是基于第二处理器的硬件参数建立的,因此,如果第二处理器的硬件参数不更新,则优化模型可以不更新;如果第二处理器的硬件参数有更新(如第二处理器的近端存储介质或远端存储介质进行了扩容),则第一处理器可以更新该优化模型。
如图7所示,为本申请实施例提供一种优化张量计算性能的方法的流程示意图。该方法可以包括如下步骤:
S201:第一处理器接收待执行任务的第一代码(如接收用户输入的待执行任务的第一代码),并判断第一代码中的输入张量是否满足张量计算加速硬件的参数的张量块的类型。
若是,则执行S202,若否,则结束。
第一代码是对至少两个输入张量进行多个算子的运算得到输出张量的指令序列。例如,第一代码可以是“A1x*k*B1k*y=C1x*y,C1x*y*B2y*z=C2x*z”的指令序列。其中,x*k、k*y、x*y、 y*z和x*z分别表示矩阵A1、B1、C1、B2和C2的大小。也就是说,待执行任务为对根据第一算子和第二算子获取矩阵C2。
可以理解的是,当输入矩阵A1和B1确定后,输出矩阵C1中所包括的元素的值是未知的,是需要通过执行第一代码(或对第一代码进行优化后得到的第二代码)后得到的,但是其大小是可以在执行第一代码(或第二代码)之前根据矩阵运算规则获知的,如上述示例中,可以确定矩阵C1的大小为x*y。
S202:第一处理器判断第一代码的多个算子中是否存在具有依赖关系的算子。
若是,则执行S203;若否,则结束。
需要说明的是,第一代码的多个算子中可能存在一组或多组具有依赖关系的算子。例如,假设第一代码的多个算子包括算子1~4,那么,若算子1的输出张量可以作为算子2的输入张量,算子2的输出张量可以作为算子3的输入张量,算子1的输出张量可以作为算子4的输入张量,则可以将算子1、算子2和算子3作为一组具有依赖关系的算子,并将算子1和算子4作为一组具有依赖关系的算子。当然,也可能不存在具有依赖关系的关系。
S203:以具有依赖关系的一组算子包括算子1和算子2,且算子1的输出张量作为算子2 的输入张量为例,第一处理器确定每个并行线程层次和一个线程上的存储分配规则。
为了便于描述,下文中的具体示例,均以算子1为A1*B1=C1,C1*B2=C2,并且以A1、 B1、C1、B2和C2所划分的张量块分别为A1’、B1’、C1’、B2’和C2’为例进行说明。在此统一说明,下文不再赘述。
需要说明的是,如果第一代码中存在多组具有依赖关系的算子,则针对该多组中的每组来说,如果一个算子的输出张量可以作为另一个算子的输入张量,则将在每个并行线程层次和一个线程上该一个算子的输出张量的每个输出张量块均作为可复用张量块;并且,第一代码的存储分配规则包括“针对该多组中的每组来说,将在每个并行线程层次和一个线程上的每个可复用张量块分配至近端存储介质”的规则。
S204:第一处理器获取张量计算加速硬件可支持的输出张量块大小的取值范围。
在一种实现方式中,该步骤S204的具体实现方式可以参考上述S103。
在另一种实现方式中,当优化模型的输出参数包括张量计算加速硬件可支持的输出张量块大小的取值范围时,第一处理器可以基于该输出参数执行S204。
S205:第一处理器将在张量计算加速硬件可支持的输出张量块大小的取值范围中的目标值作为算子2的输出张量块的大小;然后,基于算子2的输出张量块的大小和上述优化模型,确定每个并行线程层次和一个线程上每个算子内张量块之间的依赖关系,每个并行线程层次和一个线程上算子1和算子2间具有依赖关系的张量块的执行顺序;可选的,第一处理器还可以确定算子1与算子2的算子融合结果。
具体的,第一处理器在满足输出张量块大小的取值范围的前提下,取定任意一组满足其取值范围的参数(如a、b和T)的值,并根据所取定的该组参数的值确定输出张量块的目标值。
例如,假设算子2的输出张量C2的大小为64*64,且张量计算加速硬件可支持的最小张量块的大小m*n=2*2,那么,根据S103中描述的等式“x*y=(a*b*(T*m))*(a*b*(T*n))”,可以确定出a*b*T=32。基于此,假设取定a=2,b=8,T=2,那么,在一个线程上,根据算子 2的输出张量块C2’的大小Tm*Tn,可以得到Tm*Tn=4*4,也就是说,算子2的输出张量块 C2’的大小为4*4。基于一个线程上算子2的输出张量块C2’的大小,结合本申请图5中的实施例所提供的方法,能够确定出算子2中与该输出张量块C2’具有依赖关系的输入张量块C1’和输入张量块B2’。当确定了该输入张量块C1’后,根据“算子2的输出张量块所依赖的目标输入张量块是由算子1的输入张量块计算得到的”,即确定了算子2的目标输入张量块为C1’ (即算子1的输出张量块C1’),同理,再结合本申请图5中的实施例中的方法,可以确定出与该算子1的输出张量块C1’具有依赖关系的算子1中输入张量块A1’和B1’。
基于一个线程上算子2的输出张量块C2’的大小,以及S205可以得到在block层和grid 层上算子2的输出张量块的大小。并基于上述相同的方法,可以确定算子2的输入张量块以及算子1的输入张量块。
S206:第一处理器生成第二代码。第二代码描述了每个并行线程层次和一个线程上的存储分配规则,以及针对每组具有依赖关系的算子描述了:每个并行线程层次和一个线程上每个算子内张量块之间的依赖关系,每个并行线程层次和一个线程上该组算子间具有依赖关系的张量块的执行顺序,以及该组算子的算子融合结果。
例如,以算子1的输出张量作为算子2的输入张量为例,第二代码可以为描述了如下内容的指令序列:将算子1的每个输出张量块均存储至第二存储介质的近端存储介质的规则;在每个并行线程层次和一个线程上:算子2中与每个输出张量块具有依赖关系的输入张量块,算子1中与每个输出张量块具有依赖关系的输入张量块,算子1和算子2的输入张量块与输出张量块的执行顺序;以及,算子1与算子2的算子融合结果等。
S207:第一处理器将第二代码发送至第二处理器。
S208:第二处理器基于第二代码处理待执行任务,得到待执行任务的执行结果。
以下,以算子1的输出张量作为算子2的输入张量为例,说明第二处理器基于第二代码处理待执行任务的过程:
对于算子2中的在一个线程上任意一个输出张量块C2’:如果该C2’依赖于C1’和B2’, C1’依赖于A1’和B1’,则先根据该A1’和该B1’,计算得到该C1’,并将该C1’存储至第二处理器的近端存储介质;然后,再从第二处理器的近端存储介质中读取该C1’,并结合该B2’所读取的该C1’计算得到该C2’。依据此,可以得到一个线程上的每个输出张量块C2’。相应地,可以得到算子2中的每个并行线程层次上的每个输出张量块C2’。
本申请实施例提供的优化张量计算性能的方法,第一处理器确定待执行任务中具有依赖关系的算子内与每个输出张量块分别具有依赖关系的输入张量块,以及确定算子间具有依赖关系的张量块的执行顺序,从而可以将待执行任务中基于张量的计算转换基于张量块的计算。另外,第一处理器还确定将待执行任务中具有依赖关系的算子间的可复用张量块存储至近端存储介质的存储分配规则。然后,基于所确定的信息生成第二代码,并将第二代码发送第二处理器。这样,第二处理器可以直接基于张量块粒度执行待执行任务,并且从近端存储介质中获取执行待执行任务的过程中所需要的可复用张量块,这有助于加快待执行任务的执行速度,从而有助于提升张量计算的整体性能。另外,由于第二处理器访问数据时是块状访问的,而所访问的块的大小和类型是由第二处理器所支持的块的大小和类型确定的,本实施例中是基于第二处理器所支持的块的大小和类型确定输出张量块的大小的,因此,本实施例提供的技术方案,有助于满足第二处理器的块状访存需求,从而有助于提升张量计算的整体性能。
如图8所示,为本申请实施例提供一种优化张量计算性能的方法的示意图。该方法可以包括如下步骤:
S301~S304:可以参考上述S201-S204。当然本申请实施例不限于此。
S305:第一处理器基于第二处理器所支持的输出张量块大小的取值范围中的至少两个目标值中的每个目标值,执行如下步骤:将该目标值作为算子2的输出张量的输出张量块的大小;并基于算子2的输出张量的输出张量块的大小和上述优化模型,确定每个并行线程层次和一个线程上每个算子内张量块之间的依赖关系,每个并行线程层次和一个线程上算子1和算子2间具有依赖关系的张量块的执行顺序;可选的,第一处理器还可以确定算子1与算子 2的算子融合结果。
具体的,第一处理器在满足输出张量块大小的取值范围的前提下,取定多组满足其取值范围的参数(如a、b和T)的值,从而根据所取定的该组参数的值确定输出张量块的目标值。可选的,第一处理器可以采用GPU代码自动调谐器(tuning),来确定该多组满足输出张量块大小的取值范围的参数的值。
可选的,在执行S305时,第一处理器可以直接将第二处理器所支持的输出张量块大小的取值范围中的每个可能的取值作为一个目标值。
S306:针对输出张量块的每个目标值,第一处理器生成一个第二代码。
S307:第一处理器将输出张量块的每个目标值所对应的第二代码均发送至第二处理器。
S308:第二处理器基于该多个第二代码分别执行待执行任务,得到多个执行结果,并选择执行时间最短的第二代码作为性能最优的第二代码。
S309:第二处理器向第一处理器发送指示信息,该指示信息用于指示性能最优的第二代码所对应的输出张量块的大小。
例如,该指示信息可以包括用于获得性能最优的第二代码时所采用的输出张量块的大小,或者,用于获得性能最优的第二代码时所采用的与输出张量块的大小相关的a、b和T的取值。
后续,若第一处理器再次接收到与待执行任务的类型相同的待执行任务的第一代码时,可以直接采用与该性能最优的第二代码所对应的输出张量块的大小(或a、b和T的取值),生成第二代码,从而降低第一处理器的计算资源开销,进而提升张量计算的整体性能。其中,如果两个待执行任务所包含的算子的运算关系相同,且对应算子的输入张量的大小相同,则这两个待执行任务的类型相同。例如,如果两个待执行任务均为A1*B1=C1,且这两个待执行任务中的A1的大小相同,且B1的大小相同,那么,无论这两个待执行任务中的A1中的元素是否相同,B1中的元素是否相同,均认为这两个待执行任务的类型相同。
本实施例提供的优化张量计算性能的方法中相关内容的解释可以参考上文。本实施例所能达到的有益效果可以参考上文。另外本实施例,有助于在后续执行与待执行任务的类型相同的待执行任务时,降低第一处理器的计算资源开销,从而提升张量计算的整体性能。
如图9所示,为本申请实施例提供一种优化张量计算性能的方法的示意图。该方法可以包括如下步骤:
S401~S406:可以参考上述S301-S306。当然本申请实施例不限于此。
S407:第一处理器基于第二处理器的性能模型(如performance model)执行该多个第二代码,并将该多个第二代码中的执行时间最短的第二代码作为性能最优的第二代码。
可以理解的是,后续,若第一处理器再次接收到与待执行任务的类型相同的待执行任务的第一代码时,可以直接采用与该性能最优的第二代码所对应的输出张量块的大小,生成性能最优的第二代码,从而降低第一处理器的计算资源开销,进而提升张量计算的整体性能。
S408:第一处理器将该性能最优的第二代码发送至第二处理器。
S409:第二处理器基于该性能最优的第二代码执行待执行任务,得到待执行任务的执行结果。
本实施例提供的优化张量计算性能的方法中相关内容的解释可以参考上文。本实施例所能达到的有益效果可以参考上文,另外本实施例,有助于降低第二处理器的计算资源,从而提升张量计算的整体性能。
上述主要从方法的角度对本申请实施例提供的方案进行了介绍。为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
本申请实施例可以根据上述方法示例对第一处理器和第二处理器进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
如图10所示,为本申请实施例提供的一种第一处理器101的示意性框图。该第一处理 101可以用于执行本申请实施例提供的任意一种优化张量计算性能的方法,如图3、图7、图 8或图9所示的优化张量计算性能方法。
第一处理器101包括接收单元101-1,确定单元101-2,生成单元101-3和发送单元101-4。接收单元101-1用于接收待执行任务的第一代码,其中,待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的任务,第一算子的输出张量为第二算子的一个输入张量。例如,结合图7,接收单元101-1可以用于执行S201;结合图8,接收单元101-1可以用于执行S301;结合图9,接收单元101-1可以用于执行S401。确定单元101-2用于确定存储分配规则;其中,存储分配规则包括:将第一算子的输出张量存储至第二处理器内部的存储介质的规则。例如,结合图7,确定单元101-2可以用于执行S202;结合图8,确定单元101-2可以用于执行S302;结合图9,确定单元101-2可以用于执行S402。生成单元101-3用于生成待执行任务的第二代码,第二代码为能够在第二处理器上的张量加速硬件并行执行的代码,第二代码描述了存储分配规则。例如,结合图7,生成单元101-3可以用于执行S206;结合图8,生成单元101-3可以用于执行S306;结合图9,生成单元101-3可以用于执行S406。发送单元101-4用于向第二处理器发送第二代码。例如,结合图7,发送单元101-4可以用于执行S207。可以理解的,在实际应用中,上述确定单元101-2和生成单元101-3可以以一个处理单元实现。
可选的,该确定单元101-2还用于确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;其中,输入张量块是对算子的输入张量进行划分得到的张量块;确定第一算子和第二算子间具有依赖关系的张量块的执行顺序。存储分配规则具体包括:将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码还描述了:与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序。
可选的,该确定单元101-2用于确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,具体包括:确定单元101-2分别确定在一个线程上和第二处理器的每个并行线程层次上,第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;确定单元101-2确定第一算子和第二算子间具有依赖关系的张量块的执行顺序,具体包括:确定单元101-2分别确定在一个线程上和每个并行线程层次上,第一算子和第二算子间具有依赖关系的张量块的执行顺序。例如,结合图3,确定单元101-2可以用于执行S105。存储分配规则具体包括:在一个线程上和每个并行线程层次上,将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码具体描述了:在一个线程上和每个并行线程层次上,与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及执行顺序。
可选的,确定单元101-2用于确定第一算子的输出张量和第二算子的输出张量的划分规则,并确定与基于该划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,具体包括:确定单元101-2确定对第二算子的输出张量进行划分的第二划分规则;确定单元 101-2确定与每个第二类输出张量块分别具有依赖关系的输入张量块和对第一算子的输出张量进行划分的第一划分规则;第二类输出张量块是基于第二划分规则得到的第二算子的输出张量的张量块;确定单元101-2确定与每个第一类输出张量块分别具有依赖关系的输入张量块;其中,第一类输出张量块是基于第一划分规则得到的第一算子的输出张量的张量块。例如,结合图3,确定单元101-2可以用于执行104。
可选的,确定单元101-2确定对第二算子的输出张量进行划分的第一划分规则,具体包括:确定单元101-2根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则。
可选的,确定单元101-2根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则,具体包括:当第一算子的输出张量的类型和第二算子的输出张量的类型,满足张量计算加速硬件可支持的张量块的类型时,确定单元101-2根据张量计算加速硬件可支持的最小张量块的大小,确定第二算子的输出张量可划分的输出张量块的大小的范围;确定单元101-2根据该范围中的目标值,确定第二划分规则。
可选的,确定单元101-2根据张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定第二划分规则,具体包括:当第一算子的输出张量的类型和第二算子的输出张量的类型,满足张量计算加速硬件可支持的张量块的类型时,确定单元101-2根据张量计算加速硬件可支持的最小张量块的大小,确定第二算子的输出张量可划分的输出张量块的大小的范围;确定单元101-2根据该范围中的至少两个目标值中的每个目标值,分别确定一个第二划分规则。例如,结合图7,确定单元101-2可以执行S205中的非可选内容;结合图8,确定单元101-2可以执行S305中的非可选内容;结合图9,确定单元101-2可以执行S405中的非可选内容。生成单元101-3生成待执行任务的第二代码,包括:生成单元101-3生成待执行任务的多个第二代码;其中,基于每个第二划分规则,生成一个第二代码。例如,结合图7,生成单元101-3可以执行S206;结合图8,生成单元101-3可以执行S306;结合图9,生成单元101-3可以执行S306;
可选的,接收单元101-1,还用于收第二处理器发送的指示信息,该指示信息用于指示多个第二代码中执行时间最短的第二代码。例如,结合图8,接收单元101-1可以用于执行S309。
可选的,该第一处理器还可以包括:执行单元101-5,用于执行多个第二代码。例如,结合图9,执行单元101-5可以用于执行S407。发送单元101-4向第二处理器发送第二代码,具体包括:发送单元101-4向第二处理器发送多个第二代码中执行时间最短的第二代码。例如,结合图9,发送单元101-4可以用于执行S408。
可选的,该第一处理器还可以包括:融合单元,用于对第一算子和第二算子进行算子融合,得到新的算子;第二代码还描述了新的算子。例如,结合图3,融合单元可以用于执行S106。
上述提供的任一种第一处理器101中相关内容的解释以及有益效果的描述等均可参考上述对应的方法实施例,此处不再赘述。在一个示例中,发送单元101-4可以通过第一处理器所在芯片的引脚或其上的某块电路实现。
如图11所示,为本申请实施例提供的一种第二处理器102的示意性框图。该第二处理 102可以用于执行本申请实施例提供的任意一种优化张量计算性能的方法,如图3、图7、图 8或图9所示的优化张量计算性能方法。
第二处理器102包括:接收单元102-1和张量计算加速硬件单元102-2。接收单元102-1 用于接收待执行任务的第二代码;其中,待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的,第一算子的输出张量为第二算子的一个输入张量;第二代码描述了存储分配规则;存储分配规则包括:将第一算子的输出张量存储至第二处理器内部的存储介质的规则。例如,结合图7,接收单元102-1可以用于执行S207。张量计算加速硬件单元102-2 用于并行执行第二代码。例如,结合图7,张量计算加速硬件单元102-2可以用于执行S208。示例的,张量计算加速硬件单元102-2可以是上文中描述的张量加速硬件。
可选的,该存储存储分配规则具体包括:将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码还描述了:与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及第一算子和第二算子间具有依赖关系的张量块的执行顺序;张量计算加速硬件单元102-2并行执行第二代码,具体包括:张量计算加速硬件单元102-2根据存储分配规则、与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及该执行顺序,并行执行第二代码。
可选的,该存储分配规则具体包括:在一个线程上和第二处理器的每个并行线程层次上,将第一算子的输出张量划分得到的输出张量块存储至存储介质的规则;第二代码具体描述了:在一个线程上和每个并行线程层次上,与第一算子的每个输出张量块分别具有依赖关系的输入张量块、与第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及该执行顺序。
可选的,接收单元102-1接收待执行任务的第二代码具体包括:接收单元102-1接收待执行任务的多个第二代码。例如,结合图9,接收单元102-1可以用于执行S307。张量计算加速硬件单元102-2并行执行第二代码,具体包括:对于多个第二代码中的每个第二代码,张量计算加速硬件单元102-2并行执行该第二代码。例如,结合图9,张量计算加速硬件单元 102-2可以用于执行S308。该第二处理器102还可以包括:发送单元102-3,用于向第一处理器发送指示信息,该指示信息用于指示多个第二代码中执行时间最短的第二代码。例如,结合图9,发送单元102-3可以用于执行S309。
上述提供的任一种第二处理器102中相关内容的解释以及有益效果的描述等均可参考上述对应的方法实施例,此处不再赘述。在一个示例中,接收单元102-1和发送单元102-3可以通过第二处理器所在芯片的某个引脚或其上的某块电路实现。
本申请实施例还提供了一种优化张量计算性能的系统,该系统包括上述任一种第一处理器101,以及上述任一种第二处理器102。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可通过程序来指令相关的硬件完成。所述的程序可以存储于一种计算机可读存储介质中。上述提到的存储介质可以是只读存储器,随机接入存储器等。上述处理单元或处理器可以是中央处理器,通用处理器、特定集成电路(application specific integrated circuit,ASIC)、微处理器(digital signal processor, DSP),现场可编程门阵列(field programmable gatearray,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。
本申请实施例还提供了一种包含指令的计算机程序产品,当该指令在计算机上运行时,使得计算机执行上述实施例中的任意一种方法。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriberline,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可以用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solidstate disk,SSD))等。
应注意,本申请实施例提供的上述用于存储计算机指令或者计算机程序的器件,例如但不限于,上述存储器、计算机可读存储介质和通信芯片等,均具有非易失性(non-transitory)。
在实施所要求保护的本申请过程中,本领域技术人员通过查看附图、公开内容、以及所附权利要求书,可理解并实现公开实施例的其他变化。在权利要求中,“包括”(comprising) 一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其他单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
尽管结合具体特征及其实施例对本申请进行了描述,在不脱离本申请的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本申请的示例性说明,且视为已覆盖本申请范围内的任意和所有修改、变化、组合或等同物。

Claims (28)

1.一种优化张量计算性能的方法,其特征在于,所述方法包括:
第一处理器接收待执行任务的第一代码,所述待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的任务,所述第一算子的输出张量为所述第二算子的一个输入张量;
所述第一处理器确定存储分配规则;其中,所述存储分配规则包括:将所述第一算子的输出张量存储至第二处理器内部的存储介质的规则;
所述第一处理器生成所述待执行任务的第二代码,所述第二代码为能够在所述第二处理器上的张量加速硬件并行执行的代码,所述第二代码描述了所述存储分配规则;
所述第一处理器向所述第二处理器发送所述第二代码。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
所述第一处理器确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;其中,所述输入张量块是对算子的输入张量进行划分得到的张量块;
所述第一处理器确定所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述存储分配规则具体包括:将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码还描述了:与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
3.根据权利要求2所述的方法,其特征在于,所述第一处理器确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,包括:
所述第一处理器分别确定在一个线程上和所述第二处理器的每个并行线程层次上,所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;所述并行线程层次指示对所述第二处理器上的多个线程进行分组的分组层级;
所述第一处理器确定所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序,包括:
所述第一处理器分别确定在一个线程上和所述每个并行线程层次上,所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述存储分配规则具体包括:在一个线程上和所述每个并行线程层次上,将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码具体描述了:在一个线程上和所述每个并行线程层次上,与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
4.根据权利要求2或3所述的方法,其特征在于,所述第一处理器确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块,包括:
所述第一处理器确定对所述第二算子的输出张量进行划分的第二划分规则;
所述第一处理器确定与每个第二类输出张量块分别具有依赖关系的输入张量块和对所述第一算子的输出张量进行划分的第一划分规则;所述第二类输出张量块是基于所述第二划分规则得到的所述第二算子的输出张量的张量块;
所述第一处理器确定与每个第一类输出张量块分别具有依赖关系的输入张量块;其中,所述第一类输出张量块是基于所述第一划分规则得到的所述第一算子的输出张量的张量块。
5.根据权利要求4所述的方法,其特征在于,所述第一处理器确定对所述第二算子的输出张量进行划分的第二划分规则,包括:
所述第一处理器根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则。
6.根据权利要求5所述的方法,其特征在于,所述第一处理器根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则,包括:
当所述第一算子的输出张量的类型和所述第二算子的输出张量的类型,满足所述张量计算加速硬件可支持的张量块的类型时,所述第一处理器根据所述张量计算加速硬件可支持的最小张量块的大小,确定所述第二算子的输出张量可划分的输出张量块的大小的范围;
所述第一处理器根据所述范围中的目标值,确定所述第二划分规则。
7.根据权利要求5所述的方法,其特征在于,所述第一处理器根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则,包括:
当所述第一算子的输出张量的类型和所述第二算子的输出张量的类型,满足所述张量计算加速硬件可支持的张量块的类型时,所述第一处理器根据所述张量计算加速硬件可支持的最小张量块的大小,确定所述第二算子的输出张量可划分的输出张量块的大小的范围;
所述第一处理器根据所述范围中的至少两个目标值中的每个目标值,分别确定一个所述第二划分规则;
所述第一处理器生成所述待执行任务的第二代码,包括:
所述第一处理器生成所述待执行任务的多个第二代码;其中,基于每个所述第二划分规则,生成一个第二代码。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
所述第一处理器接收所述第二处理器发送的指示信息,所述指示信息用于指示所述多个第二代码中执行时间最短的第二代码。
9.根据权利要求7所述的方法,其特征在于,在所述第一处理器向所述第二处理器发送所述第二代码之前,所述方法还包括:
所述第一处理器执行所述多个第二代码;
所述第一处理器向所述第二处理器发送所述第二代码,包括:
所述第一处理器向所述第二处理器发送所述多个第二代码中执行时间最短的第二代码。
10.根据权利要求1至9任一项所述的方法,其特征在于,在所述第一处理器生成所述待执行任务的第二代码之前,所述方法还包括:
所述第一处理器对所述第一算子和所述第二算子进行算子融合,得到新的算子;
所述第二代码还描述了所述新的算子。
11.一种优化张量计算性能的方法,其特征在于,所述方法包括:
第二处理器接收待执行任务的第二代码;其中,所述待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的,所述第一算子的输出张量为所述第二算子的一个输入张量;所述第二代码描述了存储分配规则;所述存储分配规则包括:将所述第一算子的输出张量存储至第二处理器内部的存储介质的规则;
所述第二处理器上的张量加速硬件并行执行所述第二代码。
12.根据权利要求11所述的方法,其特征在于,所述存储分配规则具体包括:将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码还描述了:与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述第二处理器上的张量加速硬件并行执行所述第二代码,包括:所述第二处理器根据所述存储分配规则、与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序,并行执行所述第二代码。
13.根据权利要求12所述的方法,其特征在于,
所述存储分配规则具体包括:在一个线程上和所述第二处理器的每个并行线程层次上,将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述并行线程层次指示对所述第二处理器上的多个线程进行分组的分组层级;
所述第二代码具体描述了:在一个线程上和所述每个并行线程层次上,与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
14.根据权利要求11至13任一项所述的方法,其特征在于,所述方法还包括:
所述第二处理器向第一处理器发送指示信息,所述指示信息用于指示多个第二代码中执行时间最短的第二代码。
15.一种第一处理器,其特征在于,所述第一处理器包括:
接收单元,用于接收待执行任务的第一代码,所述待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的任务,所述第一算子的输出张量为所述第二算子的一个输入张量;
确定单元,用于确定存储分配规则;其中,所述存储分配规则包括:将所述第一算子的输出张量存储至第二处理器内部的存储介质的规则;
生成单元,用于生成所述待执行任务的第二代码,所述第二代码为能够在所述第二处理器上的张量加速硬件并行执行的代码,所述第二代码描述了所述存储分配规则;
发送单元,用于向所述第二处理器发送所述第二代码。
16.根据权利要求15所述的第一处理器,其特征在于,所述确定单元还用于:
确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;其中,所述输入张量块是对算子的输入张量进行划分得到的张量块;
确定所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述存储分配规则具体包括:将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码还描述了:与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
17.根据权利要求16所述的第一处理器,其特征在于,所述确定单元在执行确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块时,具体用于:
分别确定在一个线程上和所述第二处理器的每个并行线程层次上,所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块;
所述确定单元在执行确定所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序时,具体用于:
分别确定在一个线程上和所述每个并行线程层次上,所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述存储分配规则具体包括:在一个线程上和所述每个并行线程层次上,将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码具体描述了:在一个线程上和所述每个并行线程层次上,与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
18.根据权利要求16或17所述的第一处理器,其特征在于,所述确定单元在执行确定所述第一算子的输出张量和所述第二算子的输出张量的划分规则,并确定与基于所述划分规则划分得到的每个输出张量块分别具有依赖关系的输入张量块时,具体用于:
确定对所述第二算子的输出张量进行划分的第二划分规则;
确定与每个第二类输出张量块分别具有依赖关系的输入张量块和对所述第一算子的输出张量进行划分的第一划分规则;所述第二类输出张量块是基于所述第二划分规则得到的所述第二算子的输出张量的张量块;
确定与每个第一类输出张量块分别具有依赖关系的输入张量块;其中,所述第一类输出张量块是基于所述第一划分规则得到的所述第一算子的输出张量的张量块。
19.根据权利要求18所述的第一处理器,其特征在于,所述确定单元在执行确定对所述第二算子的输出张量进行划分的第一划分规则时,具体用于:
根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则。
20.根据权利要求19所述的第一处理器,其特征在于,所述确定单元在执行根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则时,具体用于:
当所述第一算子的输出张量的类型和所述第二算子的输出张量的类型,满足所述张量计算加速硬件可支持的张量块的类型时,根据所述张量计算加速硬件可支持的最小张量块的大小,确定所述第二算子的输出张量可划分的输出张量块的大小的范围;
根据所述范围中的目标值,确定所述第二划分规则。
21.根据权利要求20所述的第一处理器,其特征在于,所述确定单元在执行根据所述张量计算加速硬件可支持的张量块的类型和最小张量块的大小,确定所述第二划分规则时,具体用于:
当所述第一算子的输出张量的类型和所述第二算子的输出张量的类型,满足所述张量计算加速硬件可支持的张量块的类型时,根据所述张量计算加速硬件可支持的最小张量块的大小,确定所述第二算子的输出张量可划分的输出张量块的大小的范围;
根据所述范围中的至少两个目标值中的每个目标值,分别确定一个所述第二划分规则;
所述生成单元生成具体用于:生成所述待执行任务的多个第二代码;其中,基于每个所述第二划分规则,生成一个第二代码。
22.一种第二处理器,其特征在于,所述第二处理器包括:
接收单元,用于接收待执行任务的第二代码;其中,所述待执行任务是对至少一个输入张量进行第一算子和第二算子的运算的,所述第一算子的输出张量为所述第二算子的一个输入张量;所述第二代码描述了存储分配规则;所述存储分配规则包括:将所述第一算子的输出张量存储至第二处理器内部的存储介质的规则;
张量计算加速硬件单元,用于并行执行所述第二代码。
23.根据权利要求22所述的第二处理器,其特征在于,所述存储分配规则具体包括:将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;所述第二代码还描述了:与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述第一算子和所述第二算子间具有依赖关系的张量块的执行顺序;
所述张量计算加速硬件单元具体用于:根据所述存储分配规则、与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序,并行执行所述第二代码。
24.根据权利要求23所述的第二处理器,其特征在于,
所述存储分配规则具体包括:在一个线程上和所述第二处理器的每个并行线程层次上,将所述第一算子的输出张量划分得到的输出张量块存储至所述存储介质的规则;
所述第二代码具体描述了:在一个线程上和所述每个并行线程层次上,与所述第一算子的每个输出张量块分别具有依赖关系的输入张量块、与所述第二算子的每个输出张量块分别具有依赖关系的输入张量块,以及所述执行顺序。
25.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中包含指令,当所述指令在所述计算机上运行时,所述计算机执行如权利要求1至10任一项所述的方法;或者执行如权利要求11至14任一项所述的方法。
26.一种芯片,其特征在于,所述芯片包括处理电路和接口;所述处理电路用于从存储介质中调用并运行所述存储介质中存储的计算机程序,以执行如权利要求1至10任一项所述的方法中所述第一处理器执行的步骤,或者如权利要求11至14任一项所述的方法中所述第二处理器执行的步骤。
27.一种优化张量计算性能的装置,所述装置包括处理器和存储器;所述存储器中存储有指令;所述处理器用于调用所述指令,以执行如权利要求1至10任一项所述的方法中所述第一处理器所执行的步骤,或者如权利要求11至14任一项所述的方法中所述第二处理器执行的步骤。
28.一种张量计算系统,其特征在于,所述张量计算系统包括第一处理器和第二处理器,所述第一处理器用于执行如权利要求1至10任一项所述的方法;所述第二处理器用于执行如权利要求11至14任一项所述的方法。
CN201910854534.3A 2019-09-10 2019-09-10 优化张量计算性能的方法及装置 Active CN112559163B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201910854534.3A CN112559163B (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置
CN202310588572.5A CN116775277A (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910854534.3A CN112559163B (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202310588572.5A Division CN116775277A (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置

Publications (2)

Publication Number Publication Date
CN112559163A true CN112559163A (zh) 2021-03-26
CN112559163B CN112559163B (zh) 2023-05-23

Family

ID=75028860

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202310588572.5A Pending CN116775277A (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置
CN201910854534.3A Active CN112559163B (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN202310588572.5A Pending CN116775277A (zh) 2019-09-10 2019-09-10 优化张量计算性能的方法及装置

Country Status (1)

Country Link
CN (2) CN116775277A (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20210089349A1 (en) * 2019-09-24 2021-03-25 Speedata Ltd. Inter-Thread Communication in Multi-Threaded Reconfigurable Coarse-Grain Arrays
CN113342345A (zh) * 2021-05-17 2021-09-03 北京百度网讯科技有限公司 深度学习框架的算子融合方法、装置
CN114429211A (zh) * 2022-02-07 2022-05-03 北京百度网讯科技有限公司 用于生成信息的方法、装置、设备、介质和产品
CN114579929A (zh) * 2022-03-14 2022-06-03 海飞科(南京)信息技术有限公司 加速器执行的方法和电子设备
WO2023284745A1 (zh) * 2021-07-14 2023-01-19 华为技术有限公司 一种数据处理方法、系统及相关设备
CN116166275A (zh) * 2023-04-24 2023-05-26 之江实验室 一种深度学习任务构图方法、装置、介质
WO2024000464A1 (zh) * 2022-06-30 2024-01-04 华为技术有限公司 一种张量计算的分块策略生成方法及装置
WO2024012388A1 (zh) * 2022-07-15 2024-01-18 华为技术有限公司 一种数据类型的处理方法及相关装置

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1514358A (zh) * 2002-12-31 2004-07-21 深圳市中兴通讯股份有限公司 一种基于StarCore数字信号处理器的并行运算处理的优化方法
CN101689106A (zh) * 2007-06-12 2010-03-31 松下电器产业株式会社 多处理器控制装置、多处理器控制方法以及多处理器控制电路
US20110010690A1 (en) * 2009-07-07 2011-01-13 Howard Robert S System and Method of Automatically Transforming Serial Streaming Programs Into Parallel Streaming Programs
US20170032487A1 (en) * 2015-07-30 2017-02-02 International Business Machines Corporation Pipelined approach to fused kernels for optimization of machine learning workloads on graphical processing units
CN108197027A (zh) * 2017-12-29 2018-06-22 广州景派科技有限公司 软件性能优化方法、可存储介质、计算机、计算机程序
CN110059290A (zh) * 2019-03-15 2019-07-26 上海大学 一种基于gpu的三阶低秩张量计算方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1514358A (zh) * 2002-12-31 2004-07-21 深圳市中兴通讯股份有限公司 一种基于StarCore数字信号处理器的并行运算处理的优化方法
CN101689106A (zh) * 2007-06-12 2010-03-31 松下电器产业株式会社 多处理器控制装置、多处理器控制方法以及多处理器控制电路
US20110010690A1 (en) * 2009-07-07 2011-01-13 Howard Robert S System and Method of Automatically Transforming Serial Streaming Programs Into Parallel Streaming Programs
US20170032487A1 (en) * 2015-07-30 2017-02-02 International Business Machines Corporation Pipelined approach to fused kernels for optimization of machine learning workloads on graphical processing units
CN108197027A (zh) * 2017-12-29 2018-06-22 广州景派科技有限公司 软件性能优化方法、可存储介质、计算机、计算机程序
CN110059290A (zh) * 2019-03-15 2019-07-26 上海大学 一种基于gpu的三阶低秩张量计算方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
LONGHAO YUAN等: "High-Order Tensor Completion for Data Recovery via Sparse Tensor-Train Optimization", 《2018 IEEE INTERNATIONAL CONFERENCE ON ACOUSTICS, SPEECH AND SIGNAL PROCESSING (ICASSP)》 *
陈艳男: "采用最优化方法的张量计算及其应用", 《中国优秀博硕士学位论文全文数据库(博士)基础科学辑》 *

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20210089349A1 (en) * 2019-09-24 2021-03-25 Speedata Ltd. Inter-Thread Communication in Multi-Threaded Reconfigurable Coarse-Grain Arrays
US11900156B2 (en) * 2019-09-24 2024-02-13 Speedata Ltd. Inter-thread communication in multi-threaded reconfigurable coarse-grain arrays
CN113342345A (zh) * 2021-05-17 2021-09-03 北京百度网讯科技有限公司 深度学习框架的算子融合方法、装置
WO2023284745A1 (zh) * 2021-07-14 2023-01-19 华为技术有限公司 一种数据处理方法、系统及相关设备
CN114429211A (zh) * 2022-02-07 2022-05-03 北京百度网讯科技有限公司 用于生成信息的方法、装置、设备、介质和产品
CN114579929A (zh) * 2022-03-14 2022-06-03 海飞科(南京)信息技术有限公司 加速器执行的方法和电子设备
CN114579929B (zh) * 2022-03-14 2023-08-08 海飞科(南京)信息技术有限公司 加速器执行的方法和电子设备
WO2024000464A1 (zh) * 2022-06-30 2024-01-04 华为技术有限公司 一种张量计算的分块策略生成方法及装置
WO2024012388A1 (zh) * 2022-07-15 2024-01-18 华为技术有限公司 一种数据类型的处理方法及相关装置
CN116166275A (zh) * 2023-04-24 2023-05-26 之江实验室 一种深度学习任务构图方法、装置、介质

Also Published As

Publication number Publication date
CN116775277A (zh) 2023-09-19
CN112559163B (zh) 2023-05-23

Similar Documents

Publication Publication Date Title
CN112559163B (zh) 优化张量计算性能的方法及装置
US8402469B2 (en) Allocating resources for parallel execution of query plans
US8813091B2 (en) Distribution data structures for locality-guided work stealing
CN113535363A (zh) 任务调用方法、装置、电子设备及存储介质
US11630986B2 (en) Graph conversion method
Kaya et al. Iterative-improvement-based heuristics for adaptive scheduling of tasks sharing files on heterogeneous master-slave environments
JP2010244435A (ja) キャッシュ制御装置及びキャッシュ制御方法
JP6614632B2 (ja) ビットを選択する所定位置を変更することでハッシュ関数を1つ以上生成することが可能なハッシュ値を計算する方法、並びに、その為のコンピュータ及びコンピュータ・プログラム
US11138291B2 (en) Assymetric allocation of SRAM and data layout for efficient matrix multiplication
CN111459464B (zh) 节点融合方法、代码生成方法、装置
CN116501503B (zh) 负载任务的架构映射方法、装置、计算机设备及介质
Simhadri Program-centric cost models for locality and parallelism
CN115878332B (zh) 深度学习网络中的内存资源分配方法、装置、设备及介质
Mirsadeghi et al. PTRAM: A parallel topology-and routing-aware mapping framework for large-scale HPC systems
US11080606B2 (en) Parallelization techniques for variable selection and predictive models generation and its applications
Pilla Topology-aware load balancing for performance portability over parallel high performance systems
Langguth et al. Heterogeneous CPU-GPU computing for the finite volume method on 3D unstructured meshes
Jeannot Process mapping on any topology with TopoMatch
Odendahl et al. Optimized buffer allocation in multicore platforms
CN116719643B (zh) 一种优化三级缓存访问延迟的多核处理器调度方法及装置
Alasmar et al. Workload distribution on heterogeneous platforms
US20230129676A1 (en) Compiler, generation method, chip, and execution method
US20220276642A1 (en) Allocation device, learning device, inference device, allocation method, and non-transitory computer readable medium
CN114637576A (zh) 用于生成容器分配方案的方法及装置
KR101669555B1 (ko) 어플리케이션에 자원을 할당하는 장치 및 방법

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant