CN116523023A - 算子融合方法及装置、电子设备与存储介质 - Google Patents
算子融合方法及装置、电子设备与存储介质 Download PDFInfo
- Publication number
- CN116523023A CN116523023A CN202310574701.5A CN202310574701A CN116523023A CN 116523023 A CN116523023 A CN 116523023A CN 202310574701 A CN202310574701 A CN 202310574701A CN 116523023 A CN116523023 A CN 116523023A
- Authority
- CN
- China
- Prior art keywords
- operator
- function
- fusion
- intermediate representation
- representation
- 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.)
- Pending
Links
- 238000007500 overflow downdraw method Methods 0.000 title claims abstract description 65
- 230000004927 fusion Effects 0.000 claims abstract description 175
- 230000006870 function Effects 0.000 claims description 342
- 238000000034 method Methods 0.000 claims description 23
- 238000004590 computer program Methods 0.000 claims description 13
- 230000004044 response Effects 0.000 claims description 6
- 239000000872 buffer Substances 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 17
- 238000013135 deep learning Methods 0.000 description 14
- 230000008569 process Effects 0.000 description 12
- 238000012545 processing Methods 0.000 description 9
- 238000013528 artificial neural network Methods 0.000 description 8
- 238000005457 optimization Methods 0.000 description 8
- 238000004364 calculation method Methods 0.000 description 7
- YLZOPXRUQYQQID-UHFFFAOYSA-N 3-(2,4,6,7-tetrahydrotriazolo[4,5-c]pyridin-5-yl)-1-[4-[2-[[3-(trifluoromethoxy)phenyl]methylamino]pyrimidin-5-yl]piperazin-1-yl]propan-1-one Chemical compound N1N=NC=2CN(CCC=21)CCC(=O)N1CCN(CC1)C=1C=NC(=NC=1)NCC1=CC(=CC=C1)OC(F)(F)F YLZOPXRUQYQQID-UHFFFAOYSA-N 0.000 description 6
- 238000004422 calculation algorithm Methods 0.000 description 6
- VZSRBBMJRBPUNF-UHFFFAOYSA-N 2-(2,3-dihydro-1H-inden-2-ylamino)-N-[3-oxo-3-(2,4,6,7-tetrahydrotriazolo[4,5-c]pyridin-5-yl)propyl]pyrimidine-5-carboxamide Chemical compound C1C(CC2=CC=CC=C12)NC1=NC=C(C=N1)C(=O)NCCC(N1CC2=C(CC1)NN=N2)=O VZSRBBMJRBPUNF-UHFFFAOYSA-N 0.000 description 4
- 238000013468 resource allocation Methods 0.000 description 4
- AFCARXCZXQIEQB-UHFFFAOYSA-N N-[3-oxo-3-(2,4,6,7-tetrahydrotriazolo[4,5-c]pyridin-5-yl)propyl]-2-[[3-(trifluoromethoxy)phenyl]methylamino]pyrimidine-5-carboxamide Chemical compound O=C(CCNC(=O)C=1C=NC(=NC=1)NCC1=CC(=CC=C1)OC(F)(F)F)N1CC2=C(CC1)NN=N2 AFCARXCZXQIEQB-UHFFFAOYSA-N 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000005094 computer simulation Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000008030 elimination Effects 0.000 description 2
- 238000003379 elimination reaction Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000007499 fusion processing Methods 0.000 description 2
- 238000003062 neural network model Methods 0.000 description 2
- 238000010606 normalization Methods 0.000 description 2
- 238000011176 pooling Methods 0.000 description 2
- 238000012549 training Methods 0.000 description 2
- 230000004913 activation Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000007480 spreading Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- General Health & Medical Sciences (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Computational Linguistics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Artificial Intelligence (AREA)
- Neurology (AREA)
- User Interface Of Digital Computer (AREA)
Abstract
一种算子融合方法及装置、电子设备与存储介质。该算子融合方法包括:将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在目标核函数中第一算子和第二算子通过设备函数方式被调用;获得对应于至少一个第一算子的第一中间表示;获得对应于至少一个第二算子的第二中间表示;基于第一中间表示和第二中间表示,将至少一个第一算子和至少一个第二算子进行融合,以得到融合后的目标核函数。该算子融合方法可以支持任意图拓扑、不同类别、不同实现方式(自动生成或手写)的算子融合,从而大大减少了核函数启动、中间临时缓冲器、数据搬移等计算资源的开销,提高了计算效率,提升了硬件性能。
Description
技术领域
本公开的实施例涉及一种算子融合方法及装置、电子设备与存储介质。
背景技术
在人工智能(Artificial Intelligence,AI)领域,深度神经网络(Deep NeuralNetwork,DNN)已经成为最先进技术的基础和许多应用的核心推动力。随着深度学习的应用场景的不断泛化,深度学习计算任务也需要部署在深度神经网络上。由于深度学习网络层数深,结构复杂,生成的算子数量众多,带来了巨大的计算资源和时间的消耗。
算子融合(operator fusion)是一种提高深度学习计算任务的执行效率的方法;在执行计算任务之前,可以将神经网络中满足一定条件或规则的多个算子进行融合,形成经融合的算子(fused operator)。通过将多个算子进行融合,可以实现内存复用,并提高诸如中央处理器(Central Processing Unit,CPU)、图形处理器(Graphics ProcessingUnit,GPU)、编译器、寄存器等计算资源的利用率。
发明内容
本公开至少一实施例提供一种算子融合方法,该算子融合方法包括:将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在所述目标核函数中所述至少一个第一算子和所述至少一个第二算子通过设备函数方式被调用;获得对应于所述至少一个第一算子的第一中间表示;获得对应于所述至少一个第二算子的第二中间表示;基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到融合后的目标核函数,其中,所述设备函数为所述目标核函数的子函数。
例如,在本公开至少一实施例提供的算子融合方法中,所述至少一个第一算子包括融合算子、非融合算子或手写算子,所述非融合算子包括自动生成算子。
例如,在本公开至少一实施例提供的算子融合方法中,所述至少一个第二算子包括融合算子、非融合算子或手写算子,所述非融合算子包括自动生成算子。
例如,在本公开至少一实施例提供的算子融合方法中,响应于所述至少一个第一算子包括融合算子,在将对应于所述至少一个第一算子的第一图层表示和对应于所述至少一个第二算子的第二图层表示写入所述目标核函数之前,所述方法还包括:通过模式匹配的方式将至少一个第三算子进行第一级融合,得到所述至少一个第一算子,其中,所述至少一个第三算子包括自动生成算子。
例如,在本公开至少一实施例提供的算子融合方法中,将对应于所述至少一个第一算子的第一图层表示和对应于所述至少一个第二算子的第二图层表示写入所述目标核函数,包括:改写所述第一图层表示,以通过所述设备函数方式调用所述至少一个第一算子;改写所述第二图层表示,以通过所述设备函数方式调用所述至少一个第二算子;在所述目标核函数中调用所述至少一个第一算子对应的第一设备函数和所述至少一个第二算子对应的第二设备函数,并通过内联函数方式将所述至少一个第一算子和所述至少一个第二算子进行第二级融合。
例如,在本公开至少一实施例提供的算子融合方法中,在所述目标核函数中调用所述至少一个第二算子对应的第二设备函数之前,所述方法还包括:对所述至少一个第二算子进行第一函数声明。
例如,在本公开至少一实施例提供的算子融合方法中,所述第二设备函数的输入包括所述第一设备函数的至少一个输出,或者,所述第一设备函数的至少一个输入包括所述第二设备函数的输出。
例如,在本公开至少一实施例提供的算子融合方法中,获得对应于所述至少一个第一算子的第一中间表示,包括:将所述第一设备函数汇编为所述第一中间表示。
例如,在本公开至少一实施例提供的算子融合方法中,获得对应于所述至少一个第二算子的第二中间表示,包括:将所述第二设备函数汇编为所述第二中间表示。
例如,在本公开至少一实施例提供的算子融合方法中,将所述第二设备函数汇编为所述第二中间表示,包括:设置所述第二设备函数的属性,使其可以进行函数内联;对所述至少一个第二算子进行第二函数声明和第二函数调用,得到所述第二中间表示。
例如,在本公开至少一实施例提供的算子融合方法中,基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到所述融合后的目标核函数,包括:改写所述第二中间表示;将改写后的第二中间表示通过内联函数方式加入到所述第一中间表示中,以得到所述融合后的目标核函数,以对所述至少一个第一算子和所述至少一个第二算子进行第三级融合。
例如,在本公开至少一实施例提供的算子融合方法中,改写所述第二中间表示,包括:对所述第二中间表示进行链接,以将所述第二中间表示中对所述至少一个第二算子的第二函数声明替换为函数定义;对所述链接后的第二中间表示进行函数内联,以将所述第二中间表示中对所述至少一个第二算子的第二函数调用内联为对应的函数实现。
本公开至少一实施例还提供一种算子融合装置,该算子融合装置包括:写入模块,配置为将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在所述目标核函数中所述至少一个第一算子和所述至少一个第二算子通过设备函数方式被调用;获得模块,配置为获得对应于所述至少一个第一算子的第一中间表示,以及获得对应于所述至少一个第二算子的第二中间表示;融合模块,配置为基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到融合后的目标核函数。
例如,在本公开至少一实施例提供的算子融合装置中,响应于所述至少一个第一算子包括融合算子,所述融合模块还配置为,通过模式匹配的方式将至少一个第三算子进行第一级融合,得到所述至少一个第一算子,其中,所述至少一个第三算子包括自动生成算子。
例如,在本公开至少一实施例提供的算子融合装置中,所述写入模块还配置为:改写所述第一图层表示,以通过所述设备函数方式调用所述至少一个第一算子;改写所述第二图层表示,以通过所述设备函数方式调用所述至少一个第二算子;在所述目标核函数中调用所述至少一个第一算子对应的第一设备函数和所述至少一个第二算子对应的第二设备函数,以将所述至少一个第一算子和所述至少一个第二算子进行第二级融合。
例如,在本公开至少一实施例提供的算子融合装置中,所述融合模块还配置为:改写所述第二中间表示;将改写后的第二中间表示通过内联函数方式加入到所述第一中间表示中,以得到所述融合后的目标核函数,以对所述至少一个第一算子和所述至少一个第二算子进行第三级融合。
本公开至少一实施例还提供一种电子设备。该电子设备包括:处理器;存储器,包括一个或多个计算机程序模块;其中,所述一个或多个计算机程序模块被存储在所述存储器中并被配置为由所述处理器执行,所述一个或多个计算机程序模块用于实现本公开任一实施例提供的算子融合方法。
本公开至少一实施例还提供一种存储介质,存储有非暂时性计算机可读指令,当所述非暂时性计算机可读指令由计算机执行时实现本公开任一实施例提供的算子融合方法。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
图1为一种算子融合方式的示意图;
图2为本公开至少一实施例提供的算子融合方法的示例性流程图;
图3为本公开至少一实施例提供的算子融合方法的一个示例的示意图;
图4为图2中步骤S10的一个示例的示例性流程图;
图5为本公开至少一实施例提供的算子融合方法的另一个示例的示意图;
图6为图2中步骤S40的一个示例的示例性流程图;
图7为本公开至少一实施例提供的算子融合方法的又一个示例的示意图;
图8为本公开至少一实施例提供的算子融合方法的另一示例性流程图;
图9为本公开的至少一实施例提供的算子融合装置的示意框图;
图10为本公开的至少一实施例提供的一种电子设备的示意框图;
图11为本公开的至少一实施例提供的另一种电子设备的示意框图;以及
图12为本公开的至少一实施例提供的一种存储介质的示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“一个”、“一”或者“该”等类似词语也不表示数量限制,而是表示存在至少一个。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
下面通过几个具体的实施例对本公开进行说明。为了保持本公开实施例的以下说明清楚且简明,可省略已知功能和已知部件的详细说明。当本公开实施例的任一部件在一个以上的附图中出现时,该部件在每个附图中由相同或类似的参考标号表示。
深度学习计算任务由多个计算单元组成,每个计算单元可以被称为算子(Operator,Op)。在神经网络模型中,算子对应层或节点的计算逻辑。例如,卷积层(Convolution Layer)中的卷积计算任务可以是一个算子;全连接层(Fully-connectedLayer,FC layer)中的权值求和计算任务也可以是一个算子。在具体实施神经网络时,算子可以通过软件的方式实现(例如通过计算机程序实现),也可以通过硬件的方式实现(例如通过电路实现)。
深度学习计算任务需要部署在不同的计算设备和硬件架构上,同时实际部署或训练场景对性能往往也有着更为激进的要求,例如针对硬件特点定制计算代码。这些需求在通用AI框架中已经难已得到满足。使用AI编译器进行深度学习计算任务的编译与优化可以满足计算任务实际部署或训练场景对硬件性能的需求。AI编译器将当前的深度学习计算任务通过一层或多层中间表示(Intermediate Representation,IR)进行翻译和优化,最终转化成目标硬件上的可执行文件的过程。例如,具体地,AI编译器的前端主要是基于图层中间表示(Graph IR)进行操作,图层IR将编译过程的知识/信息保存在图中,对应的算子通过对图中的对象(节点、边、列表和树)操作来描述。进一步地,可以将图层IR向下展开到AI编译器的中端,图层IR对应的算子可以被实现为张量中间表示(Tensor IR);也即是,可以将图层IR转换为较为接近目标硬件可执行代码的张量IR。进一步地,将张量IR向下展开到AI编译器的后端,张量IR对应的算子可以被实现为低级别虚拟机中间表示(Low Level VirtualMachine,LLVM IR);AI编译器的后端对LLVM IR进行优化,可以生成可部署在目标硬件上执行的可执行文件。
由于深度学习计算任务在AI框架中往往以DSL(Domain Specific Language)的方式进行编程和表达,这本身使得深度学习计算任务的优化和执行天然符合传统计算机语言的编译和优化过程。AI编译器可以自动生成算子来完成计算任务,但是在有些场景下,自动生成的算子可能达不到手写算子的极致性能。因此,AI编译器也会通过调用算子库(例如cudnn、mkldnn等)或直接调用编程者编写的算子等方式另外调用手写算子,从而实现复杂的计算任务。
为了提高计算效率,AI编译器的优化会用到算子融合技术;算子融合主要发生在图层,核函数(Kernel)层也会借鉴算子融合的策略,提供融合后的算子给AI框架。例如,图层级别的算子融合技术是通过模式匹配的方式来决策子图的融合,模式匹配的规则是根据融合算子代码生成是否支持来决定。但是,模式匹配的方式仅能够进行自动生成算子的融合;AI编译器调用算子库等手写算子时,手写算子需要通过单独的一个核函数调起,也即是,模式匹配不支持手写算子与自动生成算子的融合。
此外,模式匹配的方式支持的融合模式也比较有限,也即模式匹配也不支持某些类别的自动生成算子之间的融合。例如,在采用模式匹配的方式进行算子融合时,首先需要定义融合模式(即,定义要进行融合的目标算子),然后才能适配对应融合模式的融合算法。例如,自动生成算子包括不同的类别,比如复杂算子类(如conv算子、relu算子等)、reduce类(如reduce_add算子等)、broadcast类(如broadcast_add算子等)、elementwise类(如elementwise_add算子等);在上述4种示例类别中,可以匹配得到3种融合模式:boadcast类与elementwise类的算子可以进行模式匹配融合,复杂算子类与boadcast类、elementwise类的算子可以进行模式匹配融合,reduce类与boadcast类、elementwise类的算子可以进行模式匹配融合;对于上述4种示例类别,模式匹配可能不支持除以上3种融合模式之外的其他融合模式。
例如,对于功能结构较为复杂的神经网络模型,可能需要定义十几种甚至几十种融合模式;另外,当运行神经网络的硬件平台发生改变时,融合模式也将随之改变,而融合模式的变化也导致需要重新制定并编译相应的融合算法,从而使得算子融合步骤需要占用较多的计算资源以及调试成本。
图1为一种算子融合方式的示意图。
例如,如图1所示,在示例1-1中,算子A、算子C、算子D和算子E为自动生成算子,算子B为手写算子;算子A的输出是算子B的输入,算子B的输出是算子C的输入,算子C的输出是算子D的输入,算子D的输出是算子E的输入。由于模式匹配不支持自动生成算子(A、C、D或E)和手写算子B的融合,在模式匹配融合之后,算子A和算子B分别独立为一组;由于算子C和算子D的类别属于可以进行模式匹配的融合模式,但算子E与算子C、D的类别不属于可以进行模式匹配的融合模式。在模式匹配融合之后,如图1用于算子分组的虚线所示,算子C和算子D被融合为一组,算子E独立为一组。因此,示例1-1中的模式匹配融合无法实现算子A-E的完全融合。
例如,如图1所示,在示例1-2中,算子A、算子C、算子D和算子E为自动生成算子,算子B为手写算子;算子A的输出是算子B、C的输入,算子B、C的输出是算子D的输入,算子D的输出是算子E的输入。由于模式匹配不支持自动生成算子(A、C、D或E)和手写算子B的融合,并且算子A的输出需要同时输入算子B和C(即算子A和C不能模式匹配融合),以及算子B和C的输出需要同时输入算子D(即算子C和D不能模式匹配融合),在模式匹配融合之后,如图1用于算子分组的虚线所示,仅算子D和算子E被融合为一组,算子A、算子B和算子C分别独立为一组。因此,示例1-2中的模式匹配融合也无法实现算子A-E的完全融合。
本公开至少一实施例提供一种算子融合方法,该算子融合方法包括:将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在目标核函数中第一算子和第二算子通过设备函数方式被调用;获得对应于至少一个第一算子的第一中间表示;获得对应于至少一个第二算子的第二中间表示;基于第一中间表示和第二中间表示,将至少一个第一算子和至少一个第二算子进行融合,以得到融合后的目标核函数。
本公开的至少一实施例还提供一种算子融合装置、电子设备与存储介质,用于实现上述实施例的算子融合方法。
本公开至少一实施例提供的方法、装置、电子设备以及存储介质,通过在目标核函数中调用设备函数并结合中间表示的形式将第一算子和第二算子进行融合,可以支持任意图拓扑、不同类别、不同实现方式(自动生成或手写)的算子融合,从而大大减少了核函数启动(kernel launch)、中间临时缓冲器(buffer)、数据搬移等计算资源的开销,提高了计算效率,提升了AI编译器等硬件性能。
下面,将参考附图详细地说明本公开至少一实施例。应当注意的是,不同的附图中相同的附图标记将用于指代已描述的相同的元件。
图2为本公开至少一实施例提供的算子融合方法的示例性流程图。
例如,如图2所示,本公开至少一实施例提供了一种算子融合方法,该方法可以包括以下步骤S10~S40。
步骤S10:将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数;
步骤S20:获得对应于至少一个第一算子的第一中间表示;
步骤S30:获得对应于至少一个第二算子的第二中间表示;
步骤S40:基于第一中间表示和第二中间表示,将至少一个第一算子和至少一个第二算子进行融合,以得到融合后的目标核函数。
例如,对应于不同类型的深度学习计算模型或者同一计算模型的不同执行过程,第一算子或第二算子可以包括不同的类型;算子的类型例如可以包括深度学习网络Resnet、Bert与Yolo网络拆解后的算子类型,例如张量类、向量类或标量类等。例如,张量类型的算子可以用于执行卷积算法、批量标准化(Batch Normalization,BN)算法、池化(Pooling)算法;向量类型的算子可以用于执行矩阵乘法运算;标量类型的算子可以用于执行激活函数、交叉熵、损失函数等算法,本公开的实施例对此不作限制。
例如,在步骤S10中,第一算子的数量可以是一个或多个,例如可以包括融合算子、非融合算子或手写算子,非融合算子可以包括自动生成算子;第二算子的数量可以是一个或多个,例如可以包括融合算子、非融合算子或手写算子,非融合算子可以包括自动生成算子。例如,第一算子和第二算子分别对应有可以用于执行具体运算的核函数(kernel);该核函数对应的源程序可以通过计算机语言编写,例如通过高级语言、汇编语言或机器语言编写,本公开的实施例对此不作限制。在一些示例中,第一算子和第二算子分别对应的核函数由AI编译器处理、生成;而且CPU调用AI编译器生成的核函数并将核函数和输入数据提供至设备端,然后由设备端执行核函数以处理输入数据;CPU再控制设备端将处理结果复制回主机端,从而完成计算任务。
在一些示例中,响应于至少一个第一算子包括融合算子,在步骤S10之前,该算子融合方法还可以包括:通过模式匹配的方式将至少一个第三算子进行第一级融合,得到该至少一个第一算子。例如,第三算子的数量可以为一个或多个,例如可以包括自动生成算子。
例如,该第一级融合可以为例如图1所示的模式匹配融合,第三算子例如包括算子A、算子C、算子D和算子E,第二算子例如包括算子B。以图1的示例1-1为例,算子A、算子C、算子D和算子E为自动生成算子,算子B为手写算子。例如,通过模式匹配的方式将算子A、算子C、算子D和算子E进行第一级融合,所得到的第一算子包括算子A、算子C+D和算子E,其中,算子C+D为融合算子,算子A和算子E为非融合算子。以图1的示例1-2为例,通过模式匹配的方式将算子A、算子C、算子D和算子E进行第一级融合,所得到的第一算子包括算子A、算子C和算子D+E,其中,算子D+E为融合算子,算子A和算子C为非融合算子。具体的模式匹配融合过程详见图1的描述,在此不再赘述。
需要说明的是,第一算子、第二算子和第三算子也可以根据实际需要选择其他的类型,本公开的实施例对此不作限制。
例如,在步骤S10中,在目标核函数中第一算子和第二算子通过设备函数(devicefunction)方式被调用。在一些示例中,设备函数为目标核函数的子函数。例如,第一图层表示和第二图层表示被写入目标核函数之后,其在目标核函数中作为子函数被调用;第一图层表示和第二图层表示被向下汇编到张量层级别之后,所得到的张量层级别的设备函数(例如张量IR)在目标核函数中作为子函数被调用。
例如,第一图层表示和第二图层表示属于图层级别的中间表示(即图层IR);在被写入目标核函数后,第一图层表示和第二图层表示分别从图层级别向下汇编为张量层级别的中间表示(即张量IR)。例如,第一算子和第二算子所对应的张量IR在目标核函数中作为张量层级别的设备函数被调用。例如,第一算子所对应的张量IR为第一设备函数,第二算子所对应的张量IR为第二设备函数;在步骤S10中,通过在目标核函数中调用第一设备函数和第二设备函数,实现第一算子和第二算子的第二级融合。
例如,在步骤S20和步骤S30中,将第一设备函数和第二设备函数分别从张量层级别向下汇编为LLVM IR。在一些示例中,步骤S20包括将第一设备函数汇编为第一中间表示,步骤S30包括将第二设备函数汇编为第二中间表示,其中,第一中间表示和第二中间表示均为LLVM IR。
例如,在步骤S40中,在LLVM IR级别对第一中间表示和第二中间表示进一步改写和融合,实现第一算子和第二算子的第三级融合,以得到融合后的目标核函数;也即是,通过上述第一级融合(例如,图层IR的融合)、第二级融合(例如,张量IR的融合)和第三级融合(例如,LLVM IR的融合),实现了第一算子和第二算子的融合,从而可以得到融合算子。
在本公开至少一实施例提供的算子融合方法中,步骤S10~步骤S40对第一算子和第二算子的融合操作均是在一个目标核函数中实现的,不需要在目标核函数外部进行额外的编译,并且整个计算过程的各个中间结果可以写在寄存器或其他共享存储器(sharedmemory)上,从而大大节省了计算资源,并且提高了计算效率。
在一些示例中,进一步地,可以对融合后的目标核函数再进行优化(例如llvmpass优化),并且进行硬件资源分配,从而生成可部署在目标硬件上执行的可执行文件(例如,机器可执行代码)。进一步地,运行生成的可执行文件的过程中,即在程序运行(runtime)过程中,第一算子对应的核函数与第二算子对应的核函数共享相同的内存地址(例如usharp ID),通过进行相应的数据读写,可以最终得到融合算子的运行结果。
本公开至少一实施例提供的算子融合方法,相比图层级别的模式匹配的算子融合方式,还能够进一步在比图层级别更低的级别,例如张量层级别、LLVM IR级别,进行算子融合,从而可以实现不同类别、不同实现方式的算子融合。例如,当第一算子为融合后的或非融合后的自动生成算子,第二算子为手写算子时,经过步骤S10~S40的操作,可以实现手写算子和自动生成算子的融合;或者,当第一算子或第二算子包括不同的类别的算子时,经过步骤S10~S40的操作,可以实现不同类别算子的融合。
需要说明的是,第一算子和第二算子对应的图层表示、设备函数、中间表示等不限于图层IR、张量IR和LLVM IR,也可以根据实际需要选择其他的具体实现形式,本公开的实施例对此不作限制。
图3为本公开至少一实施例提供的算子融合方法的一个示例的示意图。例如,图3为图2所示的算子融合方法的一个具体示例。
例如,如图3所示,示例2-1对应图1的示例1-1,示例2-2对应图1的示例1-2,即算子A、算子C、算子D和算子E为自动生成算子,算子B为手写算子,算子的图拓扑类型(即算子之间的输入输出关系等)也与图1中的示例一致,在此不再赘述。
例如,示例2-1和示例2-2中的第一级融合可以为图1中的模式匹配融合,第一级融合后可以得到如图3所示的多个分组:对于示例2-1,融合算子C+D,非融合算子A、E均为第一算子,手写算子B为第二算子;对于示例2-2,融合算子D+E,非融合算子A、C均为第一算子,手写算子B为第二算子。
例如,如图3所示,在图2的步骤S10中,将分别对应于3个第一算子(示例2-1中的C+D、A、E,或者示例2-2中的D+E、A、C)的3个第一图层表示和对应于第二算子B的第二图层表示写入目标核函数;通过在目标核函数中调用分别对应于第一算子和第二算子的第一设备函数和第二设备函数,实现第一算子和第二算子的第二级融合。在图2的步骤S20和步骤S30中,第一设备函数和第二设备函数分别向下汇编为第一中间表示和第二中间表示。在图2的步骤S40中,基于第一中间表示和第二中间表示,实现第一算子和第二算子的第三级融合,以得到融合后的目标核函数。
例如,在示例2-1中,即使算子(A、C、D或E)为自动生成算子而算子B为手写算子,并且算子E与算子C、D的类别不属于可以进行模式匹配的融合模式,经过步骤S10~S40的操作,也可以实现算子A-E的完全融合。
例如,在示例2-2中,即使算子(A、C、D或E)为自动生成算子而算子B为手写算子,并且算子之间存在无法进行模式匹配融合的输入输出关系,经过步骤S10~S40的操作,也可以实现算子A-E的完全融合。
需要说明的是,如图3所示算子A-E的第一级融合、第二级融合和第三级融合方式仅为一个示例,本公开的实施例对算子的数量和种类、算子图拓扑的类型、具体融合方式(例如,可以跳过第一级融合,直接进行第二级融合和第三级融合)等均不作限制。
本公开至少一实施例提供的算子融合方法,通过在目标核函数中调用设备函数并结合中间表示的形式将第一算子和第二算子进行融合,可以支持任意图拓扑、不同类别、不同实现方式(自动生成或手写)的算子融合,从而大大减少了核函数启动、中间临时缓冲器、数据搬移等计算资源的开销,提高了计算效率,提升了AI编译器等硬件性能。
图4为图2中步骤S10的一个示例的示例性流程图。
例如,如图4所示,图2中步骤S10可以进一步包括以下步骤S101~S103:
步骤S101:改写第一图层表示,以通过设备函数方式调用至少一个第一算子;
步骤S102:改写第二图层表示,以通过设备函数方式调用至少一个第二算子;
步骤S103:在目标核函数中调用至少一个第一算子对应的第一设备函数和至少一个第二算子对应的第二设备函数,并通过内联函数方式将至少一个第一算子和至少一个第二算子进行第二级融合。
例如,在步骤S101和步骤S102中,将第一图层表示和第二图层表示从图层向下汇编为张量IR,目标核函数可以通过设备函数方式调用第一算子和第二算子;在步骤S103中,在目标核函数中调用第一设备函数和第二设备函数时,可以通过内联函数(functioninline)方式实现第二级融合。例如,内联函数(有时也称作在线函数或编译时期展开函数)作为一种编程语言结构,用来建议AI编译器对一些目标函数进行内联扩展(或在线扩展),也就是建议编译器将目标函数的函数体插入并取代每一处调用该目标函数的上下文,从而节省每次调用该目标函数带来的额外开销,本公开的实施例对内联函数的具体形式不作限制。
例如,在目标核函数中调用第一设备函数和第二设备函数时,第二设备函数的输入可以包括第一设备函数的至少一个输出,或者,第一设备函数的至少一个输入可以包括第二设备函数的至少一个输出,从而实现至少一个第一算子和至少一个第二算子的第二级融合。
在一些示例中,在目标核函数中调用第二算子对应的第二设备函数之前,本公开至少一实施例提供的算子融合方法进一步包括:对至少一个第二算子进行第一函数声明。例如,当第二算子为手写算子时,自动生成的代码中不包含手写算子的代码,需要从外部调用第二算子对应的核函数,以将其与第一算子(即自动生成算子)进行融合。从外部调用第二算子对应的核函数时,首先要对第二算子对应的核函数进行外部函数声明(例如称为第一函数声明),然后在目标核函数的特定位置进行外部函数的调用(例如称为第一函数调用),从而实现对第二设备函数的调用。
图5为本公开至少一实施例提供的算子融合方法的另一个示例的示意图。例如,图5为图4所示的算子融合方法的一个具体示例。
例如,如图5所示,以图3中的示例2-2为例,在图4的步骤S101和步骤S102中,将第一算子A、C、D+E的第一图层表示向下汇编为第一设备函数,将第二算子B的第二图层表示向下汇编为第二设备函数,得到的目标核函数为fused_kernel();在目标核函数fused_kernel()中,调用第一设备函数fused_A()、fused_C()和fused_D_E()以及调用第二设备函数fused_B()。
例如,如图5所示,目标核函数fused_kernel()的输入为input_tensor;由于第二算子B为手写算子,在目标核函数中,首先需要对第二算子B进行第一函数声明,即func_extern_B_decl(arg_out,arg_in),arg_out部分为第二设备函数的输出,arg_in部分为第二设备函数的输入。进一步地,调用第一设备函数fused_A(),将input_tensor输入算子A;然后对第二算子B进行第一函数调用,即Call_extern_B(B_out,A_out),并将第一设备函数fused_A()的输出A_out作为第二设备函数fused_B()的输入,得到第二设备函数fused_B()的输出B_out;然后调用第一设备函数fused_C(),并将第一设备函数fused_A()的输出A_out作为第一设备函数fused_C()的输入。进一步地,调用第一设备函数fused_D_E(),并将第一设备函数fused_C()的输出C_out和第二设备函数fused_B()的输出B_out作为第一设备函数fused_D_E()的输入,得到第一设备函数fused_D_E()的输出DE_out,从而实现了融合算子代码的自动生成,以及实现了算子A-E的第二级融合。
例如,如图5所示,在目标核函数fused_kernel()中调用多个第一设备函数和第二设备函数的过程中,较多地采用了内联函数的方式(例如,compute inline、compute at等),内联函数的具体实现方式可参考本领域的描述,在此不再赘述。
在一些示例中,图2中步骤S20可以进一步包括:将第一设备函数汇编为第一中间表示,图2中步骤S30可以进一步包括:将第二设备函数汇编为第二中间表示,也即是,第一设备函数和第二设备函数分别从张量层向下汇编为LLVM IR。
在一些示例中,当第二算子为手写算子时,需要从外部调用第二算子对应的核函数来得到第二设备函数,也即第二设备函数包括外部函数的属性,无法如同自动生成算子对应的设备函数可以在LLVM IR级别进行函数内联(function inline)。因此,在将第二设备函数汇编为第二中间表示的过程中,需要首先设置第二设备函数的属性(attribute),使其可以进行函数内联,例如,可以设置第二设备函数的属性为强制内联(always inline)等,本公开的实施例对此不作限制;进一步地,在LLVM IR级别,同样需要对第二算子进行第二函数声明和第二函数调用,以将外部函数内联到对应的LLVM IR中,从而得到第二中间表示。
图6为图2中步骤S40的一个示例的示例性流程图。
例如,如图6所示,图2中步骤S40可以进一步包括以下步骤S401~S402:
步骤S401:改写第二中间表示;
步骤S402:将改写后的第二中间表示通过内联函数方式加入到第一中间表示中,以得到融合后的目标核函数,以对至少一个第一算子和至少一个第二算子进行第三级融合。
在一些示例中,步骤S401可以包括:对第二中间表示进行链接,以将第二中间表示中对第二算子的第二函数声明替换为函数定义;对链接后的第二中间表示进行函数内联,以将第二中间表示中对第二算子的第二函数调用内联为对应的函数实现。
例如,由于当第二算子为手写算子时需要从外部调用第二算子对应的核函数,在LLVM IR级别对第二算子进行了第二函数声明和第二函数调用,初步生成的第二中间表示中存在一些关于外部函数定义、调用等步骤的冗余代码。因此,在步骤S401中,首先对第二中间表示进行链接(llvm-link),将代码中的第二函数声明替换为对应的函数定义;然后对链接后的第二中间表示进行函数内联(function inline),将代码中的第二函数调用内联为对应的函数实现。具体地,llvm-link和function inline可以用以下伪代码(1)~(3)简单地示意:
(1)
Func A(int a,int b)//需要llvm-link的部分
Func B(int a,int b){
A(a,b);
}
(2)
//llvm-link(1)后变为:
Func A(int a,int b){b=a;}
Func B(int a,int b){
A(a,b);//需要function inline的部分
}
(3)
//function inline(2)后变为:
Func A(int a,int b){b=a;}
Func B(int a,int b){
b=a;
}
例如,由以上伪代码(1)~(3)可知,对代码(1)进行链接(llvm-link)后,第二函数声明Func A(int a,int b)被替换为对应的函数定义Func A(int a,int b){b=a;};对代码(2)进行函数内联(function inline)后,第二函数调用A(a,b)被内联为对应的函数实现b=a。
需要说明的是,以上伪代码(1)~(3)仅是用于解释链接(llvm-link)和函数内联(function inline)的一个示例,在本公开至少一实施例提供的算子融合方法中,链接和函数内联的具体代码需要根据实际需要进行设置,本公开的实施例对此不作限制。
需要说明的是,链接和函数内联仅为对第二中间表示进行改写的2个示例性方式,还可以根据实际需要选择其他的改写方式,本公开的实施例对此不作限制。
例如,在步骤S402中,将进行链接、函数内联等改写后的第二中间表示通过内联函数方式(包括不限于compute inline、compute at、function inline等)加入到第一中间表示中,以得到融合后的LLVM IR级别的目标核函数,从而实现了至少一个第一算子和至少一个第二算子的第三级融合。
图7为本公开至少一实施例提供的算子融合方法的又一个示例的示意图。例如,图7为图6所示的算子融合方法的一个具体示例。
例如,如图7所示,以图3中的示例2-2为例,对于算子A~E,图7左侧为张量层级别的目标核函数fused_kernel(),该目标核函数包括对应于第一算子A、C、D+E的第一设备函数fused_A()、fused_C()和fused_D_E()以及对应于第二算子B的第二设备函数fused_B();将张量层级别的目标核函数向下汇编得到LLVM IR级别的目标核函数fused_kernel(),该目标核函数包括对应于第一算子A、C、D+E的第一中间表示LLVM IR以及对应于第二算子B的第二中间表示LLVM IR。例如,由于第二算子B是手写算子,需要从外部调用第二算子对应的核函数,第二算子B的第二中间表示可以是通过图6中步骤S401进行改写后的第二中间表示。
例如,如图7所示,在图6的步骤S401中,首先对第二算子B的第二中间表示LLVMIR,进行链接(llvm-link),将代码中的第二函数声明替换为对应的函数定义;然后对链接后的第二算子B的第二中间表示进行函数内联(function inline),将代码中的第二函数调用内联为对应的函数实现。
例如,如图7所示,在图6的步骤S402中,将改写后的第二算子B的第二中间表示通过内联函数方式加入到第一算子A、C、D+E的第一中间表示中,以得到融合后的LLVM IR级别的目标核函数fused_kernel();在该目标核函数fused_kernel()中,可以调用对应于第一算子A、C、D+E的第一中间表示以及对应于第二算子B的第二中间表示,从而实现了第一算子A、C、D+E和第二算子B的第三级融合。
例如,如图7所示,在LLVM IR级别的目标核函数fused_kernel()中调用多个第一中间表示和第二中间表示的过程中,较多地采用了内联函数的方式(例如,computeinline、compute at等,特别地,对于作为手写算子的第二算子B采用了llvm-link和function inline),内联函数的具体实现方式可参考本领域的描述,在此不再赘述。
图8为本公开至少一实施例提供的算子融合方法的另一示例性流程图。例如,图8为图2所示的算子融合方法的一个具体示例。
例如,如图8所示,以AI编译器对执行深度学习计算任务的源程序进行编译时的算子融合为例,AI编译器首先获取深度学习计算任务的源程序对应的子图拓扑(例如,在神经网络的算子结构图中进行遍历以找到所需的子图拓扑)或神经网络计算模型,然后针对计算模型选择对应的算子,选择的算子例如可以包括第一算子、第二算子或第三算子,其中,第一算子和第三算子可以包括自动生成算子,第二算子可以包括手写算子;进一步地,对第一算子、第二算子或第三算子进行算子注册,在算子注册时识别算子的类别和实现方式(例如,自动生成方式或手写算子等实现方式,以及自动生成算子中的复杂算子类、reduce类、broadcast类elementwise类等类别),然后定义模式匹配的算子融合方式(例如,模式匹配仅支持特定类别算子的融合模式)。
例如,如图8所示,进一步地,如果在算子注册时识别到可以进行模式匹配的算子类别,则可以通过模式匹配的方式将第三算子进行第一级融合,得到第一算子。例如,该第一级融合是在AI编译器的前端基于图层IR进行操作,第一算子所对应的图层IR为第一图层表示,第二算子所对应的图层IR为第二图层表示;该第一级融合可以为例如图1所示的模式匹配融合,具体的模式匹配算子融合过程详见图1~图3中的描述,在此不再赘述。
例如,如图8所示,进一步地,将对应于第一算子的第一图层表示和对应于第二算子的第二图层表示写入目标核函数;将第一图层表示和第二图层表示分别从图层向下展开到AI编译器的中端,图层IR被向下汇编为张量IR,其中,第一算子和第二算子所对应的张量IR在目标核函数中作为设备函数被调用;通过在目标核函数中调用第一设备函数和第二设备函数,实现第一算子和第二算子的第二级融合;也即是,执行图2中的步骤S10。
例如,进一步地,将第一设备函数和第二设备函数分别从张量层级别向下展开到AI编译器的后端,张量IR被向下汇编为LLVM IR,从而获得对应于至少一个第一算子的第一中间表示,以及获得对应于第二算子的第二中间表示;也即是,执行图2中的步骤S20和步骤S30。
例如,如图8所示,进一步地,在LLVM IR级别对第一中间表示和第二中间表示进一步改写和融合,实现第一算子和第二算子的第三级融合,以得到融合后的目标核函数;也即是,执行图2中的步骤S40。
综上,如图8所示,通过上述第一级融合(例如,图层IR的融合)、第二级融合(例如,张量IR的融合)和第三级融合(例如,LLVM IR的融合),实现了第一算子和第二算子的融合,从而得到融合算子。例如,步骤S10~S40的具体实施方式详见前述描述,在此不再赘述。
例如,如图8所示,进一步地,在AI编译器的后端,可以对融合后的LLVM IR级别的目标核函数进行llvm pass优化,并且进行硬件的资源分配,从而生成可部署在目标硬件上执行的可执行文件(例如,机器可执行代码)。例如,llvm pass优化可以包括死代码消除、窥孔优化、请求/存储(load/store)等冗余指令的消除,硬件的资源分配例如包括寄存器等硬件的资源分配;对融合后的目标核函数进行优化的方式不限于llvm pass优化和硬件资源分配,也可以根据实际需要进行其他的选择,本公开的实施例对此不作限制;对融合后的目标核函数进行优化(llvm pass优化、硬件资源分配等)的具体实现方式可参考本领域的描述,在此不再赘述。
例如,如图8所示,进一步地,可以在AI编译器中运行所生成的可执行文件;在程序运行过程中,第一算子对应的核函数与第二算子对应的核函数共享相同的内存地址(例如usharp ID),通过进行相应的数据读写,可以最终得到融合算子的运行结果。
本公开至少一实施例提供的算子融合方法,通过在目标核函数中调用设备函数并结合中间表示的形式将第一算子和第二算子进行融合,可以支持任意图拓扑、不同类别、不同实现方式(自动生成或手写)的算子融合,从而大大减少了核函数启动、中间临时缓冲器、数据搬移等计算资源的开销,提高了计算效率,提升了AI编译器等硬件性能。
图9为本公开的至少一实施例提供的算子融合装置的示意框图。
例如,如图9所示,该算子融合装置200包括写入模块210、获得模块220和融合模块230。
例如,写入模块210配置为,将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数;例如,在目标核函数中第一算子和第二算子通过设备函数方式被调用,在一些示例中,设备函数为目标核函数的子函数。也即是,该写入模块210可以被配置为执行例如图2所示的步骤S10。
例如,获得模块220配置为,获得对应于至少一个第一算子的第一中间表示,以及获得对应于至少一个第二算子的第二中间表示。也即是,该获得模块220可以被配置为执行例如图2所示的步骤S20和步骤S30。
例如,融合模块230配置为,基于第一中间表示和第二中间表示,将至少一个第一算子和至少一个第二算子进行融合,以得到融合后的目标核函数。也即是,该融合模块230可以被配置为执行例如图2所示的步骤S40。
例如,在一些示例中,第一算子的数量可以是一个或多个,第一算子可以包括融合算子、非融合算子或手写算子,非融合算子可以包括自动生成算子;第二算子的数量可以是一个或多个,第二算子可以包括融合算子、非融合算子或手写算子,非融合算子可以包括自动生成算子。
例如,在一些示例中,响应于第一算子包括融合算子,融合模块230还配置为,通过模式匹配的方式将至少一个第三算子进行第一级融合,得到至少一个第一算子。在一些示例中,第三算子的数量可以是一个或多个,第三算子可以包括自动生成算子。
例如,在一些示例中,写入模块210还配置为:改写第一图层表示,以通过设备函数方式调用至少一个第一算子;改写第二图层表示,以通过设备函数方式调用至少一个第二算子;在目标核函数中调用至少一个第一算子对应的第一设备函数和至少一个第二算子对应的第二设备函数,以将至少一个第一算子和至少一个第二算子进行第二级融合。
例如,在一些示例中,在目标核函数中调用第二算子对应的第二设备函数之前,写入模块210还配置为:对至少一个第二算子进行第一函数声明。例如,在一些示例中,第二设备函数的输入包括第一设备函数的至少一个输出,或者,第一设备函数的至少一个输入包括第二设备函数的输出。
例如,在一些示例中,获得模块220还配置为,将第一设备函数汇编为第一中间表示,以及将第二设备函数汇编为第二中间表示。例如,为了将第二设备函数汇编为第二中间表示,获得模块220还可以配置为:设置第二设备函数的属性,使其可以进行函数内联;对至少一个第二算子进行第二函数声明和第二函数调用,得到第二中间表示。
例如,在一些示例中,融合模块230还配置为:改写第二中间表示;将改写后的第二中间表示通过内联函数方式加入到第一中间表示中,以得到融合后的目标核函数,以对至少一个第一算子和至少一个第二算子进行第三级融合。
例如,为了改写第二中间表示,融合模块230还可以配置为:对第二中间表示进行链接,以将第二中间表示中对至少一个第二算子的第二函数声明替换为函数定义;对链接后的第二中间表示进行函数内联,以将第二中间表示中对至少一个第二算子的第二函数调用内联为对应的函数实现。
由于在上述描述例如图2所示的算子融合方法的过程中,已经对上述算子融合装置200的操作所涉及的内容的细节进行了介绍,因此这里为简洁起见不再赘述,相关细节可参照以上关于图2~图8的描述。
需要说明的是,图9所示的算子融合装置200中上述的各个模块可被分别配置为执行特定功能的软件、硬件、固件或上述项的任意组合。例如,这些模块可对应于专用的集成电路,也可对应于纯粹的软件代码,还可对应于软件与硬件相结合的模块。作为示例,参照图9描述的装置可以是PC计算机、平板装置、个人数字助理、智能手机、web应用或其它能够执行程序指令的装置,但不限于此。
另外,尽管以上在描述算子融合装置200时将其划分为用于分别执行相应处理的模块,然而,本领域技术人员清楚的是,各模块执行的处理也可以在装置中不进行任何具体模块划分或者各模块之间并无明确划界的情况下执行。此外,以上参照图9描述的算子融合装置200并不限于包括以上描述的模块,而是还可以根据需要增加一些其它模块(例如,读取模块、控制模块等),或者以上模块也可被组合。
本公开的至少一实施例还提供一种电子设备,该电子设备包括处理器和存储器;该存储器包括一个或多个计算机程序模块;该一个或多个计算机程序模块被存储在存储器中并被配置为由处理器执行,一个或多个计算机程序模块包括用于实现上文描述的本公开的实施例提供的算子融合方法。例如,该处理器可以为单核处理器或多核处理器。
图10为本公开的至少一实施例提供的一种电子设备的示意框图。
例如,如图10所示,该电子设备300包括处理器310和存储器320。例如,存储器320用于存储非暂时性计算机可读指令(例如一个或多个计算机程序模块)。处理器310用于运行非暂时性计算机可读指令,非暂时性计算机可读指令被处理器310运行时可以执行根据上文描述的算子融合方法的一个或多个步骤。存储器320和处理器310可以通过总线系统和/或其它形式的连接机构(未示出)互连。
例如,处理器310可以是中央处理单元(CPU)、图形处理器(GPU)、通用图形处理器(GPGPU)、数字信号处理器(DSP)或者具有算子融合能力和/或程序执行能力的其它形式的处理单元,例如现场可编程门阵列(FPGA)等;例如,中央处理单元(CPU)可以为X86、RISC-V或ARM架构等。处理器310可以为通用处理器或专用处理器,可以控制电子设备300中的其它组件以执行期望的功能。
例如,存储器320可以包括一个或多个计算机程序产品的任意组合,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、可擦除可编程只读存储器(EPROM)、便携式光盘只读存储器(CD-ROM)、USB存储器、闪存等。在计算机可读存储介质上可以存储一个或多个计算机程序模块,处理器310可以运行一个或多个计算机程序模块,以实现电子设备300的各种功能。在计算机可读存储介质中还可以存储各种应用程序和各种数据以及应用程序使用和/或产生的各种数据等。
需要说明的是,本公开的实施例中,电子设备300的具体功能和技术效果可以参考上文中关于本公开至少一实施例提供的算子融合方法的描述,此处不再赘述。
图11为本公开的至少一实施例提供的另一种电子设备的示意框图。
例如,如图11所示,该电子设备400例如适于用来实施本公开实施例提供的算子融合方法。需要注意的是,图11示出的电子设备400仅是一个示例,其不会对本公开实施例的功能和使用范围带来任何限制。
例如,如图11所示,电子设备400可以包括处理装置(例如中央处理器、图形处理器等)41,其可以根据存储在只读存储器(ROM)42中的程序或者从存储装置48加载到随机访问存储器(RAM)43中的程序而执行各种适当的动作和处理。在RAM 43中,还存储有电子设备400操作所需的各种程序和数据。处理装置41、ROM 42以及RAM 43通过总线44彼此相连。输入/输出(I/O)接口45也连接至总线44。通常,以下装置可以连接至I/O接口45:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置46;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置47;包括例如磁带、硬盘等的存储装置48;以及通信装置49。通信装置49可以允许电子设备400与其他电子设备进行无线或有线通信以交换数据。
虽然图11示出了具有各种装置的电子设备400,但应理解的是,并不要求实施或具备所有示出的装置,电子设备400可以替代地实施或具备更多或更少的装置。
关于电子设备400的详细说明和技术效果,可以参考上文关于算子融合方法的相关描述,此处不再赘述。
图12为本公开的至少一实施例提供的一种存储介质的示意图。
例如,如图12所示,存储介质500存储有非暂时性计算机可读指令510。例如,当非暂时性计算机可读指令510由计算机执行时执行根据上文描述的算子融合方法中的一个或多个步骤。
例如,该存储介质500可以应用于图10所示的电子设备300中。例如,存储介质500可以为电子设备300中的存储器320。例如,关于存储介质500的相关说明可以参考图10所示的电子设备300中的存储器320的相应描述,此处不再赘述。
对于本公开,有以下几点需要说明:
(1)本公开实施例附图中,只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)在不冲突的情况下,本公开同一实施例及不同实施例中的特征可以相互组合。
以上,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以权利要求的保护范围为准。
Claims (18)
1.一种算子融合方法,包括:
将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在所述目标核函数中所述至少一个第一算子和所述至少一个第二算子通过设备函数方式被调用;
获得对应于所述至少一个第一算子的第一中间表示;
获得对应于所述至少一个第二算子的第二中间表示;
基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到融合后的目标核函数,
其中,所述设备函数为所述目标核函数的子函数。
2.根据权利要求1所述的算子融合方法,其中,所述至少一个第一算子包括融合算子、非融合算子或手写算子,所述非融合算子包括自动生成算子。
3.根据权利要求1所述的算子融合方法,其中,所述至少一个第二算子包括融合算子、非融合算子或手写算子,所述非融合算子包括自动生成算子。
4.根据权利要求1所述的算子融合方法,其中,响应于所述至少一个第一算子包括融合算子,
在将对应于所述至少一个第一算子的第一图层表示和对应于所述至少一个第二算子的第二图层表示写入所述目标核函数之前,所述方法还包括:
通过模式匹配的方式将至少一个第三算子进行第一级融合,得到所述至少一个第一算子,
其中,所述至少一个第三算子包括自动生成算子。
5.根据权利要求1所述的算子融合方法,其中,将对应于所述至少一个第一算子的第一图层表示和对应于所述至少一个第二算子的第二图层表示写入所述目标核函数,包括:
改写所述第一图层表示,以通过所述设备函数方式调用所述至少一个第一算子;
改写所述第二图层表示,以通过所述设备函数方式调用所述至少一个第二算子;
在所述目标核函数中调用所述至少一个第一算子对应的第一设备函数和所述至少一个第二算子对应的第二设备函数,并通过内联函数方式将所述至少一个第一算子和所述至少一个第二算子进行第二级融合。
6.根据权利要求5所述的算子融合方法,其中,在所述目标核函数中调用所述至少一个第二算子对应的第二设备函数之前,所述方法还包括:
对所述至少一个第二算子进行第一函数声明。
7.根据权利要求5所述的算子融合方法,其中,所述第二设备函数的输入包括所述第一设备函数的至少一个输出,或者,
所述第一设备函数的至少一个输入包括所述第二设备函数的输出。
8.根据权利要求5所述的算子融合方法,其中,获得对应于所述至少一个第一算子的第一中间表示,包括:
将所述第一设备函数汇编为所述第一中间表示。
9.根据权利要求5所述的算子融合方法,其中,获得对应于所述至少一个第二算子的第二中间表示,包括:
将所述第二设备函数汇编为所述第二中间表示。
10.根据权利要求9所述的算子融合方法,其中,将所述第二设备函数汇编为所述第二中间表示,包括:
设置所述第二设备函数的属性,使其可以进行函数内联;
对所述至少一个第二算子进行第二函数声明和第二函数调用,得到所述第二中间表示。
11.根据权利要求1所述的算子融合方法,其中,基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到所述融合后的目标核函数,包括:
改写所述第二中间表示;
将改写后的第二中间表示通过内联函数方式加入到所述第一中间表示中,以得到所述融合后的目标核函数,以对所述至少一个第一算子和所述至少一个第二算子进行第三级融合。
12.根据权利要求11所述的算子融合方法,其中,改写所述第二中间表示,包括:
对所述第二中间表示进行链接,以将所述第二中间表示中对所述至少一个第二算子的第二函数声明替换为函数定义;
对所述链接后的第二中间表示进行函数内联,以将所述第二中间表示中对所述至少一个第二算子的第二函数调用内联为对应的函数实现。
13.一种算子融合装置,包括:
写入模块,配置为将对应于至少一个第一算子的第一图层表示和对应于至少一个第二算子的第二图层表示写入目标核函数,其中,在所述目标核函数中所述至少一个第一算子和所述至少一个第二算子通过设备函数方式被调用;
获得模块,配置为获得对应于所述至少一个第一算子的第一中间表示,以及获得对应于所述至少一个第二算子的第二中间表示;
融合模块,配置为基于所述第一中间表示和所述第二中间表示,将所述至少一个第一算子和所述至少一个第二算子进行融合,以得到融合后的目标核函数。
14.根据权利要求13所述的算子融合装置,其中,响应于所述至少一个第一算子包括融合算子,
所述融合模块还配置为,通过模式匹配的方式将至少一个第三算子进行第一级融合,得到所述至少一个第一算子,
其中,所述至少一个第三算子包括自动生成算子。
15.根据权利要求13所述的算子融合装置,其中,所述写入模块还配置为:
改写所述第一图层表示,以通过所述设备函数方式调用所述至少一个第一算子;
改写所述第二图层表示,以通过所述设备函数方式调用所述至少一个第二算子;
在所述目标核函数中调用所述至少一个第一算子对应的第一设备函数和所述至少一个第二算子对应的第二设备函数,以将所述至少一个第一算子和所述至少一个第二算子进行第二级融合。
16.根据权利要求13所述的算子融合装置,其中,所述融合模块还配置为:
改写所述第二中间表示;
将改写后的第二中间表示通过内联函数方式加入到所述第一中间表示中,以得到所述融合后的目标核函数,以对所述至少一个第一算子和所述至少一个第二算子进行第三级融合。
17.一种电子设备,包括:
处理器;
存储器,包括一个或多个计算机程序模块;
其中,所述一个或多个计算机程序模块被存储在所述存储器中并被配置为由所述处理器执行,所述一个或多个计算机程序模块用于实现权利要求1-12任一项所述的算子融合方法。
18.一种存储介质,存储有非暂时性计算机可读指令,当所述非暂时性计算机可读指令由计算机执行时实现权利要求1-12任一项所述的算子融合方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310574701.5A CN116523023A (zh) | 2023-05-22 | 2023-05-22 | 算子融合方法及装置、电子设备与存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310574701.5A CN116523023A (zh) | 2023-05-22 | 2023-05-22 | 算子融合方法及装置、电子设备与存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116523023A true CN116523023A (zh) | 2023-08-01 |
Family
ID=87408277
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310574701.5A Pending CN116523023A (zh) | 2023-05-22 | 2023-05-22 | 算子融合方法及装置、电子设备与存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116523023A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117289948A (zh) * | 2023-11-24 | 2023-12-26 | 北京壁仞科技开发有限公司 | 算子消除方法、装置、系统、电子设备和存储介质 |
CN118409758A (zh) * | 2024-07-03 | 2024-07-30 | 北京壁仞科技开发有限公司 | 用于编译核函数的方法、装置、介质和程序产品 |
CN118585200A (zh) * | 2024-08-06 | 2024-09-03 | 北京壁仞科技开发有限公司 | 算子融合方法、电子设备与存储介质 |
-
2023
- 2023-05-22 CN CN202310574701.5A patent/CN116523023A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117289948A (zh) * | 2023-11-24 | 2023-12-26 | 北京壁仞科技开发有限公司 | 算子消除方法、装置、系统、电子设备和存储介质 |
CN118409758A (zh) * | 2024-07-03 | 2024-07-30 | 北京壁仞科技开发有限公司 | 用于编译核函数的方法、装置、介质和程序产品 |
CN118409758B (zh) * | 2024-07-03 | 2024-09-06 | 北京壁仞科技开发有限公司 | 用于编译核函数的方法、装置、介质和程序产品 |
CN118585200A (zh) * | 2024-08-06 | 2024-09-03 | 北京壁仞科技开发有限公司 | 算子融合方法、电子设备与存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111242321B (zh) | 一种数据处理方法及相关产品 | |
CN116523023A (zh) | 算子融合方法及装置、电子设备与存储介质 | |
US20220129289A1 (en) | Deep learning algorithm compiling method, device, and related product | |
US20180157471A1 (en) | Systems and methods for generating code for parallel processing units | |
JP6027021B2 (ja) | アジャイル通信演算子 | |
TWI806550B (zh) | 處理器操作方法、相關電腦系統、及非暫時性電腦可存取儲存媒體 | |
CN103858099A (zh) | 用于在异构计算机上编译和运行高级程序的技术 | |
US9841958B2 (en) | Extensible data parallel semantics | |
EP2805232B1 (en) | Predication of control flow instructions having associated texture load instructions for a graphics processing unit | |
US20220114429A1 (en) | Method and device for generating operation data and related product | |
Mikushin et al. | KernelGen--The Design and Implementation of a Next Generation Compiler Platform for Accelerating Numerical Models on GPUs | |
WO2022253075A1 (zh) | 一种编译方法及相关装置 | |
Vocke et al. | Extending halide to improve software development for imaging dsps | |
CN113885877A (zh) | 编译的方法、装置、设备及介质 | |
Goli et al. | Accelerated machine learning using TensorFlow and SYCL on OpenCL Devices | |
US20210319369A1 (en) | Multi-level caching for dynamic deep learning models | |
Tagliavini et al. | Enabling OpenVX support in mW-scale parallel accelerators | |
WO2021047662A1 (en) | Method and apparatus for enabling autonomous acceleration of dataflow ai applications | |
Ishimura et al. | Aspect-Oriented Programming based building block platform to construct Domain-Specific Language for HPC application | |
Sousa et al. | Data-flow analysis and optimization for data coherence in heterogeneous architectures | |
US9841975B2 (en) | Method and apparatus for performing register allocation | |
Bragança et al. | Fast flow cloud: A stream dataflow framework for cloud FPGA accelerator overlays at runtime | |
CN118585200A (zh) | 算子融合方法、电子设备与存储介质 | |
Li et al. | swTVM: Towards Optimized Tensor Code Generation for Deep Learning on Sunway Many-Core Processor | |
CN118585199A (zh) | 编译器的优化方法、电子设备与存储介质 |
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 | ||
CB02 | Change of applicant information |
Country or region after: China Address after: 201100 room 1302, 13 / F, building 16, No. 2388, Chenhang highway, Minhang District, Shanghai Applicant after: Shanghai Bi Ren Technology Co.,Ltd. Address before: 201100 room 1302, 13 / F, building 16, No. 2388, Chenhang highway, Minhang District, Shanghai Applicant before: Shanghai Bilin Intelligent Technology Co.,Ltd. Country or region before: China |
|
CB02 | Change of applicant information |