CN116450209A - 一种针对cuda程序的反馈式动态优化方法 - Google Patents
一种针对cuda程序的反馈式动态优化方法 Download PDFInfo
- Publication number
- CN116450209A CN116450209A CN202310350878.7A CN202310350878A CN116450209A CN 116450209 A CN116450209 A CN 116450209A CN 202310350878 A CN202310350878 A CN 202310350878A CN 116450209 A CN116450209 A CN 116450209A
- Authority
- CN
- China
- Prior art keywords
- information
- equipment end
- optimization
- branch
- host
- 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
- 238000005457 optimization Methods 0.000 title claims abstract description 97
- 238000000034 method Methods 0.000 title claims abstract description 29
- 230000006870 function Effects 0.000 claims description 68
- 230000015654 memory Effects 0.000 claims description 55
- 238000004458 analytical method Methods 0.000 claims description 22
- HPTJABJPZMULFH-UHFFFAOYSA-N 12-[(Cyclohexylcarbamoyl)amino]dodecanoic acid Chemical compound OC(=O)CCCCCCCCCCCNC(=O)NC1CCCCC1 HPTJABJPZMULFH-UHFFFAOYSA-N 0.000 claims description 19
- 230000003068 static effect Effects 0.000 claims description 16
- 238000007418 data mining Methods 0.000 claims description 14
- 238000004422 calculation algorithm Methods 0.000 claims description 13
- 125000004122 cyclic group Chemical group 0.000 claims description 9
- 238000010276 construction Methods 0.000 claims description 5
- 238000003780 insertion Methods 0.000 claims description 4
- 230000037431 insertion Effects 0.000 claims description 4
- 238000012423 maintenance Methods 0.000 claims description 4
- 230000002688 persistence Effects 0.000 claims description 3
- 230000002829 reductive effect Effects 0.000 claims description 3
- 230000008689 nuclear function Effects 0.000 claims description 2
- 230000002085 persistent effect Effects 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 8
- 230000000694 effects Effects 0.000 description 8
- 230000006872 improvement Effects 0.000 description 3
- 238000000605 extraction Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000006731 degradation reaction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 238000005065 mining Methods 0.000 description 1
- 230000036961 partial effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 239000000126 substance Substances 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/47—Retargetable compilers
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种针对CUDA程序的反馈式动态优化方法,包括步骤:首先收集CUDA程序动态信息,对待优化CUDA程序静态分析,生成最小生成树和分歧分支信息;插桩收集分支分歧、基本块频率和核函数参数信息,执行插桩过的程序得到持久化的运行时信息;接着实施反馈式优化,按照相同CUDA程序加载运行时信息,计算分支概率;根据运行时信息并做出判断和优化,判断是否有价值核函数参数组合,若有,生成新版本核函数;判断是否存在高频一致热点路径,若存在,生成快速循环或控制路径;判断是否存在高频分歧分支,若存在,控制流线性化来减少分歧分支内指令;最终生成优化过的可执行文件,通过以上技术方案,可以使CUDA程序拥有更好的运行时性能。
Description
技术领域
本发明涉及反馈式编译优化技术领域,特别是涉及一种针对CUDA程序的反馈式动态优化方法。
背景技术
在GPGPU程序开发中,CUDA程序可快速上手,但追求极致性能需要深入理解编程模型与GPU硬件架构,这需要大量的背景知识,这对开发人员来说非常困难。当前,在CUDA程序开发中通常会使用采样器如Nsight或者nvprof工具来获得程序的运行时情况,比如指令执行频率、函数执行时间、内存传输情况等等,辅助开发人员找到程序的瓶颈,最终手动优化程序,工具本身的开销十分大,开发者的与工具不断的交互验证的开销更大,CUDA程序的性能调优是个非常耗费时间的工作。
反馈式编译优化是一种利用动态运行时信息如热点信息指导编译器优化的技术,以提高程序的运行时性能。目前有通过软件和硬件的方式追踪CUDA程序,软件追踪会对用户CUDA程序源代码插桩,通常需要高昂的运行开销,但结果准确可自定化收集内容。硬件追踪相较软件追踪具有小的运行开销,但是收集的信息固定不可自定义化,开发人员难以基于此迭代程序。到目前为止,有部分工作通过软件和硬件的方式追踪CUDA程序,通过程序分析定位性能瓶颈并给出优化建议,开发人员需要手动修改源代码。目前针对CUDA程序反馈式编译优化,该领域还没有很好的研究。随着AI等技术的发展,CUDA程序在并行计算中起到日益重要作用,迫切需要提高CUDA程序性能。
针对CUDA程序的运行时收集和反馈式编译优化存在着巨大挑战,主要是CUDA程序的特性造成的。例如GPU本身的硬件架构造成与CPU程序完全不同的运行方式,也意味着不同的运行时信息,CUDA程序通常以线程束(32个线程)为单位执行,遇到分支可能出现线程束中部分线程跳转到一部分代码剩余线程跳转到另一部分代码的情况,这时发生分支分歧,严重影响并行性能。同时,CUDA程序和传统CPU程序在编译优化策略上不同,这不仅体现在不同的运行时信息,还体现在不同的编译优化策略上。同样的反馈式编译优化会给CPU程序带来性能提升,但可能会给CUDA程序带来性能下降。更复杂的是,需要针对CUDA程序的特性设计新的编译优化策略。
发明内容
为解决上述现有技术中存在的问题,本发明针对CUDA程序实现反馈式编译优化,本发明通过以下技术方案来实现。
一种针对CUDA程序的反馈式动态优化方法,其特征在于,包括如下步骤:
S1:获取待优化CUDA源程序,开始获取运行时信息步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化进行静态分析,生成插桩信息;
S2:主机端优化根据所述步骤S1生成的插桩信息,插桩维护设备端内存拷贝、核函数运行时信息和导出逻辑,生成插桩过的可执行文件,运行后生成运行时信息并持久化到硬盘;
S3:再次获取待优化CUDA源程序,开始反馈式优化步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化加载所述步骤S2生成的运行时信息,对待优化的CUDA程序中间代码静态分析计算分支概率并标注;
S4:设备端优化根据加载的核函数参数运行时信息判断是否存在优化机会,如果是,实施版本化核函数,主机端优化同样生成新的核函数调用桩;
S5:设备端优化根据加载的频率信息和分支分歧信息判断是否存在优化机会,如果是,实施快速路径生成,包括快速循环和快速控制路径;
S6:设备端优化根据加载的分支分歧信息判断是否存在优化机会,如果是,实施控制流线性化,减少分歧分支的指令;
S7:生成优化过的可执行文件,运行时性能更好。
上述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S1设备端优化具体包括以下步骤:
S11:设备端优化采用分歧分析算法,得到无法静态确认为一致的分支变量,即得到分歧分支插桩点位和插桩点附近基本块频率;
S12:设备端优化在由分歧分支所得部分基本块频率的基础上,利用最小生成树算法计算剩余频率插桩点位;
S13:设备端优化根据静态分析结果即设备端插桩信息持久化所需的设备内存信息。
上述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S2主机端优化具体包括以下步骤:
S21:主机端优化加载所需的设备内存信息,申请设备端插桩所需额外的设备内存和对应的主机内存,最后注册设备内存;
S22:主机端优化追踪分配、释放和使用设备内存的指针信息,追踪主机端核函数调用桩标量参数信息和指针参数信息;
S23:主机端优化拷贝设备端内存,分别持久化主机端和设备端运行时信息到硬盘;
S24:运行可执行文件得到运行时信息。
上述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S4中版本化核函数将对核函数参数进行优化机会分析具体包括以下步骤:
S41:设备端优化对标量参数运行时数据挖掘,得到有价值的标量参数及其对应实值集合;
S42:设备端优化对指针参数运行时数据挖掘,得到有价值的产生别名概率低的指针参数集合;
S43:设备端优化根据所述步骤S41的标量参数信息和所述S42的指针参数集合判断是否存在优化机会,如果不存在则退出,否则构造新的设备端核函数,将版本化决策持久到硬盘,并继续步骤S44和步骤S45;
S44:主机端优化加载所述步骤S43的版本化优化决策,构造新的核函数调用桩,在原核函数调用桩位置构造标量和指针参数的动态分支判断,跳转到新版核函数调用桩;
S45:主机端优化追踪分配、释放和使用设备内存的指针信息。
上述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S5基于动态分歧信息和频率信息判断是否存在一致热点路径具体包括以下步骤:
S51:设备端优化估计循环次数下限,根据频率和分歧信息估计简单循环的循环次数下限;
S52:设备端优化构造快慢路径,利用循环次数下限构造条件分支区分快慢路径,在快路径中构造已知下限的循环;
S53:设备端优化标记循环展开,为快路径中的循环标记循环展开系数,以便后续优化展开;
S54:设备端优化构建连续区域,利用分歧信息静态分析,找到连续的多个一致分支,融合各个一致分支内和之间的代码构建快速控制路径,减少快路径分支。
上述的一种针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S6基于动态分歧判断是否存在动态分歧频率高的分支具体包括以下步骤:
S61:设备端优化分析代码依赖和指令情况,分析指令依赖,使用上提和下提的方式减少三角形分支的分支内指令;
S62:设备端优化估计当前棱形分支两边可外提指令,如果两边都不存在可外提代码,退出,反之进入步骤S63;
S63:设备端优化外提部分指令,将不可外提指令保留在原分支,为剩余指令构造新的棱形分支,新的棱形分支为当前棱形分支,可能存在外提机会,回到所述步骤S62继续迭代。
本发明采用以上技术方案,具有以下有益效果:
1、本发明通过对CUDA程序的主机端和设备端代码软件插桩,获取动态的分支分歧信息、频率信息和核函数参数信息,从而了解CUDA程序的动态执行情况。
2、通过加载运行时信息,实施分支概率计算、核函数版本化、生成快速循环和控制路径和控制流线性化,从而获得运行时性能更好的CUDA程序。
附图说明
图1是本发明实施例针对CUDA程序的反馈式动态优化方法运行时信息收集和反馈式编译优化流程图。
图2是本发明实施例运行时信息收集架构图。
图3是本发明实施例反馈式优化架构图。
图4是本发明实施例核函数版本化示例程序示意图。
图5是本发明实施例快速循环生成示例程序的程序结构图。
图6是本发明实施例快速控制路径生成示例程序的程序结构图。
图7是本发明实施例控制流线性化示例程序的程序结构图。
具体实施方式
下面结合附图和具体实施例对本发明做进一步详细的说明。
本发明提出一种针对CUDA程序的反馈式动态优化方法,本发明是对CUDA程序的动态运行时信息收集和反馈式优化,通过软件编译框架下主机端和设备端插入软件逻辑实现。与CUDA程序对应的,在NVIDIAGPU硬件上实际执行而非模拟执行;与反馈式动态优化对应的,基于CUDA程序特别的运行时信息指导编译器优化;与软件插桩对应的,基于LLVM编译框架。如图1所示,图1是本发明实施例针对CUDA程序的反馈式动态优化方法运行时信息收集和反馈式编译优化流程图,本实施例的方法包括以下步骤:
S1:获取待优化CUDA源程序,开始获取运行时信息步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化进行静态分析,生成插桩信息。
S2:主机端优化根据所述步骤S1的插桩信息,插桩维护设备端内存拷贝、核函数运行时信息和导出逻辑,生成插桩过的可执行文件,运行后生成运行时信息并持久化到硬盘。
S3:再次获取待优化CUDA源程序,开始反馈式优化步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化加载所述步骤S2的运行时信息,对待优化的CUDA程序中间代码静态分析计算分支概率并标注。
S4:设备端优化根据加载的核函数参数运行时信息判断是否存在优化机会,如果是,实施版本化核函数,主机端优化同样生成新的核函数调用桩。
S5:设备端优化根据加载的频率信息和分支分歧信息判断是否存在优化机会,如果是,实施快速路径生成,包括快速循环和快速控制路径。
S6:设备端优化根据加载的分支分歧信息判断是否存在优化机会,如果是,实施控制流线性化,减少分歧分支的指令。
S7:生成优化过的可执行文件,运行时性能更好。
需要指出的是,步骤S2的输入基于步骤S1,不可交换顺序,步骤S2中步骤分歧信息插桩先于频率插桩,运行时信息插桩顺序可随意交换。步骤S3、S4、S5和S6可相互交换,所述步骤S3到S6的顺序对本发明没有影响。如图2所示,S1、S2为运行时信息收集编译过程。
本实施例所针对的是CUDA语言程序,因此,要求待输入的程序为.cu或.cuh文件所组成的CUDA源代码。对于CUDA源文件,需要将其转换为LLVM IR即中间语言形式,主机端中间语言转换为主机端汇编如x86,设备端中间语言转换为设备端汇编如PTX。上述步骤S1中的“获取”表示“待优化程序”为本发明的输入。因此将.cu或.cuh如何转换为中间语言,以及中间语言如何转换为汇编代码不是本发明所讨论的范畴,不再赘述。
在本实施例步骤S1中,对由.cu文件所组成的CUDA源代码中的.cu文件生成的主机端和设备端中间语言逐个静态分析,输出为静态分析结果,所述步骤S1具体包括以下步骤:
S11:设备端优化采用分歧分析算法,得到无法静态确认为一致的分支变量,即得到分歧分支插桩点位和插桩点附近基本块频率。
S12:设备端优化在由分歧分支所得部分基本块频率的基础上,利用最小生成树算法计算剩余频率插桩点位。
S13:设备端优化根据静态分析结果即设备端插桩信息导出所需的设备内存信息。
进一步的,在步骤S11中,以函数为单位使用工作表算法将分歧信息传播到线程索引变量、内存变量以及对这两种变量的数据依赖和同步依赖的变量,静态分析无法确定分歧频率。由于分歧只会发生在分支处,在分支变量静态确认分歧时,需要记录分支变量一致为真、分支变量一致为假和分支变量分歧的频率。
需要指出的是,在知道上述分支变量分歧的频率后,分支周围的基本块频率也可计算得到。如果存在分支基本块存在多个前继基本块,则分割该基本块使得只存在一个前继基本块。
进一步的,在步骤S12中,以函数为单位对函数的控制流图构建带权重的Kruskal算法构造最小生成树,为了避免重复插桩,将上述分歧信息中已知的边权重设置为最低,最后非最小生成树中的边即为需要插入频率计数器的边。
进一步的,在步骤S13中,根据所述静态分析结果,设备端优化计算每个核函数所需的设备全局内存大小并为之命名,其中分歧信息需要3倍分歧插桩数长度的数组,频率信息需要频率计数器边的数量长度数组,类型都为uint64_t,申请对应设备端全局内存,最后将设备内存信息持久化到硬盘。
接着,设备端优化在控制流图中遍历各个插桩点位插入外部设备库调用,调用所访问的全局内存为插桩点位索引到的分歧或者频率全局内存。对于频率信息,外部调用使用atomic指令自加对应内存数据;对于分歧信息,外部调用使用线程束同步指令计算分歧分支变量一致为真、一致为假和分歧的情况,使用atomic指令自加对应内存。
设备端优化根据静态分析结果即设备端插桩信息持久化所需的设备内存信息,包括全局数据名称、类型、大小信息。
需要指出的是,步骤S13中的外部库为此实例所实现的bitcode库,可以链接到设备端中间代码,将外部调用内联。
在本实施例步骤S2中,输出为插桩过的CUDA可执行文件,运行得到CUDA程序的主机端和设备端运行时信息,所述步骤S2具体包括以下步骤:
S21:主机端优化加载所需的设备内存信息,申请设备端插桩所需额外的设备内存和对应的主机内存,最后注册设备内存。
S22:主机端优化追踪分配、释放和使用设备内存的指针信息,追踪主机端核函数调用桩标量参数信息和指针参数信息。
S23:主机端优化拷贝设备端内存,分别持久化主机端和设备端运行时信息到硬盘。
S24:运行可执行文件得到运行时信息。
进一步的,在步骤S21中,主机端优化加载持久化的设备内存信息,根据设备内存信息在主机端同样申请同样大小、同类型、同名的全局内存,在主机端代码的初始化部分插入调用函数__registerVar,该函数在运行时通过驱动调用将所需的设备内存信息和主机端内存符号绑定,使主机端可访问到设备端内存。
进一步的,在步骤S22中,主机端为动态确定追踪核函数指针之间的别名,追踪设备内存分配和释放调用如cudaMalloc和cudaFree,在cudaMalloc调用后插入外部调用添加记录,包括内存始地址、内存大小并为这块内存编号,在cudaFree前插入外部调用根据指针值删除对应记录。在核函数调用前,插入外部调用记录标量参数值,查询指针所对应内存编号并记录。
进一步的,在步骤S23中,主机端在程序结束处插入外部调用,运行时程序结束会自动调用,将绑定的内存符号通过cudaMemcpyFromSymbol将设备内存拷贝到主机内存并持久化到硬盘,将主机端核函数调用记录持久化到硬盘。
如图3所示,步骤S3、S4、S5、S6和S7为反馈式编译优化流程,在步骤S3中,再次获取同样的CUDA源程序.cu,解析成同样的中间语言,输出为经过转换的中间语言,设备端优化加载硬盘中的运行时信息,由于步骤S11和S12中为了减少开销只插入部分基本块,需要再次计算最小生成树信息,根据频率和分歧信息标注部分基本块频率,接着通过迭代算法将部分基本块频率传播到所有基本块频率,从而根据频率信息计算分支概率,以便触发后续LLVM中的反馈式优化。
此外,需要指出的是,本实施例会在设备端中间语言上标注元信息Metadata,主机端除核函数启动相关代码实施本方法所提反馈式优化,其他部分不做反馈式优化。分支处的权重信息按照LLVM的格式存储在MD_prof中,分支处的分歧信息按照自定义格式存储在MD_pgo4cuda中。
在本实施例步骤S4中,输入为中间代码和运行时信息,输出为插桩和优化过的中间代码,设备端中间代码存在多个核函数版本,主机端中间代码存在分支判断选择合适的核函数版本,如图4所示,数据挖掘得到两个标量和两个指针参数的优化决策,生成新的核函数版本,并通过条件判断跳转到新的核函数。所述步骤S4具体包括以下步骤:
S41:设备端优化对标量参数运行时数据挖掘,得到有价值标量参数及其对应实值集合。
S42:设备端优化对指针参数运行时数据挖掘,得到有价值产生别名概率低的指针参数集合。
S43:设备端优化根据所述步骤S41的标量参数信息和所述步骤S42指针参数信息判断是否存在优化机会,如果不存在则退出,否则构造新的设备端核函数,将版本化决策持久到硬盘。
S44:主机端优化加载上述版本化优化决策,构造新的核函数调用桩。在原核函数调用桩位置构造标量和指针参数的动态分支判断,跳转到新版核函数调用桩。
S45:主机端优化追踪分配、释放和使用设备内存的指针信息。
进一步的,在步骤S41中,设备端优化加载核函数标量参数运行时信息,对每次调用产生的参数索引和参数实值构成参数对序列,对全部调用产生的序列数据挖掘,得到有价值的参数对;标量参数对数据挖掘首先为每个参数对构建唯一标号,记录参数对到标号的正向映射和标号到参数对的反向映射,直接将所有的标号序列输入到Apriori数据挖掘算法,得到多个置信度高且序列长的标号序列,再反向映射回参数对,从而得到标量参数优化决策。
进一步的,在步骤S42中,设备端优化加载核函数指针参数运行时信息,每次调用产生的参数索引和指针所指的设备内存标号构成参数对序列,对所有的序列数据挖掘,得到有价值的参数对。指针参数对数据挖掘对每一次调用产生的参数对序列根据内存标号划分为N个集合,接着深度遍历这N个集合每次从一个集合中选择一个参数对,选择N个参数对后将深度遍历路径中的参数索引加入输入并回溯。将每次核函数参数索引序列构成的输入序列输入Apriori数据挖掘算法,得到多个置信度高且序列长的参数索引序列,从而得到指针参数优化决策。
值得一提的是,上述构造方式中Apriori输入序列中的每个序列中不会出现相同的参数索引,这保证挖掘出的结果不会出现重复参数索引。另外,利用Apriori算法数据挖掘只是本实例中的数据挖掘方式,其他数据挖掘方案不影响本发明。
进一步的,在步骤S43中,根据步骤S41和S42的优化决策,核函数生成新版本的核函数,并将新核函数签名持久化到硬盘。对于标量参数实例化生成新的核函数,即将原参数的所有使用点替换为同类型的常量标量参数实值并移除原参数,新核函数的函数签名发生变化。对于指针参数,为新版本的核函数指针参数标记__restrict__关键字,提示编译器指针之间不会出现别名,新核函数的函数签名不发生变化。另外,这两种生成方式可作用于同一个核函数版本。
进一步的,在步骤S44中,主机端优化加载步骤S41和S42的优化决策,生成新的核函数调用桩,同样的标量参数会改变调用桩签名。在主机端代码的初始化部分插入调用函数__registerKernel,该函数在运行时通过驱动调用将新核函数和新核函数调用桩符号绑定,使主机端可通过调用核函数桩调用核函数。遍历所有核函数调用点,插入外部调用动态判断标量参数是否和新版本核函数一致,指针参数是否互相非别名,接着插入动态分支使得条件满足时跳转到新的核函数版本桩。
进一步的,在步骤S45中,主机端优化行为与步骤S22类似,不过不再记录核函数参数信息。
此外,需要指出的是,步骤S21、S22、S23、S43和S44的外部库为此实例所实现的静态链接库,可以链接到主机端编译生成的可重定向文件中。
本发明实施例步骤S5中,输入为设备端中间代码和运行时信息,输出为优化过的设备端中间代码,会生成多条快速路径,所述步骤S5具体包括以下步骤:
S51:设备端优化估计循环次数下限,根据频率和分歧信息估计简单循环的循环次数下限。
S52:设备端优化构造快慢路径,利用循环次数下限构造条件分支区分快慢路径,在快路径中构造已知下限的循环。
S53:设备端优化标记循环展开,为快路径中的循环标记循环展开系数,以便后续优化展开。
S54:设备端优化构建连续区域,利用分歧信息静态分析,找到连续的多个一致分支,融合各个一致分支内和之间的代码构建快速控制路径,减少快路径中的分支。
步骤S51、S52和S53为生成快速循环,如图5所示,图5是本发明实施例快速循环生成示例程序的程序结构图,图5中左边为优化前程序结构,为两个三角形的热点分支,第二个条件变量为分歧变量,右边为优化后程序结构生成快速控制路径后的程序结构,条件变量需要通过线程束同步投票;步骤S54为生成快速控制路径,如图6所示,图6是本发明实施例快速控制路径生成示例程序的程序结构图,图6中左边为优化前程序结构,优化前程序为简单循环,循环上限为分歧变量,右边为生成快速循环的程序结构,循环下限为128。
进一步的,在步骤S51中,设备端优化估计循环的下限,对所有变量静态分歧分析,如果循环分支变量为一致变量,则通过频率信息计算分支下限,如果循环分支变量为分歧变量,则通过运行时信息计算,如果分歧过多则不实施该优化,通过一致为真和一致为假计算循环下限。如果循环下限过低则不实施优化。
另外,通过LLVM的循环展开分析估计展开循环是否有性能提升,如果没有则不实施优化。
进一步的,在步骤S52中,设备端优化生成动态分支,如果循环变量为一致变量则直接将分支变量大于循环下限作为分支变量,反之通过线程束同步判断是否都满足循环变量大于所估计的循环下限生成分支变量。分支的快速路径为需要生成的循环,满路径为原循环。在快速路径中首先生成循环次数为所估计循环下限的循环,接着生成循环次数为原循环次数减去循环下限的循环。在构造过程中时刻保持变量的支配关系,在合适的位置插入PHI函数。最终完成快速循环的构造。
进一步的,在步骤S53中,设备端优化根据所估计的循环下限,为常数次循环标记循环展开为按展开系数展开或完全展开,后续LLVM优化会展开被标记的循环。
进一步的,在步骤S54中,设备端优化改进了LLVM中原控制高度降低优化,这体现在利用分歧信息静态分析,找到连续的多个偏向基分支本块,融合各个基本块和之间的代码构建快速控制路径,减少快路径分支。
将偏向性基本块的条件判断更改为频率信息和分歧信息共同决策,如果分支变量为一致变量则直接通过频率判断是否存在偏向性,反之判断通过动态分歧信息判断是否经常发生分歧,如果是放弃该基本块,反之,判断一致为真和一致为假的频率是否存在偏向性。
接着,在融合多个基本块代码时,如果分支变量中存在分歧变量,为分歧变量加入线程束同步判断,否则直接取分支变量,最终合取一致变量和分歧变量得到快速路径分支变量。
在本实施例步骤S6中,输入为设备端中间代码和运行时信息,输出为控制流线性化后的设备中间代码,所述步骤S6具体包括以下步骤:
S61:设备端优化分析代码依赖和指令情况,使用上提和下提的方式减少三角形分支的分支内指令。
S62:设备端优化估计当前棱形分支两边可外提指令,如果两边都不存在可外提代码,退出,反之进入下一步。
S63:设备端优化外提部分指令,将不可外提指令保留在原分支,为剩余指令构造新的棱形分支,新的棱形分支为当前棱形分支,可能存在外提机会,回到上一步继续迭代。
进一步的,在步骤S61中,设备端优化根据分歧信息对三角形分支变量做如下判断,如果分支变量不存在分歧变量,则不实施优化,如果分歧信息中分歧频率低,则不实施优化,反之实施优化,调用LLVM中的预测执行优化,上提出安全代码。预测执行优化为LLVM中实现的优化,不属于本发明。
接着,本方法基于预测执行优化下提安全代码,首先从后往前遍历分支内代码,如果指令存在副作用如除法、内存加载、内存存储等,则将该指令和指令操作数相关的所有指令加入不可下提指令集合,这通过工作表算法实现。最终不在不可下提指令集合中的指令为可下提指令,将其移动到分支基本块的后继基本块中,维护支配关系添加PHI函数,由于少了分支,还需要将后继基本块中的原PHI函数更改为select指令。
进一步的,在步骤S62中,设备端优化根据分歧信息对当前棱形分支变量做步骤S61中的判断,判断当前棱形分支中是否存在可上提的指令,如果存在则实施步骤S63中外提,反之结束棱形分支的外提。
进一步的,在步骤S63中,设备端优化分别上提棱形分支两边代码,此时棱形分支两边存在部分副作用指令阻止进一步外提,通过数据依赖分析找到不存在依赖的副作用指令集合,对基本块中非副作用指令集合中的指令构造新的棱形分支,在新的棱形分支与原棱形分支间修复PHI函数,由于构造了新的棱形分支打破了副作用指令的块内依赖,新棱形分支设为当前分支,可能存在新的外提指令,回到S62中迭代。如图7所示,图7是本发明实施例控制流线性化示例程序的程序结构图,图7中最左边为棱形分支代码,存在安全外提和副作用指令,它们自上而下存在数据依赖,中间为控制流线性化后的代码,经历了两次外提,安全指令全被外提,最右边为可能生成的机器指令,短分支以条件指令的方式线性化。
CUDA驱动中的即时编译器会将短的分支转换为带条件的指令,从而减少分支所带来开销。上述棱形分支的优化和下提操作会生成后继基本块中PHI函数个数加分支内副作用指令个数总和的条件指令,在优化进行前即可分析是否实施该优化。
以上所述仅为本发明的较佳实施例,但此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。任何熟悉本专业的技术人员,在不脱离本发明的原理和精神的情况下依据本发明的技术实质对以上实施例所作的任何简单修改,等同变化与修饰,均应包含在本发明的保护范围之内。
Claims (6)
1.一种针对CUDA程序的反馈式动态优化方法,其特征在于,包括如下步骤:
S1:获取待优化CUDA源程序,开始获取运行时信息步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化进行静态分析,生成插桩信息;
S2:主机端优化根据所述步骤S1生成的插桩信息,插桩维护设备端内存拷贝、核函数运行时信息和导出逻辑,生成插桩过的可执行文件,运行后生成运行时信息并持久化到硬盘;
S3:再次获取待优化CUDA源程序,开始反馈式优化步骤,先后获得设备端和主机端中间代码并实施设备端和主机端优化,设备端优化加载所述步骤S2生成的运行时信息,对待优化的CUDA程序中间代码静态分析计算分支概率并标注;
S4:设备端优化根据加载的核函数参数运行时信息判断是否存在优化机会,如果是,实施版本化核函数,主机端优化同样生成新的核函数调用桩;
S5:设备端优化根据加载的频率信息和分支分歧信息判断是否存在优化机会,如果是,实施快速路径生成,包括快速循环和快速控制路径;
S6:设备端优化根据加载的分支分歧信息判断是否存在优化机会,如果是,实施控制流线性化,减少分歧分支的指令;
S7:生成优化过的可执行文件,运行时性能更好。
2.根据权利要求1所述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S1设备端优化具体包括以下步骤:
S11:设备端优化采用分歧分析算法,得到无法静态确认为一致的分支变量,即得到分歧分支插桩点位和插桩点附近基本块频率;
S12:设备端优化在由分歧分支所得部分基本块频率的基础上,利用最小生成树算法计算剩余频率插桩点位;
S13:设备端优化根据静态分析结果即设备端插桩信息持久化所需的设备内存信息。
3.根据权利要求1所述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S2主机端优化具体包括以下步骤:
S21:主机端优化加载所需的设备内存信息,申请设备端插桩所需额外的设备内存和对应的主机内存,最后注册设备内存;
S22:主机端优化追踪分配、释放和使用设备内存的指针信息,追踪主机端核函数调用桩标量参数信息和指针参数信息;
S23:主机端优化拷贝设备端内存,分别持久化主机端和设备端运行时信息到硬盘;
S24:运行可执行文件得到运行时信息。
4.根据权利要求1所述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S4中版本化核函数将对核函数参数进行优化机会分析具体包括以下步骤:
S41:设备端优化对标量参数运行时数据挖掘,得到有价值的标量参数及其对应实值集合;
S42:设备端优化对指针参数运行时数据挖掘,得到有价值的产生别名概率低的指针参数集合;
S43:设备端优化根据所述步骤S41的标量参数信息和所述S42的指针参数集合判断是否存在优化机会,如果不存在则退出,否则构造新的设备端核函数,将版本化决策持久到硬盘,并继续步骤S44和步骤S45;
S44:主机端优化加载所述步骤S43的版本化优化决策,构造新的核函数调用桩,在原核函数调用桩位置构造标量和指针参数的动态分支判断,跳转到新版核函数调用桩;
S45:主机端优化追踪分配、释放和使用设备内存的指针信息。
5.根据权利要求1所述的针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S5基于动态分歧信息和频率信息判断是否存在一致热点路径具体包括以下步骤:
S51:设备端优化估计循环次数下限,根据频率和分歧信息估计简单循环的循环次数下限;
S52:设备端优化构造快慢路径,利用循环次数下限构造条件分支区分快慢路径,在快路径中构造已知下限的循环;
S53:设备端优化标记循环展开,为快路径中的循环标记循环展开系数,以便后续优化展开;
S54:设备端优化构建连续区域,利用分歧信息静态分析,找到连续的多个一致分支,融合各个一致分支内和之间的代码构建快速控制路径,减少快路径分支。
6.根据权利要求1所述的一种针对CUDA程序的反馈式动态优化方法,其特征在于,所述步骤S6基于动态分歧判断是否存在动态分歧频率高的分支具体包括以下步骤:
S61:设备端优化分析代码依赖和指令情况,分析指令依赖,使用上提和下提的方式减少三角形分支的分支内指令;
S62:设备端优化估计当前棱形分支两边可外提指令,如果两边都不存在可外提代码,退出,反之进入步骤S63;
S63:设备端优化外提部分指令,将不可外提指令保留在原分支,为剩余指令构造新的棱形分支,新的棱形分支为当前棱形分支,可能存在外提机会,回到所述步骤S62继续迭代。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310350878.7A CN116450209A (zh) | 2023-04-04 | 2023-04-04 | 一种针对cuda程序的反馈式动态优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310350878.7A CN116450209A (zh) | 2023-04-04 | 2023-04-04 | 一种针对cuda程序的反馈式动态优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116450209A true CN116450209A (zh) | 2023-07-18 |
Family
ID=87128187
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310350878.7A Pending CN116450209A (zh) | 2023-04-04 | 2023-04-04 | 一种针对cuda程序的反馈式动态优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116450209A (zh) |
-
2023
- 2023-04-04 CN CN202310350878.7A patent/CN116450209A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hojjat et al. | The ELDARICA horn solver | |
US6381739B1 (en) | Method and apparatus for hierarchical restructuring of computer code | |
Yang et al. | Memoized symbolic execution | |
US5805863A (en) | Memory pattern analysis tool for use in optimizing computer program code | |
US5768592A (en) | Method and apparatus for managing profile data | |
US7571427B2 (en) | Methods for comparing versions of a program | |
Mock et al. | Calpa: A tool for automating selective dynamic compilation | |
Leopoldseder et al. | Dominance-based duplication simulation (DBDS): code duplication to enable compiler optimizations | |
US20050144602A1 (en) | Methods and apparatus to compile programs to use speculative parallel threads | |
JPH02205929A (ja) | コンパイル方法 | |
Bebenita et al. | Trace-based compilation in execution environments without interpreters | |
JPH02217926A (ja) | コード生成方法 | |
WO2010014981A2 (en) | Method and apparatus for detection and optimization of presumably parallel program regions | |
Previti et al. | Premise set caching for enumerating minimal correction subsets | |
WO2016161130A1 (en) | Field specialization systems and methods for improving program performance | |
CN108932137B (zh) | 一种基于推测多线程的汇编级过程间指针分析方法 | |
Arnold et al. | Improving virtual machine performance using a cross-run profile repository | |
Muller et al. | Modeling and analyzing evaluation cost of CUDA kernels | |
Puschner | A tool for high-level language analysis of worst-case execution times | |
Smith et al. | Incremental dependence analysis for interactive parallelization | |
RU2206119C2 (ru) | Способ получения объектного кода | |
CN116450209A (zh) | 一种针对cuda程序的反馈式动态优化方法 | |
Ayache et al. | Certifying and reasoning on cost annotations in C programs | |
Chang et al. | Profiling for laziness | |
Pinto et al. | A methodology and framework for software memoization of functions |
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 |