LWN:用BOLT进行内核优化!

BOLT:弥合自动调优和硬件原生性能之间的差距 本文介绍的BOLT基于TVM框架,在GPU平台上进行了进一步的图优化和算子优化,最终将常见的卷积神经网络模型的推理速度提升了2.5倍,搜索时间大大缩减,可以实现20分钟内完成自动搜索调优。... 阅读详情

关注了就能看到更多这么棒的文章哦~

Kernel optimization with BOLT

By Jake Edge
October 25, 2024
LPC
Gemini-1.5-flash translation
https://lwn.net/Articles/993828/

2024 年 Linux Plumbers Conference 的 toolchains track 中的两场演讲探讨了不同的内核优化工具。首先,Maksim Panchenko 介绍了 Meta 在其生产内核中使用的 binary optimization and layout tool(BOLT,二进制优化和布局工具)。BOLT 通过重新排列内核二进制文件来改进代码局部性 (code locality),从而提高性能。还有一篇 后续文章 将会介绍第二场演讲,该演讲探讨了 automatic feedback-directed optimization(AutoFDO,自动反馈导向优化)以及 Google 用于优化其内核的其他相关技术。

Panchenko 首先展示了一张幻灯片,其中列出了使用 BOLT 的一些公司和项目,这些内容可以在他的 幻灯片 或 YouTube 视频 中看到。BOLT 最初是为 Meta 的大型应用程序设计的,但后来发现它也可以加速编译器。例如,从 3.12 版本开始,Python 就使用了它;LLVM、Rust 和其他一些项目也使用了它。

他表示,如果回顾十年前的开源世界,要从应用程序中获得最大性能,就要使用 GCC 或 Clang,并结合 -O3 、profile-guided optimization(PGO,使用配置文件引导的优化)和 link-time optimization(LTO,链接时优化)。但是应用 PGO “有点痛苦”,所以只有那些非常关心性能的人才会使用它。将 PGO 应用于内核更加痛苦,因此大多数公司只是在其内核上使用 -O2 或 -O3 。

Meta 的主要应用程序是一个运行 PHP 代码的虚拟机;大约在 2015 年,这里的开发人员提出了一个二进制优化器的想法,该优化器可以与 GCC 和 Clang 一起工作,以加速生成的代码。BOLT 的效果超出了开发人员的预期;它带来了巨大的收益,并且能够加速编译器本身。自 2016 年以来,Meta 一直在使用它;在整个 Meta 的机群中,“大多数周期都花在了 BOLT 优化的二进制文件上”。BOLT 于 2018 年以 Apache 2.0 许可证开源发布,并自 2022 年起成为 LLVM 的一部分。

2d31ec8951d1753ee001d9f894d0847c.png

通常,开发人员会考虑如何在内存中排列程序的数据结构,但是他们很少考虑代码是如何排列的。但也有一些例外,包括 Linux 内核开发人员,但大多数时候,重点都放在数据缓存上。指令缓存比数据缓存小得多,而且随着时间的推移并没有增长多少,在过去 20 年里,英特尔 CPU 上的指令缓存可能从 32KB 翻倍到 64KB。但是,对于那些不将大部分时间花在紧密循环中的大型应用程序来说,代码在内存中的布局非常重要,因此 BOLT 可以带来很大的改变,他说道。

即使有了 profiling 信息,编译器也没有足够的信息来优化代码布局;事实证明,内联函数会改变 profile 结果。profiling 信息可能指向一个被频繁调用的函数 foo() ,但是当它被内联时,该信息就不存在了。BOLT 对二进制文件进行操作,以观察频繁执行的代码,以便将所有这些代码放在内存中彼此靠近的位置。他表示,自从 2019 年 BOLT 论文 发布以来,其他一些工作,包括 Propeller,也应运而生;然而,它们通常与具体的某个工具链绑定,而 BOLT 可以与 GCC 或 Clang 以及不同的链接器一起使用。

他展示了 HHVM 运行时内存布局的一种热力图,HHVM 是 Meta 用于其大部分工作负载的运行时(runtime)。一张图片显示热点代码分散在各处,而 BOLT 优化后的图片显示所有热代码都集中在内存的同一小区域内。这大大减少了指令缓存未命中、转换后备缓冲区 (TLB) 未命中和 CPU 时间;Panchenko 说,对于 HHVM,BOLT 使性能提高了 7%。

BOLT 是一个链接后的优化器,它针对 ELF 二进制文件进行操作,比如 vmlinux 就是一个例子。即使它是 LLVM 项目的一部分,BOLT 仍然支持 GCC 代码;它还支持“最流行”的架构:x86_64、Arm64 和 RISC-V。

将 BOLT 应用于内核花费了一些时间,主要是为了确保生成的内核能够运行并且不会崩溃。遇到的一个主要问题是找到一个好的基准测试程序来衡量 BOLT 的影响。有很多不同的微基准测试程序可用,但“我找不到任何可扩展的大规模基准测试程序”。最后,他使用了 RocksDB db_bench fillseq 基准测试程序,该程序仅通过切换到 BOLT 优化的内核就显示出 2.5% 的改进。他和 Meta 的其他人在一个 BOLT 优化的内核上运行了公司的一项主要服务,每秒查询数 (QPS) 提高了 2%,“这是相当显著的”。

BOLT 仅更改分支和二进制文件中 基本块 的位置来实现其改进。大多数情况下,为了应用 BOLT,不需要重新编译应用程序;但使用 split functions 构建的程序除外,BOLT 可以比编译器做得更好。应用程序确实需要重新链接才能生成重定位信息。有了这些信息,以及内核运行代表性工作负载的配置文件,BOLT 只需大约四秒钟即可优化 vmlinux ,他说道。

可以使用多种机制生成配置文件,包括英特尔平台上的最后分支记录 (LBR) 功能和其他架构上类似的分支采样功能。如果这些功能不可用,则可以通过检测代码来收集所需的信息,但这比使用 LBR 等方法的开销更大。还有其他选项,但配置文件质量以及 BOLT 优化效果不会那么好。

Panchenko 说,BOLT 需要一个未 strip 过的 vmlinux 二进制文件,因为它使用符号名称来发现代码。BOLT 可以使用定义的文本段和数据段轻松识别 ELF 二进制文件中代码和数据的边界。这些段进一步划分为节,BOLT 使用符号表信息来识别其中的各个函数。

然后 BOLT 反汇编这些函数,但是与 objdump 不同的是,它会“符号化指令的操作数”。然而,区分指令中的常量和地址可能是一个问题。链接器插入的重定位信息对此有所帮助;它可以用来“有效地进行代码的符号反汇编”。

可以使用常规技术(例如 peephole 优化)来优化生成的指令流,但“这不是很有效”。为了对代码进行更多优化,需要某种中间表示 (IR)。Panchenko 说,使用的 IR“本质上是 MC 指令之上的控制流图”;他指的是 LLVM 机器码 (MC) 项目,该项目提供了 BOLT 使用的许多工具和库。这些指令看起来很像汇编代码,但是有些指令可能会被注释或修改,例如,用于区分尾调用(tail call)和其他类型的跳转。“因此,如果你查看 BOLT 反汇编,你会比常规 objdump 更清楚地了解应用程序中正在发生的事情”。

BOLT 使用控制流图中基本块的 profile 信息来确定热点代码所在的位置。然而,为了做出最佳的代码布局决策,最好在每一条边上加上权重,而不仅仅是使用基本块的执行次数来决策。LBR 分析可以提供这些信息,但即使没有这些信息,BOLT 也可以复原出一些关于边权重的信息。

然后就是使用该图来优化代码;“给我们带来大部分收益的主要优化是代码重排序。”可以将基本块组合在一起,以减少代码的指令缓存占用空间。这是通过将函数分解成片段来完成的,其中一些片段是热代码,而另一些片段很少或从未执行过(例如错误处理代码)。编译器已经进行了重排序,但是在函数级别上进行的;BOLT 更进一步,对这些函数片段进行重排序。

他说,一旦生成了新的代码,就有一个问题:把它放在哪里。除非非常关心磁盘空间,否则创建包含热点代码的新文本(text)段会更有效率,新文本段通常会小很多(对于一个很大的二进制文件,“几百兆字节”,最终在新段中的热点代码将少于 20MB)。因此,就磁盘空间而言,开销不大,“而且你的应用程序会变得 快得多 ”。

他表示,向内核二进制文件添加另一个文本段可能不可行,因此他转向了一种“更可行”的替代方案。BOLT 将简单地重写二进制文件中现有的函数;编译器已经根据其分析对这些函数进行了排序,因此 BOLT 有效地利用了这一点。BOLT 可以基于 profile 数据对函数进行更好的排序,但为了轻松对基本块进行重排序,可以牺牲这一小小的收益,他说道。这也有助于避免使代码过度专门化那些仅出现在 profile 测量中的工作负载;对于其他未测量的工作负载,一些冷代码将被执行,但由于编译器的选择,它仍然位于附近。

内核带来了其他挑战,因为它的代码在启动时以及运行时都会被修改。他花了很长时间详细介绍了如何处理这类代码。诸如静态调用、SMP 锁(在单处理器系统上被修补掉)、静态密钥和针对不同子架构的替代指令之类的东西都使用反汇编代码中的注释来处理,这是 BOLT 用来完成其工作的元数据的一部分。对于某些代码,BOLT 根本不对它们进行操作,而其他代码则有优化器可以对其使用的机制。所有这些元数据都可以使用 BOLT 工具转储。

Panchenko 说他跳过了一些主题,例如连续分析,它可以应用于运行时的 BOLT 优化二进制文件;可以生成一个新版本的二进制文件,以反映代码和工作负载的变化。他也跳过了其他 BOLT 应用的优化。最后,他展示了运行 BOLT 产生的一些输出,并指出一个四秒钟的运行演示并不会那么有趣。

[ 我要感谢 LWN 的旅行赞助商 Linux 基金会为我前往维也纳参加 Linux Plumbers Conference 提供的旅行援助。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

54912621267b2412006b4f99a0c5aa56.jpeg

bolt 优化 facebook 开源代码地址: https://github.com/facebookincubator/BOLT ninja-build 环境安装 ninja是一个小型构建系统,专注于速度,和常用的make类似,有一些软件就是基于ninja编译构建的,比如clickhouse数据库就需要依赖ninja,因为最近在研究clickhouse,需要依赖于gcc 7,gtest,ninja等一些组件,所以单独拿出来这些组件记录安装过程,这样会更清晰一些. ninja需要依赖于re2c,否则编译是会报错,re2c 阅读详情

相关推荐

BOLT:Binary Optimization and Layout Tool-一种用于优化二进制文件性能的linux命令行实用程序

螺栓 BOLT是为加速大型应用程序而开发的后链接优化器。 它实现了基于由采样分析器,如Linux聚集执行配置文件优化应用程序的代码布局的改进perf工具。 概述了在BOLT中实施的想法,并讨论了其潜力和当前成果。 输入二进制要求 BOLT在X86-64和AArch64 ELF二进制文件上运行。 二进制文件至少应具有未剥离的符号表,并且为了获得最大的性能提升,它们应与重定位链接( --emit-relocs或-q链接器标志)。 在运行优化之前,BOLT会分解功能并重建控制流程图(CFG)。 由于这是一项艰巨的任务,尤其是在存在间接分支的情况下,我们依靠某些启发式方法来完成此任务。 这些启发式方法已在使用Clang和GCC编译器生成的代码上进行了测试。 C / C ++代码的主要要求是不依赖于代码布局属性,例如函数指针增量。 汇编代码也可以处理。 它的要求包括将代码和数据明确分开,并将数据对

什么是llvm bolt

基于bolt的二进制程序优化

叶玄青的博客 1453

[苹果开发者账号]03 申请APPID、苹果开发者账号 常见问题整理

目录:问题持续更新问题一:提示:抱歉,您暂时不能注册问题二:Apple Developer Support提示:联系我们以继续流程 问题一:提示:抱歉,您暂时不能注册 申请苹果开发者账号,应该先注册AppleID,由于很多都是申请的公司使用的苹果开发者账号。一般操作申请动作的人,可能是新手操作,也可能图方便,有些信息会随便填写。 有些人会把姓名填写为,公司的产品、简称、缩写等等。这是不对的。 还有出生日期也会随便乱填。生日如果填写的不对,会被苹果限制使用一些功能的(苹果给的提示不是太明确)。 当生日填写的

专注于技术开发、项目管理 1万+

LWN:针对二进制格式的一些好用工具!

关注了就能看到更多这么棒的文章哦~Some useful tools for binary formatsFebruary 28, 2023This article was contributed by Koen VervloesemFOSDEMAI assisted translationhttps://lwn.net/Articles/924133/Linux 用户经常使用文本文件;grep、...

Linux News搬运工 2406

Ubuntu 20.04下Cube-Studio云原生平台单机部署全攻略(附避坑指南)

本文详细介绍了在Ubuntu 20.04系统上单机部署Cube-Studio云原生平台的完整流程,包括环境准备、Docker配置、Rancher与Kubernetes集群部署以及Cube-Studio核心组件安装。特别提供了官方文档未涵盖的实战技巧和常见问题解决方案,帮助开发者高效完成部署并避免常见陷阱。

weixin_29313423的博客 464

ArcGIS山体坡度、坡向分析

本篇文章主要记录自己在对山体坡向及坡度分析中的一些操作。

Belence_zhao的博客 7410

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

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

hzq_blog 2440

SpringBoot实现电子发票生成

电子发票是近年来比较流行的一种票据形式,它取代了以往传统的纸质发票,具有减少纸张浪费、方便有效查验等优点。本文将介绍如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。在本文中,我们介绍了如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。

不愧是暮言的博客 6090

LWN:内核开发者的更好的工具!

关注了就能看到更多这么棒的文章哦~Better tools for kernel developersByJonathan CorbetFebruary 6, 2020原文来自:htt...

Linux News搬运工 2448

Honeywell EPKS 核心功能块组态与执行调度实战解析

本文深入解析Honeywell EPKS系统的核心功能块组态与执行调度技术,涵盖控制模块(CM)、顺序控制模块(SCM)和输入输出模块(IOM)的配置方法。通过实战案例分享执行顺序(ORDERINCM)和CEE执行周期的优化策略,帮助工程师提升工业自动化系统的控制精度和运行效率。

weixin_28724319的博客 414

跨模态行人重识别实战:Python复现SYSU-MM01官方评估协议

本文详细介绍了如何用Python复现SYSU-MM01数据集的官方评估协议,以解决原Matlab代码在Python生态中不便使用的问题。文章深入解析了数据集的`indoor`与`all`两种评估模式,并提供了完整的Python代码实现,包括特征加载、相似度计算、Rank-k与mAP指标计算等核心步骤,确保评估结果与官方Matlab版本完全一致,助力跨模态行人重识别研究。

weixin_29081163的博客 99

LWN:AutoFDO以及Propeller优化!

关注了就能看到更多这么棒的文章哦~AutoFDO and PropellerBy Jake EdgeOctober 28, 2024LPCGemini-1.5-flash translationhttps://lwn.net/Articles/995397/Rong Xu 和 Han Shen 在toolchain track环节的讨论中,为2024 年 Linux Plumbers 大会...

Linux News搬运工 2650

YOLOv8改进 | 细节涨点篇 | DySample一种超级轻量的动态上采样算子(效果完爆CARAFE)

本文给大家带来的改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子)。

Snu77的博客 1万+

LWN:用户空间的影子堆栈!

关注了就能看到更多这么棒的文章哦~Shadow stacks for user spaceBy Jonathan CorbetFebruary 21, 2022DeepL assisted...

Linux News搬运工 2230

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BOLT- 识别和优化热门的基本块

这一阶段的主要任务是以稳定和高效的速度从内存中取得指令,并为后续的执行阶段提供准备好的指令。在BOLT中,识别和优化热门的基本块之所以关键,是因为BOLT的主要目标是优化程序以更好地利用硬件特性,特别是指令缓存(ICache)。如果预测错误,处理器需要撤销错误路径上的指令并加载正确路径的指令,这会导致延迟。:如果所需的指令不在指令缓存(ICache)中,处理器需要从内存或更高级的缓存中取得指令,这会导致延迟。:如果指令队列(一个存储待执行指令的缓冲区)满了,新的指令无法被取出和解码,直到之前的指令完成。

青衫客36的博客 1205

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

BOLT- A Practical Binary Optimizer for Data Centers and Beyond

ICache不命中会导致高延迟和高能耗,特别是在使用非均匀内存访问(NUMA)架构的数据中心中。BOLT为数据中心提供了一个有效的工具,通过后链接优化提高了应用程序的性能,从而减少了能耗和延迟。BOLT是一个后链接二进制优化工具,可以重新排序代码,从而减少ICache不命中,提高程序性能。通过使用BOLT,Facebook 为其数据中心内的关键应用程序实现了明显的性能提升。注意: 这只是一个简化和概括的版本,如需深入了解BOLT,建议参考原文论文。

青衫客36的博客 987

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LWN:开源语音助手的希望!

关注了就能看到更多这么棒的文章哦~Hopes and promises for open-source voice assistantsMarch 21, 2023This article was contributed by Koen VervloesemDeepL assisted translationhttps://lwn.net/Articles/926484/2022 年底,Paulu...

Linux News搬运工 2296

【二进制优化 | 性能优化】(篇1)什么是 BOLT(Binary Optimization and Layout Tool)?BOLT 的基本流程是啥?如何使用?

基本块是一段连续的机器指令序列,仅有一个入口(首条指令)和一个出口(最后一条指令),且内部无分支或跳转(除末尾)。调整函数内部基本块的顺序,使高频执行路径(Hot Path)连续排列,减少分支跳转和缓存行切换。将高频调用或共同执行的函数在内存中相邻存放,减少函数调用时的缓存行切换开销。:边权重为基本块之间的跳转频率(如A→B跳转100次,B→C跳转50次)。:将频繁访问的数据结构(如全局变量、常量池)集中存放,提升数据缓存命中率。:最大化“连续执行基本块”的局部性,即跳转频率高的块应相邻。

Mercury_Lc的博客 1421

LWN:定义开源硬件!

关注了就能看到更多这么棒的文章哦~Defining open hardwareOctober 18, 2023This article was contributed by Koen VervloesemChatGPT translationhttps://lwn.net/Articles/945870/开源硬件(或称为开放硬件)是指以类似开源软件的方式开发的硬件。对于开源硬件有一个被广泛接受的定...

Linux News搬运工 2634

编译LLVM RISCV编译器QuickStart

下载代码安装cmake,如果系统没有或者版本比较低,可以用如下方法快速安装安装依赖配置编译,在build目录中,执行ninjaninja。

tugouxp的专栏 3456

使用GCC的PGO(Profile-guided Optimization)优化整个系统

启发来自于巨硬在自家服务器上做的实验,废话不多直接上图微软的方法微软的方法可以看到使用PGO优化的内核还是有一些性能提升的零、前提想要使用PGO编译优化,你的gcc编译器需要开启支持pgo特性,gentoo系统如下 一、内核kernel的优化 然后在新内核下运行系统一段时间,打开各种软件如浏览器、mpv播放器、cmus、办公、编译软件、下载、游戏、steam等等(即将日常用系统的各个软件和场景全部跑一遍),以让内核收集足够全面的profile数据(gcov数据)#注:开启了CONFIG_DEBUG_

天涯路的专栏 6640

LWN:统一Linux 随机数设备!

关注了就能看到更多这么棒的文章哦~Uniting the Linux random-number devicesBy Jake EdgeFebruary 16, 2022DeepL ass...

Linux News搬运工 1143

LWN:多代LRU方案的未来!

当一个 page 被访问时,它们会从较老的一代 list 移动到较新的一代,当需要回收内存时,会先从最古老的一代来开始回收 page。每一代的 page 都会随着时间的推移而变得老化,当最老的一代中的 page 都被回收掉了的时候,就会创造出新的一代。自这项工作的第一次发布以来最大的变动是在 "tier" (层)的定义上,tier 这个词现在被用来细分各代 page,这反过来又可以帮助更好地决定哪些 page 需要回收(reclaim),特别是在那些需要使用大量 buffered I/O 的系统中。

GetnextWindow的专栏 459

SplitFunctions (BOLT) - 优化阅读笔记

将函数拆分成更小的代码片段,从而执行更激进的代码段重排的优化在文件 bolt/lib/Passes/SplitFunctions.cpp。

hzq_blog 728

大规模C++编译性能优化系统OMAX介绍

本文探索&研究了大规模C/C++服务编译性能优化相关技术,优化服务性能,降低机器成本,同时为了支持规模推广应用,降低业务线接入成本,保障优化效果,进行面向云上微服务,开展平台化优化服务系统OMAX建设,并在百度推荐系统上大规模应用,取得线上服务CPU性能优化10%+和上线速度提升40%+双收益,优化后服务运行稳定,性能收益持续。全文11509字,预计阅读时间29分钟。一、背景随着大型互联网公司的业务不断发展,后端C++模块的逻辑处理越来越复杂,且参与开发人员众多,代码质量参差不齐,服务面临性能

lihui49的博客 1126
上一篇: LWN:pidfd 新机制来获取进程信息和自我引用!
下一篇: LWN:AutoFDO以及Propeller优化!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值