LLVM合并机器功能拆分器以减少TLB未命中

2020-09-11 21:32:39

Snehasish Kumar通过llvm-dev llvm-dev at lists.llvm.org Tue Aug 4 17:31:06 PDT 2020问候,我们提供了“Machine Function Splitter”,这是一个将函数分为热部分和冷部分的代码生成优化过程。这个过程利用了LLVM中最近从Propeller项目引入的基本块部分特性。PASS针对具有配置文件覆盖的功能,识别冷块并将其移动到单独的部分。链接器将跨函数的所有冷块组合在一起,减少了碎片,提高了缓存和itlb的利用率。我们的实验表明,与clang bootstrap相比,>;性能提高了2%,比google工作负载提高了约1%,在spec IntRate 2017上平均性能提高了1.6%。谷歌最近的研究表明,积极的、配置文件驱动的性能内联导致了严重的代码膨胀和冰块碎片(AsmDB-Ayers等人的2019<;https://research.google/pubs/pub48320/>;).。我们发现,大多数5KiB或更大的函数都有超过10层深的内联子函数,在每个内联级别都会带来指数级更多的代码,这并不一定都是热门的。通常,即使在最热的函数中,也有大约一半的代码字节从未执行过50%以上的代码字节,但很可能在缓存中。函数拆分是一种众所周知的编译器转换,其主要目标是改善代码局部性以提高性能。Llvm具有中端的、目标不可知的热冷分割通道<;https://llvm.org/devmtg/2019-10/slides/Kumar-HotColdSplitting.pdf>;以及部分内联通道<;https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/IPO/PartialInlining.cpp>;which执行类似的转换,正如作者在最近的电子邮件线程<;https://lists.llvm.org/pipermail/llvm-dev/2020-June/142429.html>;.中所指出的那样。然而,由于各自传递的时间以及所采用的代码提取技术,大型复杂应用程序的总体收益仍有改进的余地。通过将函数拆分推迟到代码生成阶段,我们可以最大限度地增加移除冷代码的机会,并改进代码提取技术。此外,通过很晚地执行函数拆分,较早的遍可以执行更积极的优化。实现我们提出了一种新的机器函数拆分遍,该机器函数拆分遍利用基本块分段功能<;https://reviews.llvm.org/D68063>;来拆分函数,而不需要在中端进行代码提取。在regalloc和所有其他机器遍执行完之后,该遍使用配置文件信息在LLVMCodeGen中很晚的时候识别冷基本块。这使得我们的实现能够在最大化机会的同时精确地评估寒冷地区。每个功能被分成两个部分。热集群包括功能条目和所有非冷的块。所有冷块被重新组合为一个冷段群集<;https://github.com/llvm/llvm-project/blob/5934df0c9abe94fc450fbcf0ceca21cf838840e9/llvm/include/llvm/CodeGen/MachineBasicBlock.h#L63>;.With基本块段,冷段被分配适当的调试和调用帧信息,并作为.text.unlikely段的一部分发出。与Propeller<;https://lists.llvm.org/pipermail/llvm-dev/2019-September/135393.html>;,目前是基本块段功能的主要用户不同,此通道不需要额外的一轮分析,并使用基于现有仪器的FDO或CSFDO轮廓信息。[IMAGE:机器函数拆分器.png]在上图中,函数FOO和BAR分别包含冷块ACH、索引5和E。我们展示了这些函数的可能布局,该布局针对失败进行了优化。注意,所有块都保存在由符号FOO和BAR描述的连续区域中。使用机械功能分离器将冷块(5和E)移动到单独的区段。然后可以将这些块与其他冷块(和函数)一起分组到最终二进制文件中的单独输出部分中。该方法的主要亮点是:-轮廓驱动、轮廓类型不可知的方法。-使用跳跃拆分冷基本块。-不向设置/拆卸功能添加任何附加说明。-运行作为发射组件前的最后一步,不会妨碍任何分析/优化。例外所有EH焊盘无论其冷度如何都分组在一起,是原始功能的一部分。如果ehpad驻留在二进制文件中的不同部分中,则拆分ehpad存在未解决的问题。这仍然是未来工作的一部分。调试信息和CFI调试信息以及CFI指令由底层基本块节框架更新并保持一致。在以下补丁中添加了支持-调试信息(https://reviews.llvm.org/D78851)-cfi(机器功能拆分器和螺旋桨之间的https://reviews.llvm.org/D79978).Distinction)全螺旋桨优化包括功能拆分和布局