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

在BOLT中,识别和优化热门的基本块之所以关键,是因为BOLT的主要目标是优化程序以更好地利用硬件特性,特别是指令缓存(ICache)。以下是BOLT如何识别和优化热门基本块的流程:

  1. 收集性能数据:

    • BOLT开始的时候并不知道哪些基本块是“热”的,因此它首先需要运行目标程序并收集性能数据。
    • 使用诸如Linux的perf工具,BOLT记录程序的执行profile,确定哪些基本块和函数被频繁地执行。
    • 这种profile-guided的方法确保BOLT的优化是基于真实的程序行为,而不是某种静态分析或猜测。
  2. 基本块的重新布局:

    • 一旦识别了热门的基本块,BOLT的下一步是确定如何重新布局这些块以优化ICache性能。
    • BOLT会将经常连续执行的基本块放在一起,这样当一个基本块在ICache中时,其后续的基本块很可能也在同一个ICache行或附近的行中。
    • 这减少了ICache不命中的次数,从而提高了性能。
  3. 循环优化:

    • 由于循环中的代码会被反复执行,因此它们通常是性能关键区域。BOLT会特别关注这些区域,确保循环的基本块在物理存储中是连续的。
    • 这不仅优化了ICache的命中率,还有助于减少分支预测错误和其他前端停顿[1]。
  4. 分支预测优化:

    • BOLT不仅考虑ICache,它还尝试减少分支预测错误。通过重新布局基本块,BOLT可以确保热门路径中的分支更容易被正确预测。
  5. 跳转优化:

    • 重新布局基本块可能会导致一些跳转变得更长。BOLT会尝试优化这些跳转,例如通过使用跳转表,或者在可能的情况下,使用更短的跳转指令。
  6. 进一步的数据流和控制流优化:

    • 除了布局优化,BOLT还会尝试其他类型的优化,这些优化可能特别有利于热门基本块。例如,常量传播、死代码消除和其他传统的编译器优化技术。

通过上述流程,BOLT系统地识别和优化热门基本块,从而提高程序的整体性能。这种方法的优势在于它基于真实的程序执行数据,因此优化更有可能在实际运行中产生明显的性能提升。

[1] “前端停顿”是指在处理器的前端(取指、译码阶段)所遇到的各种延迟或阻塞。处理器的前端是指令获取、解码和发射到执行管道的部分。这一阶段的主要任务是以稳定和高效的速度从内存中取得指令,并为后续的执行阶段提供准备好的指令。

前端停顿可能包括:

  1. ICache不命中:如果所需的指令不在指令缓存(ICache)中,处理器需要从内存或更高级的缓存中取得指令,这会导致延迟。

  2. 分支预测错误:现代处理器使用分支预测器来猜测条件分支(例如if语句)会采取哪条路径。如果预测错误,处理器需要撤销错误路径上的指令并加载正确路径的指令,这会导致延迟。

  3. 指令获取带宽限制:由于各种原因,如资源冲突或复杂指令的解码,处理器可能无法在每个周期内从内存中取得最大数量的指令。

  4. 指令队列的阻塞:如果指令队列(一个存储待执行指令的缓冲区)满了,新的指令无法被取出和解码,直到之前的指令完成。

  5. TLB不命中:TLB用于快速翻译虚拟地址到物理地址。TLB不命中会导致处理器需要执行完整的页面表查找,进一步增加延迟。

在优化循环时,降低前端停顿非常关键。因为循环中的指令会被多次执行,所以任何在前端遇到的延迟或阻塞都会被放大。BOLT通过确保循环中的基本块在物理存储上是连续的,可以减少多种前端停顿,从而提高程序的整体性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea - 刷新 Git 分支数据 / 命令刷新 Git 分支数据

一、idea - 刷新 Git 分支数据 idea 找到 fetch 选项,重新获取分支数据 二、命令刷新 Git 分支数据 git fetch参考链接 1. 远程Gitlab新建的分支在IDEA里不显示

jxls导出问题

![请添加图片描述](https://img-blog.csdnimg.cn/bc74c4207818491c93b75e19b3333451.png 为什么最后导出的文件还是按原样导出啊,没有填充数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d4500b9a98c042f6b64a5d0650071303.png

qt多线程使用方式

有5个方式:可以参考这个博客:Qt 中开启线程的五种方式_qt 线程_lucky-billy的博客-CSDN博客 注:为了实现更加灵活的线程管理(因为这5种都有一些不方便之处:QThread需要子类化且不能传参,moveToThread不能传…

【leetcode】459. 重复的子字符串(easy)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “abcabcabcabc” 输出: true 解释: 可由子串 “ab…

ChatGPT等人工智能编写文章的内容今后将成为常态

BuzzFeed股价上涨200%可能标志着“转向人工智能”媒体趋势的开始。 周四,一份内部备忘录被华尔街日报透露BuzzFeed正计划使用ChatGPT聊天机器人-风格文本合成技术来自OpenAI,用于创建个性化盘问和将来可能的其他内容。消息传出后,BuzzFeed的…

ubuntu 20.04 RK3568网络的优先级设置

1、背景 硬件使用RK3568 CPU,操作系统采用ubuntu 20.04 Lxqt桌面的版本。硬件上具有一个有线以太网卡,一个wifi网卡,一个5G网卡。由于操作系统默认的网络优先级为有线网卡的最高,5G网卡次之。在一个业务应用中需要5G网卡的连接外…

文本三剑客之grep命令和awk命令 1.0 版本

grep awk 1.grep命令1.1 基本格式1.2 常用选项 2.awk命令2.1 awk工作原理2.2 awk命令格式2.3 awk常用内置变量 1.grep命令 1.1 基本格式 grep [选项]… 查找条件 目标文件1.2 常用选项 选项功能 -m [ x ]匹配x次 后停止,x为具体数字-v取反 -i忽略字符大小写 -n显示匹配的 …

Dynamic CRM开发 - 实体介绍

实体简介 在CRM中,实体(Entity)是数据的基本载体,也是构建业务逻辑网络的基础节点。 实体可以理解为数据库中的一张表(实体中的字段对应数据库表的字段),比如创建一个实体存储客户信息,创建一个实体存储产品信息,产品实体里可以创建一个查找类型的字段(类似表的外键)…

【Express.js】集成RabbitMQ

集成RabbitMQ 本节我们介绍在 express.js 中集成 rabbitmq. RabbitMQ 是一个消息队列中间件,常用于请求削峰,事务的队列处理,事件订阅机制的实现等。 准备工作 创建一个 express.js 项目(本文基于evp-express-cli)…

【三维编辑】Seal-3D:基于NeRF的交互式像素级编辑

文章目录 摘要一、引言二、方法2.1.基于nerf的编辑问题概述2.2.编辑指导生成2.3.即时预览的两阶段学生训练 三、实验四、代码总结 项目主页: https://windingwind.github.io/seal-3d/ 代码:https://github.com/windingwind/seal-3d/ 论文: https://arxiv.org/pdf/23…

创建一个Spring Boot项目

安装所需软件:首先确保你的计算机上已经安装了Java JDK和Maven构建工具。你可以从官方网站下载并按照说明进行安装。 创建一个新的Spring Boot项目:在命令行或终端中使用Maven命令创建一个新的Spring Boot项目。执行以下命令:mvn archetype:…

阿里云轻量应用服务器_2核4G4M_2核2G3M_性能测评

阿里云轻量应用服务器2核2G3M带宽108元一年,系统盘为50GB高效云盘;轻量服务器2核4G4M带宽,60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动,阿里云百科分享阿里云轻量应用服务器入口: 目录 阿…

【Qt高阶】老Qt都不一定清楚的“QObject线程亲和性”【2023.08.13】

老Qt都不一定清楚的“线程亲和性” 与题目无关 感觉自己还挺2,有粉丝点了那个契约者会给up发个鼓励的话,我还以为是人私信发的,都挨个感谢了,后来才意识到是系统自动发的😣😣😣。 自上上期视频对…

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 使用灯光后,场景中就会产生阴影。物体的背面确实在黑暗中,这称为核心阴影(core shadow)。我们缺少的是落下的阴影(drop shadow)&#…

【数据结构】——栈、队列的相关习题

目录 题型一(栈与队列的基本概念)题型二(栈与队列的综合)题型三(循环队列的判空与判满)题型四(循环链表表示队列)题型五(循环队列的存储)题型六(循…

一文揭秘饿了么跨端技术的演进、实践与落地

跨端技术背景与演进历程 跨端,究竟跨的是哪些端? 自 90 年的万维网出现,而后的三十多年,我们依次经历了 PC 时代、移动时代,以及现在的万物互联(的 IoT )时代,繁荣的背后&#xff…

【Apollo】Apollo-ros版本架构学习与源码分析

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Apollo-ros版本架构学习与源码分析。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&a…

微信小程序如何自定义分享卡片文案和图片

微信小程序提供了onShareAppMessage方法,专门用来监听用户点击页面内转发按钮(button 组件 open-type"share")或右上角菜单“转发”按钮的行为,并自定义转发内容。 > 注意:只有定义了此事件处理函数&…

Android studio 设置安卓手机

参考这个链接 ghttps://developer.android.com/studio/debug/dev-options 列出常用手机的设置,但是我的手机不在此列 Google Pixel Settings > About phone > Build number Samsung Galaxy S8 and later Settings > About phone > Software informa…

git: ‘lfs‘ is not a git command. see ‘git --help‘

在克隆hugging face里面的项目文件的时候,需要用到git lfs,本文介绍安装git lfs方法 在Ubuntu下 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs在Windows下 到这个链…