Propeller: 代码布局优化技术简介
上篇文章介绍 BOLT 时,提到了谷歌推出的 Propeller,可以达到和 BOLT 几乎一样的优化效果,同样是基于 profile 信息进行优化,不过是在链接期间操作的。本文就简介一下 Propeller 技术。
上篇文章介绍 BOLT 时,提到了谷歌推出的 Propeller,可以达到和 BOLT 几乎一样的优化效果,同样是基于 profile 信息进行优化,不过是在链接期间操作的。本文就简介一下 Propeller 技术。
优化代码布局(code layout) 是一项对于性能提升的重要优化,目前在编译时和链接时都有对应可行的优化手段。而 BOLT(Binary Optimization and Layout Tool) 则是链接后优化(post-link optimizer),使用基于采样的 profile 信息,甚至可以对已经进行过 FDO(feedback-driven optimization) 和 LTO(link-time optimization) 之后的二进制,再次提升其运行性能,所以这是一个可作为补充的优化手段。根据论文中测试数据,在 FDO 和 LTO 基础上,提升了 GCC 和 Clang 编译器 20.4% 的性能。还可以用来优化没有源码的第三方库。
我们的主观判断是存在成见的:我们特别容易相信在没有足够证据的基础上得出的研究结果,而且研究中对观察样本的收集也不足。
人们把相似度当成一种简单的启发手段(简单地说就是经验法则)来作艰难的判断。对这种启发性手段的依赖必然会造成其预测带有成见(系统性失误)。
简单推荐一个 c++ 工具:C++ Insights,用来从编译器视角去看 c++ 的源码。对于我们了解代码细节很有帮助。
MLGO(Machine Learning Guided Compiler Optimization) 是使用机器学习技术,把 LLVM 中使用启发式(heuristics) 的优化转换成模型预测,对比 LLVM -Oz 优化有近 1.5~6% 的大小优化,性能有近 0.3~1.5% 提升。