AMD编译器团队正为LLVM Clang编译器提出一项全新的编译选项-fenable-readonly-thp,用于在编译和链接阶段实现指令透明巨页技术(iTHP)。通过启用该选项,开发人员在链接阶段将程序段对齐至2MB粒度,让可执行文件的代码段能够被系统自动提升为巨页映射,在SPEC CPU基准测试、Geekbench跑分以及其他各类工作负载中都测出了显著的性能提升。
AMD编译器技术团队的Bhuvanendra Kumar N于周二正式对外公布了-fenable-readonly-thp的功能提案,这是该团队为进一步挖掘LLVM工具链性能潜力推出的最新举措。他在征求意见稿(RFC)公告中解释道:
“我们提议新增一项可选启用的Clang特性-fenable-readonly-thp,在编译和链接阶段实现iTHP(指令透明巨页)功能。
该功能会在编译驱动层自动在链接阶段将程序段对齐至2MB(或更大)粒度,自动链接一个轻量启动对象文件,并在进程启动时针对可执行文件的代码段调用madvise(MADV_COLLAPSE)系统调用,让内核能够将默认的4KB普通页映射自动升级为巨页映射。
目前该功能的原型补丁已经开发完成,我们欢迎社区在补丁系列提交至Phabricator代码审核平台前,对这份征求意见稿提出反馈意见……
对于指令占用内存空间极大的大型二进制程序,4KB粒度的代码段映射会导致指令Translation Lookaside Buffer(iTLB,指令地址转译后备缓冲器)命中率过低,最终让程序运行受限于前端取指瓶颈。只要满足对齐要求且进程主动通过madvise()系统调用申请,Linux内核就可以将符合条件的可执行代码段区域自动升级为2MB巨页映射。
此前要实现该优化必须手动编写自定义链接脚本、添加定制启动代码,而由编译器统一管理的可选启用路径,能让这项优化在生产环境的正式构建流程中落地使用。”
目前该功能的原型补丁已经完成开发并通过测试。本次征求意见稿公告中并未公布确切的量化性能数据,仅笼统提及该编译选项可带来性能提升:
“我们在SPEC CPU 2026、Geekbench以及其他基准测试场景(包括CPython、数据库/服务器工作负载、微架构测试)中均测得了性能提升。提升幅度随工作负载类型变化:在解释器、模拟器、类编译器这类代码段体积庞大的工作负载上收益最为显著,部分工作负载性能无明显变化。我们在测试过程中没有观测到大范围的性能倒退问题。”
不过该优化也存在对应的代价:生成的可执行文件体积可能会变大,且程序启动阶段会产生少量额外开销。该iTHP使用选项可在Linux 7.2及以上版本内核上完全正常运行,因为旧版Linux内核仅支持基于临时文件系统(TMPFS)存储的iTHP特性,无法适配本次的新实现。

虽然BOLT二进制布局优化器也能通过优化提升iTLB性能,但和BOLT不同的是,-fenable-readonly-thp选项完全不需要提前对工作负载做性能采样分析等前置操作。
一位谷歌的编译器工程师在回应中表示,他们已经开发出了一个功能类似的库,实现思路和AMD本次提出的方案相近。AMD的目标是将该功能直接合并进入LLVM主线(未来也可能并入GNU工具链),无需用户在系统上额外安装第三方库就能获得该优化能力。
目前该功能的后续走向以及能否成功并入上游主线仍有待观察,感兴趣的用户可以前往LLVM官方论坛查看这份初始提案的完整内容。
转自 AMD Proposes New LLVM iTHP Option For Squeezing More Performance – Phoronix
Linuxeden开源社区