=============== 第一部分:branch prediction ===========

1. 最简单的分支预测:总是预测下一条指令的地址在 PC+4

如何让这种分支预测更加有效呢?

Idea1: 让程序中的下一条指令更有可能是实际运行中的下一条指令(基于profile的代码放置)

Idea2: 尽可能去除掉程序中的控制流指令

Idea3: 把多个分支条件组合成一个分支条件,从而只需要一个分支指令

Idea4: 把控制依赖转化成数据依赖(比如使用一种条件move指令,CMOV)

以下是一个CMOV(条件执行)的例子:

可以看到一共是三条指令,替换掉了原先的带有分支跳转(修改PC)的三条指令

看起来,指令并没有减少。但这里的好处是,可以保证下一条指令是PC+4,避免了流水线的冲刷

像ADDt 这样的指令目前还不存在于任何ISA中,因为这需要让ADDt 支持三个数据源,这将大幅修改ISA,影响到我们现有的软件、优化技术。

下图(标题是Predicated Execution)是执行预测的优缺点:

====================== 第二部分:branch delay slot ========================

解释一下上面这张PPT:

延迟branch技术指的是,把N个指令移动到分支指令的后面,这N个指令都是不会影响分支结果的,无论分支的结果如何,它们总会被执行

使用延迟branch技术之后,流水线在执行分支指令时,会继续执行后面的N个指令,在后面N个指令执行完毕后,流水线也已经知道了分支指令的结果,此时可以无延迟直接跳到目标地址

解释一下:

delay branch with squashing 的意义是(squash: 去除、制止、碾碎)

执行到BC X这行时,IF阶段提取指令A,过了一个周期后,若上一周期的BC X的结果为TRUE,则这一周期EX阶段正常执行指令A,否则,EX阶段抛弃指令A。接着,IF阶段回去提取指令B。

好处:相比于放置气泡指令,这种方法又获得了性能提升

如图是 delayed branching 的优缺点

(38:00) 开始提到数据独立性(RAW, WAW, WAR)了

Onur Mutlu 18-447 Lecture9 分支预测-1的更多相关文章

  1. 现代中央处理器(CPU)是怎样进行分支预测的?

    人们一直追求CPU分支预测的准确率,论文Simultaneous Subordinate Microthreading (SSMT)中给了一组数据,如果分支预测的准确率是100%,大多数应用的IPC会 ...

  2. GCC的分支预测优化__builtin_expect

    智能指针笔记 GCC的原子操作函数 将流水线引入cpu,可以提高cpu的效率.更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率.如下图所示: 取指令 执行指令 输出结果 取指令 执行 ...

  3. __builtin_expect — 分支预测优化

    1.引言 在很多源码如Linux内核.Glib等,我们都能看到likely()和unlikely()这两个宏,通常这两个宏定义是下面这样的形式. #define likely(x) __builtin ...

  4. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  5. CPU 分支预测

    去年在安宁庄的时候, 有个同事阐述了一个观点:php中的if else  在执行时考虑到效率的原因,不会按我们的代码的顺序一条一条去试,而是随机找出一个分支,执行,如果不对,再随机找到一个分支 当时由 ...

  6. 【操作系统之十二】分支预测、CPU亲和性(affinity)

    一.分支预测 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕 ...

  7. 分支预测(branch prediction)

    记录一个在StackOverflow上看到一个十分有趣的问题:问题. 高票答案的优化方法: 首先找到罪魁祸首: if (data[c] >= 128) sum += data[c]; 优化方案使 ...

  8. 从一段 Dubbo 源码到 CPU 分支预测的一次探险之旅

    每个时代,都不会亏待会学习的人. 大家好,我是 yes. 这次本来是打算写一篇 RocketMQ 相关文章的,但是被插队了,我也是没想到的. 说来也是巧最近在看 Dubbo 源码,然后发现了一处很奇怪 ...

  9. 如何在代码层面提供CPU分支预测效率

    关于分支预测的基本概念和详细算法可以参考我之前写的知乎回答,基本概念不再阐述了~~ https://www.zhihu.com/question/486239354/answer/2410692045 ...

  10. C/C++ 分支预测(likely unlikely)

    看一些代码时,会遇到likely unlikely, 查了查网上的资料,结合自己的理解记录一下. 1. 一些概念 指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令.分析指令到 ...

随机推荐

  1. .net5 winform 打开文件夹

    直接使用System.Diagnostics.Process.Start("路径"),有可能会包拒绝访问的异常,建议采用以下写法: var  newPath="" ...

  2. 提供一个方法,遍历获取HashMap<String,String>中的所有value,并存放在list中返回,考虑泛型的使用

    public List<String> getValueList(HashMap<String,String> map){ ArrayList<String> va ...

  3. Github好用的镜像网站

    最近Github越来越不好用了,发现一个特别好用的镜像网站,无论是进入还是下载都非常的快. https://hub.yzuu.cf/ 首页和Github没有任何区别, 注意请不要在连着梯子的时候使用, ...

  4. web开发(1): html简介/ sublime text3使用/VScode使用

    导论 web设计概述 web的核心特征是超链接. web应用:浏览器看新闻:访问网页 非web的网络应用: QQ. 微信 web的组织:W3C 1994年成立,负责管理和维护与web相关的各种技术标准 ...

  5. Pytest 固件

    一.固件使用背景 在执行测试用例时,我们常常需要在测试用例执行的前后去完成一些额外的操作.例如针对于 Web 测试,在用例执行前需要打开浏览器,完成用户登录等一系列前置操作:在用例执行完成后,要清除浏 ...

  6. java实现读取json文件指定字段值

    使用场景 现有一个大数据的json文件,每条数据有多层数据信息.现在想把其中某个字段提取并叠加计算. json文件格式 1 { 2 "MsgID":"111", ...

  7. Linux学习 --- 网络基础知识

    1.1  IP地址 IP地址由两部分组成  网络号和主机号 .网络号为IP地址的高位组成,而主机号是IP地址的低位组成,两个的大小取决于网络的类型. IP地址根据网络的地址不同分为:A类,B类,C类, ...

  8. 用requests-html和SelectorGadget轻松精准抓取网页数据

    我们在抓取网页数据时,最常採用Python的requests搭配BeautifulSoup的模式来完成.然而,requests-html整合了上述2个套件,又添加了新的功能,或许是抓取网页数据值得考虑 ...

  9. Fiddler抓包原理与操作

    https://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html#2306864

  10. AcWing 839. 模拟堆 2022/5/30

    关键代码: void head_swap(int a, int b){ swap(ph[hp[a]], ph[hp[b]]); swap(hp[a], hp[b]); swap(h[a], h[b]) ...