Hacker News 中文摘要

RSS订阅

10-20倍速的LLVM -O0后端优化(2020) -- 10-20x Faster LLVM -O0 Back-End (2020)

文章摘要

TPDE-LLVM是一种新型的LLVM后端,其编译速度比传统LLVM -O0后端快10到20倍,同时保持相似的运行时性能,但代码体积增加10-30%。该工具支持LLVM-IR的典型子集,并针对x86-64和AArch64架构。这一开源项目为LLVM社区提供了显著的性能提升,特别是在SPEC CPU 2017基准测试中表现优异。

文章总结

TPDE-LLVM:10-20倍加速的LLVM -O0后端

近日,TPDE团队开源了其快速LLVM基线后端(TPDE-LLVM),该后端在编译速度上比LLVM -O0后端快10-20倍,同时保持了相似的运行时性能,代码体积仅增加10-30%。TPDE-LLVM支持LLVM-IR的典型子集,并仅针对x86-64和AArch64架构。团队在LLVM社区论坛上分享了这一成果,并欢迎讨论和反馈。

性能数据

在SPEC CPU 2017基准测试中,TPDE-LLVM在x86-64架构下的编译速度和代码体积表现如下:

| 基准测试 | 编译时间(O0 IR) | 代码体积(O0 IR) | 编译时间(O1 IR) | 代码体积(O1 IR) | | --- | --- | --- | --- | --- | | 600.perl | 11.39x | 1.27x | 15.06x | 0.97x | | 602.gcc | 12.54x | 1.32x | 17.55x | 1.01x | | 605.mcf | 9.72x | 1.27x | 12.47x | 0.92x | | 620.omnetpp | 21.46x | 1.24x | 26.49x | 1.03x | | 623.xalanc | 18.99x | 1.24x | 24.80x | 0.98x | | 625.x264 | 10.52x | 1.26x | 15.19x | 0.97x | | 631.deepsjeng | 9.60x | 1.25x | 17.56x | 0.97x | | 641.leela | 21.44x | 1.24x | 18.36x | 0.95x | | 657.xz | 10.95x | 1.30x | 15.15x | 0.92x | | 几何平均 | 13.34x | 1.27x | 17.58x | 0.97x |

在AArch64架构下,由于GlobalISel的使用,加速效果更为显著。尽管在优化后的IR上,LLVM的优化后端在运行时性能和代码体积上表现更好(约2倍),但TPDE-LLVM并不打算在这一领域竞争。

工作原理

TPDE-LLVM通过三个主要步骤实现加速:首先进行IR清理和准备,然后进行循环和活跃性分析,最后在代码生成阶段结合降低、寄存器分配和机器代码编码。

功能与未来计划

目前,TPDE-LLVM的目标是支持典型的Clang O0/O1 IR,因此仍有许多未支持的功能。未来计划包括支持更多IR特性、DWARF调试信息以及改进寄存器分配策略。如果有足够的需求,团队还计划支持非ELF平台、非小型PIC代码模型以及其他目标架构。

常见问题

  • 如何使用TPDE-LLVM? TPDE-LLVM可作为库使用(如用于JIT编译),也可作为类似llc的工具,或集成到Clang中(需要打补丁)。
  • 为什么不直接加速LLVM? 团队已经使LLVM 18到20在x86-64上加速了18%,但进一步的加速可能需要更深层次的改动,10倍加速几乎不可能实现。
  • 哪些LLVM-IR改动可以进一步加速编译? 例如,避免在函数内部使用ConstantExpr,以及限制结构体/数组的大小等。

有趣的事实

  • TPDE-LLVM在Instruction中使用4字节的填充来存储指令编号,因为LLVM没有字段来存储辅助数据。
  • 对于有大量前驱的基本块,PHINode::getIncomingValForBlock会导致编译时间呈二次增长,因此团队对这些块进行了优化处理。
  • llvm::successors较慢,团队通过缓存后继块来加速处理。

TPDE-LLVM的开源为LLVM社区提供了一个高效的编译后端选择,未来有望在更多场景中得到应用。

评论总结

评论1(评分:无,作者:__d): - 主要观点:质疑是否需要更新(2020年)。 - 关键引用: - "Needs a (2020)?"(需要更新到2020年吗?)

评论2(评分:无,作者:leoh): - 主要观点:支持提及的内容,并分享个人使用Gentoo时的编译优化经验。 - 关键引用: - "I'm glad they mentioned this."(我很高兴他们提到了这一点。) - "When I use Gentoo, though, always compile with -O8 for extreme performance."(当我使用Gentoo时,总是用-O8编译以获得极致性能。)

总结:评论1对是否需要更新表示疑问,而评论2则对提及的内容表示支持,并分享了个人在使用Gentoo时的编译优化经验。