当前位置: 首页 > news >正文

BOLT: 一个实用的二进制优化器 - 笔记

BOLT: 一个实用的二进制优化器

一、导言

虽然在早期注入配置文件可以通过更多的优化使用,但稍后注入可以更准确的使用信息,以获得更好的代码布局。

提供的例子 BOLT 对大型程序在 FDO/PGO 基础上性能提供 20.4%,来源主要是代码布局的改进。

总结来讲,论文做了下面几点贡献:

  • 1、描述了基于LLVM架构的链路优化
  • 2、证明 后链接优化可更好的利用分析数据
  • 3、表明 编译时、链接时、后链接 FDO 之间互补而非互相替代。

二、MOTIVATION

A、为什么基于采样

FDO 被证明有用,插桩有两个缺点:

  • 1、构建过程复杂
  • 2、通常有CPU和内存开销

利用现代 CPU 的最后分支记录硬件 LBR 收集开销几乎可忽略

B、为什么是二进制优化器

FDO 都面临两个权衡:更早注入配置数据允许沿管道进行更多优化,映射级别越接近记录级别,结果越准确。链接后二进制优化允许perf采样以最高精度使用配置文件。

IR 级别的数据映射常见问题是 函数在两个 caller 都内联

C、为啥是静态二进制优化器

什么是动静态没看懂?

三、 ARCHITECTURE

A、初步设计

最开始通过增量增加二进制代码覆盖率来开发 BOLT, 完全依赖 ELF 符号表。

代码大小可能增加,原因可能是冷路径上分支数增加,其次是X86条件分支指令的一些特点(没懂)。

B、重定位模式

这能允许我们改变二进制文件中所以函数的位置。BFD 和 Gold 等都提供了 --emit-relocs, 不过还是有一些缺失如连接器删除 PIC 跳转表的相对偏移和其他一些连接器也不可见的重定位(如单编译单元的 local func 的 func 引用由编译器内部处理)

选择其他连接器变化太多,所以编写了一个独立的后链接优化器。

C、Rewriting Pipeline

分析任意二进制文件并定位代码和数据绝非易事。分析时 bolt 会同时使用符号表和帧信息。

重写流程图略

LLVM 架构非常棒

重写的下个流程是为每个函数构建控制流图CFG, 使用 MCInst 结构构建…

D. C++异常和调试信息

支持

四、优化

15个非常有效果的优化项:

PassName Description
strip-rep-retStrip repz from repz retq instructions used for legacy AMD processors
icfIdentical code folding
icpIndirect call promotion
peepholesSimple peephole optimizations
simplify-ro-loadsFetch constant data in .rodata whose address is known statically and mutate a load into a mov
icfIdentical code folding (second run)
pltRemove indirection from PLT calls
reorder-bbsReorder basic blocks and split hot/cold blocks into separate sections (layout optimization)
peepholesSimple peephole optimizations (second run)
uceEliminate unreachable basic blocks
fixup-branchesFix basic block terminator instructions to match the CFG and the current layout (redone by reorder-bbs)
reorder-functionsApply HFSort [3] to reorder functions (layout optimization)
sctcSimplify conditional tail calls
frame-optsRemoves unnecessary caller-saved register spilling
shrink-wrappingMoves callee-saved register spills closer to where they are needed, if profiling data shows it is better to do so

五、采样技术

LBR 不仅为关键边提供了准确计数(完美使用BB计数也没法做到),还使块布局算法对不良采样率更有弹性。

总之多方面说明 LBR 最好。

六、 EVALUATION

测量几款应用,性能有提升,原因主要从下面几项指标找:

    1. CPU Time
    1. Branch
    1. I-Cache
    1. I-TLB
    1. D-Cache
    1. D-TLB
    1. LLC

7、相关工作

8、结论

主要为了缓解 缓存、TLB 和分支预测起的压力

相关文章:

  • 建设济南公司网站/青岛网站建设公司
  • 1688网站建设/网站制作详细流程
  • 微应用和微网站的区别是什么/网站设计框架
  • dw中做网站的步骤/seo怎么做优化方案
  • 湖南专业做网站公司排名/软文推广代理平台
  • 做网站主图多少钱/网站页面分析
  • mysql快速生成100W条测试数据(7)虚拟网站、IP地址并存入mysql数据库
  • 【Java寒假打卡】Java基础-并发工具类
  • 谷歌搜索引擎排名规则(谷歌 seo 外链重要还是内容重要)
  • 基于PHP的宠物社会化小程序
  • 性能测试时那些「难以启齿」的问题-CPU相关
  • Ubuntu 22.04配置静态IP地址
  • 买车是个计算题,看上了比亚迪的宋DMI,选择困难了,选择55km的还是,110km的,理科生一起计算下。
  • Python编程 闭包
  • 编解码标准-H.264
  • 【Java集合】Collection 体系集合详解(ArrayList,LinkedList,HashSet,TreeSet...)
  • 寒假集训一期(4)——STL容器整理合集(上)
  • 2023年1月Free Excel 打卡