Branch Predication

对于使用深度指令流水线的处理器,分支预测能力至关重要。分支预测使得处理器可以在分支指令决断之前就开始执行(预测的)分支路径指令。分支延迟是由于分支预测错误导致的性能损失。对于Pentium 4处理器,正确的分支预测可以达到低至0个时钟周期的分支延迟(即没有延迟)。分支预测错误导致的分支延迟可以达到许多个时钟周期;通常的周期数是流水线的深度。

Intel NetBurst微架构的分支预测机制会预测所有的近跳转指令,包括条件跳转,无条件的CALL和RET,以及间接跳转;但是不会预测远跳转指令,例如,far call,IRET,和软中断指令INTx。

而且,处理器还实现了多个辅助机制来更准确地进行分支预测以及降低采纳分支的成本。

  • 使用分支目标缓冲区,基于指令的线性地址,动态的预测分支的方向和目标地址
  • 如果没有动态预测信息可用,或者不可进行动态预测,则根据分支目标的偏移量进行静态分支预测:后向跳转预测为采纳,前向跳转预测为不采纳(即不发生跳转)
  • 过程调用的返回地址由拥有16个条目的返回地址栈进行预测。
  • Traces of instructions are built across predicted taken branches to avoid branch penalties. (todo: what ‘across’ mean?)

The Static Predictor: 一旦分支指令被译码后,就可以知道分支的方向(前向或后向)。如果在分支目标缓存区中没有有效的信息记录,则静态预测器就会根据分支的方向进行预测。静态预测机制会将后向条件分支指令(具有负位移量的条件跳转指令)预测为采纳(即发生跳转),例如循环结束条件判断分支(参看前面介绍分支跳转术语的章节)。前向分支则被预测为不采纳(即不跳转)。

要利用前跳不采纳和后跳采纳这种静态预测算法的优势,代码需要被安排成可能执行的代码片段紧跟着前向跳转分支指令。后面的优化章节会有一些列子。

Brach Target Buffer:一旦有了分支历史信息,Pentium 4处理器甚至在分支指令完成译码前,基于BTB中先前遇到过的分支指令的历史信息,就可以进行分支预测。使用分支历史表和分支目标缓存区中的信息,根据指令的线性地址预测分支的方向和目标。一旦分支指令完成并退役,分支目标缓存区会根据指令的实际跳转目标地址进行更新。

Return Stack返回指令总是被采纳,但是由于一个过程可能从多个(调用)站点被调用,单一的预测目标是不够的。Pentium 4处理器有一个返回地址栈,可以预测系列过程调用的返回地址。这个栈增加了带有函数调用的循环展开的优势。同样,它也缓和了将某些过程设置为内联的需求,因为有了返回地址栈,过程调用返回的性能成本也减低了。

注1: 带有函数调用的循环展开

for (int i = 0; i < 3; i++)

{

Foo();
}

由于有了返回地址栈,循环展开之后的性能会更有优势。

Foo();

Foo();

Foo();

注2: 降低对内联函数的需求

内联函数直接在调用出展开,减少了函数进入与退出的成本。有了返回地址栈做返回地址预测,则内联函数的性能优势也不太明显了。

即使已经提前正确地预测了分支的方向和目标地址,采纳分支依然可能会降低处理器指令执行的并行性。除非是分支指令正好位于行尾,而跳转目标正好位于行首,否则总是会有一些译码器带宽被耗费在了译码紧跟着分支指令的那些指令(在发生跳转时,即未采纳分支路径上的指令)以及分支目标跳转地址之前的那些指令(从行首开始直到跳转目标地址的那些不会执行的指令)。分支预测器允许分支指令及其目标共存于一个跟踪片缓存行中,这样可以将前端的发射速度最大化。

假设译码器每次处理16字节的指令行且行首按16字节对齐,从下图可以看出译码器带宽耗费在未采纳分支指令和无用指令的译码上。

假设处理器每次处理16字节的指令行且行首按16字节对齐,当分支指令在行尾且目标在行首时,译码器不损失译码带宽。

Branch Hints

Pentium 4处理器提供了一个特性,允许软件向处理器提供提示信息,用来指导分支预测和跟踪片生成硬件,从而增强他们的性能。这些提示以指令前缀的形式置于条件分支指令前。这些前缀在Pentium 4以前的处理器上无效(todo,会不会使程序无法运行在前代处理上?)。使用分支提示信息不保证有性能提升效果,而且它们的功能在不同的实现上也不完全相同。但是,由于分支信息在体系结构层面上可见(即对程序员可见),而且代码可能需要在多种处理器实现上运行,只有在跨实现都可能有性能益处的情况下,才应该使用这些前缀。

分支提示前缀有翻译引擎(例如译码器)解释,用来辅助分支预测器与跟踪片生产硬件。它们只在跟踪片生成阶段被使用,且对已经生成的跟踪片无效果。当分支目标缓存区预测不可用时,分支方向提示信息会覆盖静态预测机制(前向不采纳,后向采纳)。由于分支提示会略微增加代码长度,使用方向提示信息时的推荐方法是通过合理安排代码以达到如下目标:

  • 前向分支具有更大的概率不会被采纳,而且
  • 后向分支具有更大的概率会被采纳。当创建跟踪片时,可用的分支预测信息可以被用来预测代码中的哪个路径或者跟踪片会被采纳,所以分支方向提示信息可以用辅助跟踪片生成硬件沿着最可能的路径生成跟踪片。

Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测相关推荐

  1. Pentium 4处理器架构/微架构/流水线 (6) - NetBurst前端详解 - 取指/译码/缓存

    Intel NetBurst Pipeline Details Front End Pipeline Details 本节讲述的关于流水线前端操作的详细信息可能会对软件在指令预取,分支预测以及执行跟踪 ...

  2. Pentium 4处理器架构/微架构/流水线(1) - 概述

    Pentium 4 Architecture Overview 本节简要的介绍Pentium 4处理器的关键特性.这些特性提供了很好背景知识,用于理解详细的代码优化原则. Pentium 4处理器上用 ...

  3. Intel Core Solo/Duo处理器架构/微架构/流水线 - 前端/数据预取/SSE3

    Intel Core Solo/Duo处理器采用的微架构类似于Pentium M处理器的微架构,但是在性能和功能方面做了进一步的增强,主要包括: Intel智能缓存 – Intel Core Duo的 ...

  4. Intel(R) 处理器产品架构/微架构对照表

    Intel(R) 处理器与微架构对照表 2020/12/23:更新至IceLake/TigerLake微架构 2019/07/09:更新至 2nd Generation Intel® Xeon® Sc ...

  5. Pentium M处理器架构/微架构/流水线(1) - 流水线概述

    Intel® Pentium® M Processor 与Intel NetBurst微架构类似,Intel Pentium M处理器微架构 的流水线也包括3个主要部分: 有序发射前端 乱序超标量执行 ...

  6. Pentium 4处理器架构/微架构/流水线 (9) - NetBurst执行核详解 - 执行单元与发射口

    Execution Units and Issue Ports 每个时钟周期,执行核可能向4个发射口中的1个或多个口分发微指令.在微架构层面,存储操作进一步被分为两个部分:存储数据以及存储地址操作.下 ...

  7. Pentium 4处理器架构/微架构/流水线 (4) - NetBurst框图

    Intel NetBurst Microarchitecture Overview 与前几代处理器一样,Pentium 4的微架构包括3个主要部分: 有序发射前端 乱序超标量执行核 有序退役单元 流水 ...

  8. Pentium 4处理器架构/微架构/流水线 (3) - NetBurst微架构

    Pentium 4 Intel® NetBurst™ Micro-architecture Details Pentium 4处理器是Intel全新NetBurst微架构 的第一代处理器实现(其实也是 ...

  9. Pentium M处理器架构/微架构/流水线 (2) - 数据预取/乱序核/退役单元

    Data Prefetching Intel Pentium M处理器支持3种预取机制: 第一种是硬件指令预取,已在上面章节中讲述 第二种是自动的将数据预取到二级缓存.这个机制基本上与Intel Ne ...

最新文章

  1. Java如何打印异常的堆栈?
  2. python爬百度翻译-python爬取百度翻译的问题以及解决方案
  3. 在循环中删除list中的元素
  4. Windows查杀端口
  5. 杭州高职单招计算机试题,河北省高职单招职业技能练习题20
  6. fcpx视觉特效插件包 - FxFactory for Mac 支持M1芯片
  7. C++结构体:默认构造函数,复制构造函数,重载=运算符
  8. Python 用Django创建自己的博客(2)
  9. 找不到libmmd.dll无法继续执行代码_代码中的软件工程 - xieyupei
  10. 解决问题--Could not get JDBC Connection
  11. c语言中mylist是什么参数,数据结构题集(C语言版)算法设计题解析-第二章
  12. Fortran相关图书推荐
  13. tomcat 官网下载
  14. 阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程
  15. 解决git clone提示Permission denied publickey 问题
  16. android nv位图打印机_通过C#中的comport将位图图像打印到pos打印机
  17. Emacs_快捷键列表
  18. Java面向对象与代码编写
  19. spark提交python程序_Spark任务提交(Spark Submit)
  20. 华为云计算机访问手机软件,华为云电脑来了,只需一个APP就能让手机秒变Windows电脑...

热门文章

  1. 堆排序 Heap Sort
  2. ES6_字符串模板以及其使用
  3. vue请求数据完成后执行_生产库删除数据后怎样执行对应的undo sql来恢复数据?...
  4. php4.3.x 5.2.x,XDEBUG for PHP 5.3.0
  5. 华为手机下拉菜单没了_这才是华为正确的截图方式!别不当回事,白白浪费这么强大的手机...
  6. java继承父类执行顺序_java中子类继承父类程序执行顺序问题
  7. android git 版本管理,Android版本管理(git 和 repo)
  8. c++ array容器 传参_C++ 顺序容器基础知识总结
  9. pythondjango教程_Python 中Django安装和使用教程详解
  10. spring cloud全家桶_吃透这份Github点赞120k的Spring全家桶笔记Offer拿到手软