CN117609670B - 支持动态形状的计算的方法、装置、介质和程序产品 - Google Patents
支持动态形状的计算的方法、装置、介质和程序产品 Download PDFInfo
- Publication number
- CN117609670B CN117609670B CN202410072607.4A CN202410072607A CN117609670B CN 117609670 B CN117609670 B CN 117609670B CN 202410072607 A CN202410072607 A CN 202410072607A CN 117609670 B CN117609670 B CN 117609670B
- Authority
- CN
- China
- Prior art keywords
- loop
- dimension
- shape
- dynamic
- kernel function
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 96
- 239000000872 buffer Substances 0.000 claims abstract description 60
- 238000004364 calculation method Methods 0.000 claims abstract description 23
- 230000006870 function Effects 0.000 claims description 74
- 239000011159 matrix material Substances 0.000 claims description 59
- 125000004122 cyclic group Chemical group 0.000 claims description 38
- 230000004044 response Effects 0.000 claims description 21
- 238000003860 storage Methods 0.000 claims description 19
- 230000003068 static effect Effects 0.000 claims description 16
- 238000004590 computer program Methods 0.000 claims description 14
- 239000002699 waste material Substances 0.000 abstract description 9
- 238000010586 diagram Methods 0.000 description 23
- 238000003070 Statistical process control Methods 0.000 description 19
- 239000003550 marker Substances 0.000 description 13
- 238000012545 processing Methods 0.000 description 12
- 230000008569 process Effects 0.000 description 6
- 230000009286 beneficial effect Effects 0.000 description 5
- 238000007796 conventional method Methods 0.000 description 4
- 238000005457 optimization Methods 0.000 description 4
- 238000009825 accumulation Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 3
- 230000000903 blocking effect Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- 238000000354 decomposition reaction Methods 0.000 description 3
- 238000012216 screening Methods 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 2
- 230000001351 cycling effect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 230000004807 localization Effects 0.000 description 2
- 238000005192 partition Methods 0.000 description 2
- 230000007480 spreading Effects 0.000 description 2
- 238000003892 spreading Methods 0.000 description 2
- 238000011282 treatment Methods 0.000 description 2
- 235000008694 Humulus lupulus Nutrition 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012821 model calculation Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000006911 nucleation Effects 0.000 description 1
- 238000010899 nucleation Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/15—Correlation function computation including computation of convolution operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/16—Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Theoretical Computer Science (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Computing Systems (AREA)
- Complex Calculations (AREA)
Abstract
本发明涉及一种用于支持动态形状的计算的方法、装置、介质和程序产品。该方法包括:将用户输入的形状拆分至针对单计算核的形状,以便至少基于针对单计算核的形状确定核函数的循环结构;将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区并且循环展开;以及将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度。本发明能够避免访存和算力的浪费,提高执行性能。
Description
技术领域
本发明的实施例总体上涉及数据处理领域,更具体地涉及一种用于支持动态形状的计算的方法、计算装置、计算机可读存储介质和计算机程序产品。
背景技术
动态形状(dynamic shape) 是延迟指定部分或全部张量维度直到运行时的能力。在深度学习计算中存在的大量的dynamic shape的场景,以解决功能和性能的泛化问题。
传统的用于支持动态形状的计算的方案例如包括分桶方案和基于dynamic shape直接生成核函数(kernel)的方案。在分桶方案中,主要将需要支持动态形状的范围进行分组,同一组动态形状使用同一kernel来执行,而且使用支持较大形状(shape)的kernel来覆盖稍小的shape。在上述方案中,存在访存和算力的浪费,以及需精细的kernel分组和筛选策略。在基于动态shape直接生成kernel的方案中,算子输入shape就包含动态维度,算子的整个生成周期中都直接处理该动态维度,最终生成支持动态的kernel。该方案的复杂度较高,难以在编译阶段进行极限优化,并且分支跳转多,从而影响执行性能,并且难于优化。
综上,传统的用于支持动态形状的计算的方案存在的不足之处在于,存在访存和算力的浪费,因需要精细的kernel分组和筛选策略,或者存在较多的分支跳转从而影响执行性能。
发明内容
本发明提供了一种用于支持动态形状的计算的方法、计算装置、计算机可读存储介质和计算机程序产品,能够避免访存和算力的浪费,提高执行性能。
根据本发明的第一方面,提供了一种用于支持动态形状的计算的方法。该方法包括:将用户输入的形状拆分至针对单计算核的形状,以便至少基于针对单计算核的形状确定核函数的循环结构;将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区并且循环展开;以及将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度。
根据本发明的第二方面,还提供了一种计算装置。该计算装置包括:至少一个处理器;以及与至少一个处理器通信连接的存储器;其中存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使计算装置能够执行本发明的第一方面的方法。
根据本发明的第三方面,还提供了一种计算机可读存储介质。该计算机可读存储介质上存储有计算机程序,计算机程序被机器执行时执行本发明的第一方面的方法。
根据本发明的第四方面,还提供了一种计算机程序产品,包括计算机程序,计算机程序被机器执行时执行本发明的第一方面的方法。
在一些实施例中,将用户输入的形状拆分至针对单计算核的形状包括:确认用户输入的形状是否包括子张量维度;响应于确认用户输入的形状包括子张量维度,将子张量维度转将转换至批量维度,以便生成转换至批量维度的形状;以及将转换至批量维度的形状拆分至针对单计算核的形状。
在一些实施例中,至少基于针对单计算核的形状确定核函数的循环结构包括:基于针对单计算核的形状、指令计算的粒度、带宽参数、存储资源,确定核函数的循环结构。
在一些实施例中,将核函数的循环结构分解为内层循环和外层循环包括:基于缓冲区的尺寸和带宽比,确定内层循环中各维度的范围;以及基于内层循环中各维度的范围的最大值,确定与内层循环最接近的外层循环的各维度的循环步长。
在一些实施例中,将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度包括:确定针对单计算核的形状是否支持动态形状;响应于确定针对单计算核的形状支持动态形状,将核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开;以及配置寄存器所存储的循环次数,以用于动态控制主体分代码的循环次数。
在一些实施例中,确定针对单计算核的形状是否支持动态形状包括:响应于确定用于矩阵乘法累加的输入矩阵的第一维度和第二维度的乘积大于缓存区尺寸, 使得输入矩阵的第一维度或第二维度支持动态形状。
在一些实施例中,确定针对单计算核的形状是否支持动态形状包括:确定用于矩阵乘法累加的输入矩阵的计算公式中的最小循环块的第一维度和第二维度;响应于确认最小循环块的第一维度大于或者等于 64 * 3,使得最小循环块的第一维度支持动态形状;以及响应于确认最小循环块的第二维度大于或者等于最小循环步长乘以3,使得最小循环块的第二维度支持动态形状。
在一些实施例中,用于支持动态形状的计算的方法还包括:针对矩阵乘法累加,确定子张量维度转换至批量维度之后是否还存在多余的维度;以及响应于确定子张量维度转换至批量维度之后还存在多余的维度,通过多次启动同样的核函数,用以使得核函数支持动态维度。
应当理解,本部分所描述的内容并非旨在标识本发明的实施例的关键或重要特征,也不用于限制本发明的范围。本发明的其它特征将通过以下的说明书而变得容易理解。
附图说明
结合附图并参考以下详细说明,本发明各实施例的上述和其他特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标注表示相同或相似的元素。
图1示意性示出了根据本发明实施例的实施用于支持动态形状的计算的方法的计算装置的示意图。
图2示出了根据本发明的实施例的用于支持动态形状的计算的方法的流程图。
图3示出了根据本发明的实施例的用于将核函数的各层循环代码拆分为多段分代码的方法的示意图。
图4示出了根据本发明的实施例的用于通过复用循环块以使得核函数支持动态维度的方法的流程图。
图5示出了传统方式与本发明实施例的关于分支跳转情形的对比示意图。
图6示出了根据本发明的实施例的用于生成经拆分的调度树的方法的流程图。
图7示出了根据本发明的实施例的调度树的示意图。
图8示出了根据本发明的实施例的用于基于经拆分的调度树生成代码的方法的流程图。
图9示出了根据传统方法和本发明的实施例的用于支持动态形状的计算的方法的技术效果对比示意图。
图10示出了根据本发明的实施例的用于在对应的线程束插入循环开始算子和/或循环结束算子的方法的示意图。
图11示出了根据本发明的实施例的用于拆分至针对单计算核的形状的方法的流程图。
图12示出了根据本发明的实施例的用于使得核函数支持动态维度的方法的流程图。
图13示出了根据本发明的实施例的循环结构示意图。
图14示出了根据本发明的实施例的矩阵A、B、O所涉形状的示意图。
在各个附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参照附图更详细地描述本发明的优选实施例。虽然附图中显示了本发明的优选实施例,然而应该理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本发明更加透彻和完整,并且能够将本发明的范围完整地传达给本领域的技术人员。
在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实施例”和“一个实施例”表示“至少一个示例实施例”。术语“另一实施例”表示“至少一个另外的实施例”。术语“第一”、“第二”等等可以指代不同的或相同的对象。
如前文所描述,传统的用于支持动态形状的计算的方案存在的不足之处在于,存在访存和算力的浪费,因需要精细的kernel分组和筛选策略,或者存在较多的分支跳转,从而影响执行性能。
为了至少部分地解决上述问题以及其他潜在问题中的一个或者多个,本发明的示例实施例提出了一种用于支持动态形状的计算的方法。在该方法中,通过将用户输入的形状拆分至针对单计算核的形状,以便至少基于针对单计算核的形状确定核函数的循环结构;将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区并且循环展开;以及将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度,由于本发明的内层循环匹配缓冲区,因此本发明不会出现利用支持较大shape的kernel来覆盖稍小的shape的情形,并且内层循环被配置为循环展开,有利于减少跳转,提升执行性能,以及便于优化,因此,本发明能够有效避免对访存和算力的浪费;另外,本发明通过将核函数的循环结构的循环层拆分为循环块,并且通过复用循环块来使得kernel支持动态维度,因此,可以显著减少跳转指令并且不需要精细的kernel分组和筛选策略,因而有利于提高执行性能。因此,本发明能够避免对访存和算力的浪费、以及提高执行性能。
图1示意性示出了根据本发明实施例的实施用于支持动态形状的计算的方法的计算装置100的示意图。如图1所示,计算装置100可以具有一个或多个处理单元,包括诸如图形处理器(Graphics Processing Unit,GPU)、现场可程序化逻辑门阵列(FieldProgrammable Gate Array,FPGA)和专门应用的集成电路(Application SpecificIntegrated Circuit,ASIC)等的专用处理单元以及诸如CPU的通用处理单元。计算装置100至少还包括:核函数的循环结构确定模块102、内层循环和外层循环分解模块104、循环块拆分与复用模块106。
关于核函数的循环结构确定模块102,其用于基于静态形状,生成核函数。
关于内层循环和外层循环分解模块104,其用于将核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开优化。
关于循环块拆分与复用模块106,其用于经由寄存器,动态控制主体分代码的循环次数,以便基于静态形状所生成的核函数支持动态维度。
以下将结合图2描述根据本发明的实施例的用于支持动态形状的计算的方法200。图2示出了根据本发明的实施例的用于支持动态形状的计算的方法200的流程图。应当理解,方法200例如可以在图1所描述的计算装置100处执行。方法200还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤202处,计算装置100将用户输入的形状拆分至针对单计算核的形状,以便至少基于针对单计算核的形状确定核函数的循环结构。
关于核函数(kernel),其循环结构例如包括多层循环,如图3中的标记310所示。应当理解,计算装置100可以根据多种方式生成核函数。
关于将用户输入的形状拆分至针对单计算核的形状的方法,其例如包括:确认用户输入的形状是否包括子张量维度;响应于确认用户输入的形状包括子张量维度,将子张量维度转将转换至批量维度,以便生成转换至批量维度的形状;以及将转换至批量维度的形状拆分至针对单计算核的形状。下文将结合图11具体说明用于将用户输入的形状拆分至针对单计算核的形状的方法1100,在此,不再赘述。
关于基于针对单计算核的形状确定核函数的循环结构的方法,其例如包括:基于针对单计算核的形状、指令计算的粒度、带宽参数、存储资源,确定核函数的循环结构。在一些实施例中,计算装置100例如在使用动态特性之前,对计算和访存进行理论建模,实现硬件资源最大化利用的成本模型(cost model)。基于cost model计算建模分析充分利用硬件计算资源,实现计算的高并发。以及基于cost model访存建模分析充分利用硬件的系统带宽,实现访存本地化(locality)。
在步骤204处,计算装置100将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区并且循环展开。
关于将核函数的循环结构分解为内层循环和外层循环的方法,其例如包括:基于缓冲区的尺寸和带宽比,确定内层循环中各维度的范围;以及基于内层循环中各维度的范围的最大值,确定与内层循环最接近的外层循环的各维度的循环步长。
在一些实施例中,计算装置将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区,并且全部循环展开。由此,本发明可以平摊跳转指令的开销。在一些是实施例中,可以使得外层循环尽量把累加寄存器(accumulation TLR)用满。
由于循环不展开(not unroll)和循环展开(unroll)会影响核函数的尺寸的大小。应当理解,对于大的形状而言,尽可能让多层循环不展开,这样可以通过寄存器来控制循环块的循环次数,使得核函数编译完成的文件比较小。尽管通过上述方式减少了跳转次数,但是while循环本身还会存在一定跳转,因此相对于全展开方式而言,还会存在性能损耗。如果形状本身比较小或者核函数本身不大,则可以使得循环结构尽可能全展开,有利于提升性能,和便于优化。因此,本发明的方法200还包括:基于核函数大小、循环跳转带来的性能损耗、动态形状,针对核函数的内层循环和外层循环配置循环不展开或者循环展开状态。对于内层循环而言,使其配置使得缓冲区充分填充、满足带宽比要求,并且循环全展开,因为内存循环使用的是非常高速的GIB buffer,因此可以使内层循环尽可能高效地执行。由此,可以平摊跳转指令的开销。对于外层循环,如果其某一维度的循环次数大于或者等于3次,则使其循环不展开。如果其某一维度的循环次数小于3次,则使其循环展开。
应当理解,外层循环所使用的资源的带宽和速率相对较低。内层循环使用靠近计算核的GIB buffer,需要尽可能充分地使用buffer。但不能超过buffer。对于矩阵计算而言,存在两个输入,M*K是使用A buffer的数据量,N*K是使用B buffer的数据量,两个buffer从不同的资源加载数据,数据量的占比需要满足带宽占比,以便保证计算和加载数据的均衡。
在步骤206处,计算装置100将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度。
例如,计算装置100针对核函数的各循环层分解为多个循环块,以便通过循环块的复用实现核函数支持动态形状。在一些实施例中,计算装置100针对核函数的各循环层分解为三个循环块,例如,三个循环块为三段分代码,该三段分代码例如包括:主体分代码(例如,body)、主体前分代码(例如,prolog)、以及主体后分代码(例如,epilog)。主体前分代码(例如,prolog)被配置于主体分代码(例如,body)之前,主体后分代码(例如,epilog)被配置于主体分代码(例如,body)之后。关于循环块,在一些实施例中,其例如为body,特别是body中的展开代码。
在一些实施例中,通过复用循环块以使得核函数支持动态维度的方法例如包括:计算装置100确定针对单计算核的形状是否支持动态形状;响应于确定针对单计算核的形状支持动态形状,将基于静态形状所生成的核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开;以及配置寄存器所存储的循环次数,以用于动态控制主体分代码的循环次数。
应当理解,经由拆分之后,确定了每个SPC需要计算的数据量,就可以确定每个维度需要循环的次数。例如,以仅拆分batch维度为例,用户原始输入的形状包括48个batch,系统有16个SPC,则每个SPC处理3个Batch,则在生成核函数时,每个SPC在batch维度需要循环3次。用户原始输入的形状包括96个batch,则每个SPC处理6个Batch,则在生成核函数时,每个SPC在batch维度需要循环6次。如果扣除,prolog所包括的第一次循环、以及epilog所包括的最后一次循环,则body包括的循环次数为4次。
下文将结合图4详细说明通过复用循环块以使得核函数支持动态维度的方法400,在此,不再赘述。
在上述方法200的方案中,由于本发明的内层循环匹配缓冲区,因此本发明不会出现利用支持较大shape的kernel来覆盖稍小的shape的情形,并且内层循环被配置为循环展开,有利于减少跳转,提升执行性能,以及便于优化,因此,本发明能够有效避免对访存和算力的浪费;另外,本发明通过将核函数的循环结构的循环层拆分为循环块,并且通过复用循环块来使得kernel支持动态维度,因此,可以显著减少跳转指令并且不需要精细的kernel分组和筛选策略,因而有利于提高执行性能。因此,本发明能够避免对访存和算力的浪费、以及提高执行性能。
以下结合图3、图4、图9和图13说明用于通过复用循环块以使得核函数支持动态维度的方法400。图4示出了根据本发明的实施例的用于通过复用循环块以使得核函数支持动态维度的方法400的流程图。应当理解,方法400例如可以在图1所描述的计算装置100处执行。图3示出了根据本发明的实施例的用于将核函数的各层循环代码拆分为多段分代码的方法的示意图。图14示出了根据本发明的实施例的矩阵A、B、O所涉形状的示意图。方法400还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤402处,计算装置100确定针对单计算核的形状是否支持动态形状。
在一些实施例中,关于确定针对单计算核的形状是否支持动态形状的方法,其例如包括:响应于确定用于矩阵乘法累加的输入矩阵的第一维度和第二维度的乘积大于缓存区尺寸, 使得输入矩阵的第一维度或第二维度支持动态形状。
在一些实施例中,关于确定针对单计算核的形状是否支持动态形状的方法,其例如包括:确定用于矩阵乘法累加的输入矩阵的计算公式中的最小循环块的第一维度和第二维度;响应于确认最小循环块的第一维度大于或者等于 64 * 3,使得最小循环块的第一维度支持动态形状;以及响应于确认最小循环块的第二维度大于或者等于最小循环步长 *3,使得最小循环块的第二维度支持动态形状。最小循环步长例如而不限于是16。
具体而言,对于矩阵乘法累加( MMA )而言,每一个维度都可以支持dynamicshape的。如前文所述,为了支持动态形状,需要将kernel的各层循环代码例如拆分为3段分代码(分别是prolog、body、epilog)或者3个循环块,并且对body进行循环展开优化。因此,如果batch < 3, 则batch 维度不支持dynamic shape,例如使得用于指示支持dynamicshape的标识为“1”,例如使得用于指示支持dynamic shape的标识为“0”。如果batch >=3,batch 维度支持dynamic Shape,例如使得用于指示支持dynamic shape的标识为“1”。
例如,如果用于 MMA的输入矩阵(即,A矩阵、B矩阵)、以及输出矩阵(即,C矩阵)都具有batch维度,则张量计算核的3个线程束都添加外层循环(即,while循环)。
如果只有A矩阵、B矩阵中的一个输入矩阵具有batch维度,则只要具有batch维度的线程束、以及用于矩阵计算线程束带上batch的循环。
例如,如果A矩阵的第一维度(即,M)和第二维度(即,K)的乘积大于缓冲区尺寸(即,M * K> buffer size), 则 A 矩阵的M或K可以支持dynamic shape。
再例如,A矩阵的M*K公式中的最小循环块(或者“最小的指令粒度”)的第一维度例如为m、第二维度例如为k。应当理解,在内层循环中最好以指令粒度去配置循环块。图13示出了根据本发明的实施例的循环结构示意图。如图13所示,标记1302指示内层循环(innerloop),1304指示外层循环(outer loop)。以K维度为例,inner loop中K维度的范围根据GIBbuffer的尺寸和带宽比而确定,例如K维度的范围是从0至512。outer loop中的K的范围是从0到4096,其循环步长是根据其最接近内层循环(inner loop)的K维度的范围最大值而确定的。 临近1304指示外层循环(outer loop)的内层循环1302的K维度的范围的最大值为512。因此,K的循环步长被确定为512。基于K的范围和循环部长,可以进一步确定循环次数。如果循环次数大于或者等于3,使得循环展开,如果循环次数小于3,使得循环不展开。如果最小循环块的m 大于或者等于 64 * 3(即,m >=64 * 3), 则最小循环块的m可以支持dynamic shape;如果最小循环块的k大于或者等于16 * 3(即,k >= 16 * 3), 则最小循环块的k可以支持dynamic shape。
在一些实施例中,基于指令的最小粒度和缓冲区的尺寸,确定各维度的范围的最大值,以使得缓冲区的使用充分。以图13为例,内层循环是与指令密切相关的,M的循环步长为64,N的循环步长为64,因为最小的指令粒度为64*64。K的循环步长例如为512,由于其指令粒度例如为86,其可以进一步拆分。例如,配置M*K、N*K,使得尽可能缓冲区使用充分,以便最终确定M、N、K范围的最大值。
关于B矩阵,如果B矩阵的K * N 大于缓冲区尺寸(即,K * N > Buffer Size), 则B 矩阵的K或N可以实现为dynamic shape。
确认B矩阵的K * N公式中的最小循环块的k维度、n维度;如果最小循环块的n大于或者等于 64 * 3(即,n >=64 * 3), 则最小循环块的n维可以支持dynamic shape;如果最小循环块的k大于或者等于16 * 3(即,k >= 16 * 3), 则最小循环块的K可以支持dynamicshape。
关于卷积运算,本发明支持Batch、H、W维度的动态形状。例如,生成的代码使用CSR读取运行时的形状的尺寸大小(dimension size)。应当理解,卷积的权重=OC*IC*KH*KW,对于OC、IC两个维度而言,其可以比较大,但是其不需要具备动态性,因此,使其支持循环不展开non-unroll。例如,生成的代码直接用立即数表示upbounds。对于KH和KW维度,因为其通常尺寸较小,例如,小于7*7,并且在模型中不需要针对KH和KW进行特殊处理,因此,KH和KW不需要支持动态形状。
如果确定批量维度小于3(batch< 3),则批量维度总是支持静态形状。如果确定批量维度大于或者等于3(batch>=3),则批量维度总是支持动态形状。
以下为涉及KW等于1( 即,KW == 1)的情形。
关于卷积运算的B矩阵的情形,并且H 、W 、IC维度的乘积小于或者等于缓冲区尺寸(H * W * IC <= B buffer size),表明其仅有内层循环,可以使得H、W维度总是支持静态形状。
如果H 、W 、IC维度的乘积大于缓冲区尺寸(H * W * IC > B buffer size),则表明其存在外层循环,需要进一步进行以下判断。
如果内层循环的粒度与IC维度的乘积大于缓冲区尺寸(8*8*IC > B buffersize,内层循环的粒度为8*8),则:IC维度支持循环不展开(not unroll),内层还是循环展开(unroll);如果H > 24, 则支持动态形状 , 否则支持静态形状; 如果W > 24, 则支持动态形状 , 否则支持静态形状;以及求出满足 h * w * ic = 256KB的h、w、 ic,以使得ic维度最大,并且h、w维度 > 3, 并且占用的TLR buffer大小始终。则如果ic维度还有剩余,则ic维度支持外层non-unroll。
对于矩阵B而言,如果H 、W 、IC维度的乘积大于缓冲区尺寸(H * W * IC > Bbuffer size),并且计算核的最小粒度与H和IC维度的乘积小于缓冲区寄存器尺寸( 8*H*IC < B buffer size) ,则使得只有 W维度生成动态形状。如果W > 24 ,则支持动态形状, 否则支持静态形状。如果计算核的最小粒度与W和IC维度的乘积小于缓冲区尺寸 (W* 8* IC < B buffer Size),则使得只有H 维度生成动态形状。如果H > 24,则支持动态形状, 否则支持静态形状。
关于卷积运算的A矩阵的情形,并且OC、IC、KH、KW维度的乘积大于缓冲区的尺寸(即,OC * IC * KH * KW > A buffer size),需要进一步考虑以下情形。
如果内层循环的粒度与IC、KW、KH维度的乘积小于缓冲区的尺寸(IC*KW*KH < Abuffer size),并且 OC 维度大于或者等于内层循环的粒度的3倍(OC>= 3 * 64 > 192,OC的粒度例如为64),则OC维度支持不展开(not unroll), 否则支持展开(unroll)。
如果OC、 IC、KH 、 KW维度的乘积小于缓冲区的尺寸(即, OC*KW*KH < A buffersize), 并且IC 维度大于或者等于内层循环的粒度的3倍(IC >= 3 * 64 > 192, IC的粒度例如为64), 则IC维度支持不展开(not unroll), 否则支持展开(unroll)。
以下为涉及KW大于1( 即,KW > 1)的情形。
应当理解,在卷积运算的过程中,需要一些padding的数据。对于B矩阵,需要两块数据,因此缓冲区仅能加载一半数据。如果H、 IC维度的乘积大于缓冲区尺寸的一半(即,H* IC > B buffer size/2), 使得H维度支持动态形状。
对于矩阵B而言,如果计算核的最小粒度、8和IC维度的乘积小于缓冲区寄存器尺寸( 8*8*IC < B buffer size),并且 H > 24,则支持动态形状 , 否则支持静态形状。如果H > 24,并且IC > 192, 则H维度支持动态形状。 IC维度的外层循环支持不展开。
如果 W > 24,支持动态形状, 否则支持静态性状。
对于矩阵A而言,如果OC、IC、KH、KW 维度的乘积大于缓存区尺寸(即,OC * IC *KH * KW > A buffer size), 需要进一步考虑以下情形:
如果内层循环的粒度与IC、KW、KH维度的乘积小于缓冲区的尺寸(即,64* IC * KH* KW < A buffer size),并且大于或者等于IC的粒度的3倍(64* IC * KH * KW >= 3 *64 > 192, OC的粒度例如为64),则IC维度支持不展开(not unroll), 否则支持展开(unroll)。
如果内层循环的粒度与OC、KW、KH维度的乘积小于缓冲区的尺寸(即,64* OC * KH* KW < A buffer size,),并且大于或者等于OC的粒度的3倍(64* OC * KH * KW >= 3 *64 > 192, IC的粒度例如为64),则OC维度支持不展开(not unroll), 否则支持展开(unroll)。
在步骤404处,如果计算装置100确定针对单计算核的形状支持动态形状,将基于静态形状所生成的核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开。
以下结合图3以K维度为例来说明用于将核函数的各层循环代码拆分为多段分代码的方法。例如,以K维度为例,输入矩阵A为1024x4096 。输入矩阵 B矩阵为 4096x256 。输出矩阵O例如为1024x256。应当理解,其他维度也是适用于本发明的用于支持动态形状的计算的方法的。一般而言,在生成代码时,会将各维度写成若干层的循环,如图3所示,以多层循环310中的一个循环层312为例,其中,K在0到4096的范围内,以512为步长进行循环。标记320指示循环层312被拆分后的代码。例如,计算装置100将循环层312拆分为三段分代码。该三段分代码分别是主体前分代码322、主体分代码324、以及主体后分代码326。其中,主体前分代码322例如为第一次循环迭代的代码,即,K在0到512的范围内的第一次循环。主体分代码例如包括K在512到3584的范围内,以512为步长进行循环的代码。主体后分代码326例如为最后一次循环迭代的代码,即,K在3584到4096的范围内的最后一次循环。因此,在一些实施例中,主体前分代码(例如,prolog)和主体后分代码(例如,epilog)均只循环一次。
关于主体分代码(例如,body),其例如包括:展开代码330和循环代码(328-1和328-2)。其中,展开代码330为循环一次的展开代码(图3中以方框示意)。循环代码用于循环执行所述展开代码,循环代码配置在展开代码的外层,循环代码的循环次数是基于寄存器控制。循环代码进一步包括循环开始代码328-1(或称“循环开始算子”)和循环结束代码328-2(或称“循环结束算子”)。如图3所示,循环开始代码328-1例如包括:用于初始化寄存器索引的代码(例如,index_reg = 0。其中,index_reg例如指示计数寄存器的索引),以及用于设置循环起始标识的代码(例如,while_start。其中,start例如为循环起始标识)。循环结束代码328-2例如包括执行以下步骤的代码:如果确认展开代码被执行一次,使得寄存器索引叠加循环步长(index_reg = index_reg + step);确认当前寄存器索引是否小于循环结束标识;以及响应于确认当前寄存器索引小于循环结束标识,调转至循环起始标识所指示的代码位置(if index_reg < reg_end: jump to while_start)。应当理解,如果当前寄存器索引小于循环结束标识,则循环执行body所包括的展开代码330。应当理解,通过将主体分代码包括:展开代码和循环代码,本发明可以通过循环不展开可以进一步显著地降低代码生成的时间。
在一些实施例中,将核函数(kernel)各层的循环代码拆分为多段分代码的方法还包括:经由编译器,针对核函数当前层的循环代码程序进行编译,以便将当前层的循环代码中的差异性的代码拆分至当前层的循环代码所对应的主体前分代码和/或主体后分代码。应当理解,通过将差异性的代码拆分至epilog和/或prolog,本发明可以减少分支的跳转,进一步提高执行的性能。在一些实施例中, prolog包括数据同步机制,例如等待数据就绪(bar.wait)后执行第一次循环。epilog包括执行最后一次循环的代码和释放动作(bar.release)。body不包括等待数据就绪(bar.wait)的动作和释放(bar.release)动作。
在步骤406处,计算装置100配置寄存器所存储的循环次数,以用于动态控制主体分代码的循环次数。
例如,计算装置100通过寄存器,在运行时动态控制body的展开代码的循环次数,使得基于静态形状所生成的kernel具备支持动态维度的能力。应当理解,在生成kernel时是基于确切的静态形状shape生成的,在kernel执行时,可以获取待执行的shape的维度,基于获取的待执行的shape生成指定的循环次数,以及将指定的循环次数传入寄存器,由寄存器控制body中的展开代码执行指定的循环次数。
例如,如图14所示,计算装置100可以将基于输入矩阵A为1024x4096,输入矩阵 B矩阵为 4096x256,以及输出矩阵O例如为1024x256 的kernel应用到图14所示的诸多不同的shape。例如,相对于基于标记1410所指示的shape而构建的核函数而言,可以通过将图3中的循环结束标识reg_end由4096调整至4608(即,多执行一次步长为512的body所包括的展开代码的循环),即可以实现使得原有支持标记1410所指示的shape(例如,4096x256)的kernel也支持标记1412所指示的shape(例如,4608x256)。再例如,相对于基于标记1410所指示的shape而构建的kernel而言,通过将图3所示的循环结束标识reg_end由4096调整至5120(即,多执行两次步长为5120的body所包括的展开代码的循环),即可以实现使得原有支持标记1410所指示的shape(例如,4096x256)的核函数也支持标记1414所指示的shape(例如,5120x256),依次类推,通过调整主体分代码的循环次数,可以使得基于静态形状(shape)所生成的kernel(例如,基于标记1410所指示的shape而构建的kernel)支持动态维度(例如,从标记1412所指示的shape,至标记1418所指示的shape,甚至是图14未示出的更小维度的shape, 例如3584x256等等)。
图5示出了传统方式与本发明实施例的关于分支跳转情形的对比示意图。如图5所示,对于传统的多层循环310,在其每层的代码都需包括大量的分支跳转。例如,以K维度为例,在生成对应的核函数的代码332和运行代码时,均需要包括多个箭头所示的分支跳转,例如,在循环体中包括判断K是否等于0或3584的分支跳转。而对于经由本发明方法生成的核函数334,由于K等于0或3584的维度已经在循环体外单独处理,而未将其包括在循环体中。因此,不会像传统方式那样需要很多的分支跳转。因此,本发明能够显著减少分支跳转,提高执行性能。
图9示出了根据传统方法和本发明的实施例的用于支持动态形状的计算的方法的技术效果对比示意图。如图9所示,标记904指示了针对图中编号1至36所指示的形状(shape),利用传统的方法所需要的编译总耗时为4.16小时。标记906指示了针对图中编号1至36所指示的形状,利用本发明的方法所需要的编译总耗时为4.2分钟。另外,标记908指示了针对图中编号1所指示的形状902,利用传统的方法所需要的编译总耗时为524820个周期(cycle)。标记910指示了针对图中编号1所指示的形状902,利用本发明的方法所需要的编译总耗时为12032.8个周期(cycle)。可见,本发明的方法可以显著地减少编译代码所需的耗时。
在上述方法400的方案中,通过使得核函数匹配静态的、已知的shape,因此能够进一步避免对访存和算力的浪费;另外,本发明通过调整主体分代码的循环次数来使得kernel支持动态维度,因此,可以显著减少跳转指令,因而有利于提高执行性能。因此,本发明能够有效避免对访存和算力的浪费、以及进一步提高执行性能。
以下将结合图6、图7描述根据本发明的实施例的用于生成经拆分的调度树的方法600。图6示出了根据本发明的实施例的用于生成经拆分的调度树的方法600的流程图。应当理解,方法600例如可以在图1所描述的计算装置100处执行。图7示出了根据本发明的实施例的调度树700的示意图。方法600还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤602处,计算装置100从算子(OP)中获取关于循环分块的策略数据。
在一些实施例中,计算装置100从OP中获取算子生成策略,算子生成策略至少包括关于循环分块的策略数据。在一些实施例中,算子生成策略还包括指示如何进行矩阵乘法累加的数据。
在步骤604处,计算装置100基于关于循环分块的策略数据,获取调度树(scheduletree),所述调度树为以树形式指示的核函数各层循环的循环结构。
图7示例出K维度经拆分的调度树的示意图。例如,循环层(for K = 0; K < 4096;K += 512)被拆分成分支710至分支730。其中,分支710代表主体前分代码,分支720代表主体分代码,分支730代表主体后分代码。每个分支例如包括多个节点。每个节点例如为循环节点(loop节点)或者与操作节点(OP节点)相关。应当理解,调度树所示的节点702至706均可以进一步拆分。图7未示出节点702至706拆分后的对应部分。
在步骤606处,计算装置100获取用于生成代码的上下文属性设置。
在一些实施例中,上下文属性设置例如包括:代码生成过程中需要设置的上下文信息,其例如包括:当前OP的标识(例如当前OP是哪一个)、当前调度树标识(当前调度树是哪一个)、同步信息等等。
在步骤608处,计算装置100设置与算子的相关属性信。
在一些实施例中, OP的相关属性信息例如是累加方式、同步方式等。
在步骤610处,计算装置100针对调度树进行拆分,以便基于经拆分的调度树生成代码。
通过采用上述手段,本发明可以实现调度树的拆分。
关于基于经拆分的调度树生成代码的方法,其例如包括:确定当前节点是否为循环节点;响应于确定当前节点是循环节点,确定当前节点是否涉及循环展开层;响应于确定当前节点涉及循环展开层,生成对应的循环展开代码,并且遍历下一节点;以及响应于确定当前节点不涉及循环展开层,跳过所述循环节点所涉及的循环层,以便在对应的线程束插入循环开始算子和/或循环结束算子。响应于确定当前节点不是循环节点,调用算子生成器;以及拼接与算子相关的每一维度对应的范围信息,以便基于每一个维度的范围信息生成对应的汇编代码。下文将结合图8具体说明用于基于经拆分的调度树生成代码的方法,在此,不再赘述。
以下将结合图8、图10描述根据本发明的实施例的用于基于经拆分的调度树生成代码的方法800。图8示出了根据本发明的实施例的用于基于经拆分的调度树生成代码的方法800的流程图。方法800例如可以在图1所描述的计算装置100处执行。方法800还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤802处,计算装置100确定当前节点是否为循环节点。
例如,将经拆分的调度树输入代码生成器(schedule tree generator),以便确定代码生成器确定当前节点是否为循环节点。
在步骤804处,如果计算装置100确定当前节点是循环节点,确定当前节点是否涉及循环展开层。例如,判断当前节点是否涉及unroll。
在步骤806处,如果计算装置100确定当前节点涉及循环展开层,将生成对应的循环展开代码并且遍历下一节点。
在步骤808处,如果计算装置100确定当前节点不涉及循环展开层,跳过该循环节点所涉及的循环层,以便在对应的线程束(cwarp)插入循环开始算子和/或循环结束算子并且遍历下一节点。
图10示出了根据本发明的实施例的用于在对应的线程束(cwarp)插入循环开始算子和/或循环结束算子的方法的示意图。
应当理解,对于GPU通道而言,其是多线程束(cwarp)并行的。在不同的维度上都需要插入while循环来支持动态形状。以矩阵计算为例,标记1010指示第零线程束(即,cwarp0),标记1020指示第一线程束(即,cwarp 1),标记1030指示第二线程束(即,cwarp 2),标记1040指示第三线程束(即,cwarp 3),标记1050指示第四线程束(即,cwarp 4)。cwarp 0其用于load矩阵A的数据,cwarp 1用于load矩阵B的数据,cwarp 2用于矩阵的计算。应当理解,cwarp 2所进行的计算需要与cwarp 0和 cwarp 1所load的数据相配合的。cwarp 0涉及M和K维度的循环,cwarp 1涉及K和N维度的循环。cwarp 2所进行的计算会涉及M、K和N维度的循环。因此这些循环均会放入对应线程束中。cwarp 3和cwarp 4用于与矩阵的计算相配合的其他运算,例如,矩阵计算之后的数值类型转换,尽量将其分散至不同的线程束中处理。例如,矩阵计算之后为MxN维度,做完一小块之后,可以进行FP32到BF16的数值类型转换,或者当前线程束没有累加完,而需要在另一个线程束上完成累加,则可以在cwarp 3上进行M、N维度的循环。
如图10所示,标记1012所指示的代码(init B_W_H_WSR)用于初始化寄存器B_W_H_WSR。之后,寄存器索引叠加一(B_W_H_wsr++)。进行循环(B_W_H_LOOP),以进行寄存器的对应计算(cmp B_ WSR, B_CSR+H_CSR+W_CSR),然后判断当前循环是否到结尾(jge B_W_H_LOOP_end)。如果判断当前循环尚未到结尾则执行加载数据。之后,寄存器索引叠加一(B_W_H_wsr++)。再进行数据同步(force_sync)。然后返回至循环(B_W_H_LOOP)直至前循环是否到结尾。如图10所示,init B_W_H_WSR和B_W_H_wsr++为循环开始算子。B_W_H_wsr++;force_sync和jump B_W_H_LOOP为循环结束算子。应当理解,对于cwarp 0而言,其W_ LOOP和H_ LOOP无差异的,因此,其将W_ LOOP和H_ LOOP合并一起执行。而对于cwarp 1和cwarp2而言,其W_ LOOP和H_ LOOP是存在差异的,因此分别执行循环。
在步骤810处,如果计算装置100确定当前节点不是循环节点,调用算子生成器。
在步骤812处,计算装置100拼接算子相关的每一维度对应的范围信息,以便基于每一个维度的范围信息生成对应的汇编代码。
通过采用上述手段,本发明可以基于经拆分的调度树生成代码。
图11示出了根据本发明的实施例的用于拆分至针对单计算核的形状的方法1100的流程图。应当理解,方法1100例如可以在图1所描述的计算装置100处执行。方法1100还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤1102处,计算装置100确认用户输入的形状是否包括子张量维度(subtensor)。
在步骤1104处,如果计算装置100确认用户输入的形状包括子张量维度,将子张量维度转将转换至批量维度的形状拆分至针对单计算核的形状换至批量维度,以便生成转换至批量(batch)维度的形状。如果计算装置100确认用户输入的形状不包括子张量(subtensor)维度,则确认用户输入的形状为通常形状。
例如以矩阵乘法累加(MMA)为例,可以包括二维、三维、甚至是更多的维度。子张量(subtensor)维度为维度高于三维的维度。如果计算装置100确认用户输入的形状包括子张量(subtensor)维度,则可以在DNN 先将子张量(subtensor)维度转换至(或称“折叠到”)batch维度。折叠到batch 维度的张量通常被称为大张量(Large Tensor)。
在步骤1106处,计算装置100将转换至批量维度的形状拆分至针对单计算核的形状。
在一些实施例中,计算装置100也针对被确定为通常形状的用户输入的形状进行多计算核(例如,SPC)的拆分,以便生成针对单SPC的形状。
应当理解,尽管每个SPC处理的数据不同,但是核函数的逻辑是相同的。因此,在控制核函数动态循环次数之前,需要将批量维度的形状转换至单SPC的形状。
关于拆分的规则,其例如是尽可能最大化复用。例如,系统包括16个SPC,如果batch比较多,例如有4个batch。会优先拆batch,从外往内拆,使得每4个SPC处理一个batch。针对每4个SPC,之后会拆分H维度、W维度,使得每个SPC大致处理一个Batch的1/4的H。由此,尽可能充分地使用SPC。
图12示出了根据本发明的实施例的用于使得核函数支持动态维度的方法1200的流程图。应当理解,方法1200例如可以在图1所描述的计算装置100处执行。方法1200还可以包括未示出的附加动作和/或可以省略所示出的动作,本发明的范围在此方面不受限制。
在步骤1202处,计算装置100针对矩阵乘法累加,确定子张量维度转换至批量维度之后是否还存在多余的维度。
在步骤1204处,如果计算装置100确定子张量维度转换至批量维度之后还存在多余的维度,通过多次启动同样的核函数的次数,用以使得核函数支持目标动态维度。
例如,如果子张量维度subtensor在转换到(折叠到)batch维度后,还存在多余维度,则在DNN层直接启动(Launch)多次同样的kernel。例如,用户原始输入的形状包括96个batch,系统有16个SPC,则每个SPC处理6个Batch。实现支持动态形状的方式包括多种,一种方式是在生成kernel时,每个SPC在batch维度需要循环6次。另一种方式是在生成kernel时,每个SPC在batch维度需要循环3次,在DNN层直接启动(Launch)2次上述同样的kernel。
应当理解,针对batch维度,存在两种方式支持动态形状。一种是在kernel内部通过寄存器控制body的展开代码的循环次数。另一种是通过将batch拆分成多段,以便生成多个kernel,以及多次启动(Launch)同样的kernel,由此,可以通过控制启动(Launch)同样kernel的次数来支持动态形状。或者通过将启动(Launch)同样kernel的次数和kernel内部循环次数的两种方式结合起来,以便满足支持目标动态形状的需要。
上文所描述的各个过程和处理,例如方法200、600、800、1100、1200、1400,可在计算装置处执行。该计算装置例如包括:至少一个处理器(至少一个图形处理器和至少一个中央处理器);以及与至少一个处理器通信连接的存储器;其中存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行。在一些实施例中,方法200、600、800、1100、1200、1400,可被实现为计算机软件程序或程序产品,其被有形地包含于机器可读介质。在一些实施例中,计算机程序的部分或者全部可以经由只读存储器(Read-Only Memory,ROM)和/或通信单元而被载入和/或安装到计算装置上。当计算机程序被加载到随机存取存储器(Random-access memory, RAM)并由GPU和CPU执行时,可以执行上文描述的方法200、600、800、1100、1200、1400,的一个或多个动作。
本发明可以是方法、装置、系统和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本发明的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的中央处理单元,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的中央处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本申请中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本申请公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本申请保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。
Claims (12)
1.一种用于支持动态形状的计算的方法,其特征在于,所述方法包括:
将用户输入的形状拆分至针对单计算核的形状,以便至少基于针对单计算核的形状确定核函数的循环结构;
将核函数的循环结构分解为内层循环和外层循环,以使得内层循环匹配缓冲区并且循环展开;
将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度,其中,将核函数的循环结构的循环层拆分为循环块,以便通过复用循环块以使得核函数支持动态维度包括:
将核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开;以及
配置寄存器所存储的循环次数,以用于动态控制主体分代码的循环次数。
2.根据权利要求1所述的方法,其特征在于,将用户输入的形状拆分至针对单计算核的形状包括:
确认用户输入的形状是否包括子张量维度;
响应于确认用户输入的形状包括子张量维度,将子张量维度转换至批量维度,以便生成转换至批量维度的形状;以及
将转换至批量维度的形状拆分至针对单计算核的形状。
3.根据权利要求1所述的方法,其特征在于,至少基于针对单计算核的形状确定核函数的循环结构包括:
基于针对单计算核的形状、指令计算的粒度、带宽参数、存储资源,确定核函数的循环结构。
4.根据权利要求3所述的方法,其特征在于,将核函数的循环结构分解为内层循环和外层循环包括:
基于缓冲区的尺寸和带宽比,确定内层循环中各维度的范围;以及
基于内层循环中各维度的范围的最大值,确定与内层循环最接近的外层循环的各维度的循环步长。
5.根据权利要求1所述的方法,其特征在于,将核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开包括:
确定针对单计算核的形状是否支持动态形状;
响应于确定针对单计算核的形状支持动态形状,将核函数的各层循环代码拆分为多段分代码,以便对多段分代码所包括的主体分代码进行循环展开。
6.根据权利要求5所述的方法,其特征在于,确定针对单计算核的形状是否支持动态形状包括:
响应于确定用于矩阵乘法累加的输入矩阵的第一维度和第二维度的乘积大于缓存区尺寸, 使得输入矩阵的第一维度或第二维度支持动态形状。
7.根据权利要求5所述的方法,其特征在于,确定针对单计算核的形状是否支持动态形状包括:
确定用于矩阵乘法累加的输入矩阵的计算公式中的最小循环块的第一维度和第二维度;
响应于确认最小循环块的第一维度大于或者等于 64 * 3,使得最小循环块的第一维度支持动态形状;以及
响应于确认最小循环块的第二维度大于或者等于最小循环步长 乘以3,使得最小循环块的第二维度支持动态形状。
8.根据权利要求5所述的方法,其特征在于,确定针对单计算核的形状是否支持动态形状包括:
对于卷积运算,如果确定批量维度大于或者等于3,使得批量维度总是支持动态形状;以及
如果确定批量维度小于3,使得批量维度总是支持静态形状。
9.根据权利要求1所述的方法,其特征在于,还包括:
针对矩阵乘法累加,确定子张量维度转换至批量维度之后是否还存在多余的维度;以及
响应于确定子张量维度转换至批量维度之后还存在多余的维度,通过多次启动同样的核函数,用以使得核函数支持动态维度。
10.一种计算装置,其特征在于,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-9中任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被机器执行时执行根据权利要求1-9中任一项所述的方法。
12.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序被机器执行时执行根据权利要求1-9中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410072607.4A CN117609670B (zh) | 2024-01-18 | 2024-01-18 | 支持动态形状的计算的方法、装置、介质和程序产品 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410072607.4A CN117609670B (zh) | 2024-01-18 | 2024-01-18 | 支持动态形状的计算的方法、装置、介质和程序产品 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117609670A CN117609670A (zh) | 2024-02-27 |
CN117609670B true CN117609670B (zh) | 2024-04-26 |
Family
ID=89958194
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410072607.4A Active CN117609670B (zh) | 2024-01-18 | 2024-01-18 | 支持动态形状的计算的方法、装置、介质和程序产品 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117609670B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117908967B (zh) * | 2024-03-15 | 2024-05-31 | 北京壁仞科技开发有限公司 | 支持动态形状的计算的方法、装置、介质和程序产品 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104866297A (zh) * | 2014-02-26 | 2015-08-26 | 华为技术有限公司 | 一种优化核函数的方法和装置 |
CN111624631A (zh) * | 2020-05-19 | 2020-09-04 | 中国科学院国家授时中心 | 一种并行化信号质量评估方法 |
CN114841326A (zh) * | 2022-05-19 | 2022-08-02 | 北京百度网讯科技有限公司 | 深度学习框架的算子处理方法、装置、设备和存储介质 |
CN115730507A (zh) * | 2021-08-31 | 2023-03-03 | 阿里云计算有限公司 | 模型引擎的构建、核函数处理方法、设备及存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9367306B2 (en) * | 2011-03-30 | 2016-06-14 | Nvidia Corporation | Method for transforming a multithreaded program for general execution |
US8627018B2 (en) * | 2011-11-18 | 2014-01-07 | Microsoft Corporation | Automatic optimization for programming of many-core architectures |
US10032247B2 (en) * | 2016-06-22 | 2018-07-24 | Palo Alto Research Center Incorporated | System and method for speeding up general matrix-vector multiplication on GPU |
-
2024
- 2024-01-18 CN CN202410072607.4A patent/CN117609670B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104866297A (zh) * | 2014-02-26 | 2015-08-26 | 华为技术有限公司 | 一种优化核函数的方法和装置 |
CN111624631A (zh) * | 2020-05-19 | 2020-09-04 | 中国科学院国家授时中心 | 一种并行化信号质量评估方法 |
CN115730507A (zh) * | 2021-08-31 | 2023-03-03 | 阿里云计算有限公司 | 模型引擎的构建、核函数处理方法、设备及存储介质 |
CN114841326A (zh) * | 2022-05-19 | 2022-08-02 | 北京百度网讯科技有限公司 | 深度学习框架的算子处理方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN117609670A (zh) | 2024-02-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN117609670B (zh) | 支持动态形状的计算的方法、装置、介质和程序产品 | |
CN117591776B (zh) | 用于计算的方法、计算装置、介质和程序产品 | |
US7007271B2 (en) | Method and apparatus for integrated instruction scheduling and register allocation in a postoptimizer | |
EP0843257B1 (en) | Improved code optimiser for pipelined computers | |
JPH0475139A (ja) | ループ並列化装置 | |
JPH0922361A (ja) | データプリフェッチ方法 | |
US7747990B2 (en) | Processors and compiling methods for processors | |
JPWO2008090665A1 (ja) | プログラム並列化方法及び装置 | |
KR19990024036A (ko) | 정수 복원형 장어 명령 프로세서용 프로그램 변환장치 | |
Baudisch et al. | Multithreaded code from synchronous programs: Extracting independent threads for OpenMP | |
JPH11194948A (ja) | コンパイラ最適化アルゴリズム | |
CN117170681A (zh) | 核函数生成方法、装置、电子设备及存储介质 | |
Araujo et al. | Challenges in code generation for embedded processors | |
Labrousse et al. | CREATE-LIFE: a modular design approach for high performance ASICs | |
Bispo et al. | On identifying and optimizing instruction sequences for dynamic compilation | |
KR102062208B1 (ko) | 멀티스레드 프로그램 코드의 변환 장치 및 방법 | |
JP5504879B2 (ja) | マルチスレッド処理方法及びマルチスレッド処理装置 | |
Bezati et al. | High-level synthesis of dynamic dataflow programs on heterogeneous MPSoC platforms | |
CN1670699A (zh) | 一种支持有向有环图的微调度方法 | |
Rajagopalan et al. | Specification of software pipelining using petri nets | |
Yilmaz | Graph Transformation and Specialized Code Generation For Sparse Triangular Solve (SpTRSV) | |
JP2000020482A (ja) | ループ並列化方法 | |
Soldavini et al. | Using Reduced Graphs for Efficient HLS Scheduling | |
Liu et al. | A graph theoretic optimal algorithm for schedule compression in time-multiplexed FPGA partitioning | |
CN113849180B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |