Branch Prediction Unit

在分支条件决断结果实际计算出来之前,分支预测机制就可以让处理器开始“投机式地”执行预测的分支指令。所有的分支指令都依赖于分支预测单元进行分支预测。分支预测单元实现了下列特性:

  • 16个条目的返回栈缓存区,可以让BPU准确的预测RET指令的返回地址
  • BPU查找(即分支预测)流水线前端排队机制(todo:说的啥?),BPU每次对32字节的指令进行分支预测,是取指单元每次读取的指令的长度的2倍。这个机制使得采纳分支可以无性能损失的被预测。

注意:尽管这个机制通常可以消除采纳分支导致的性能损失,软件层面上还是要认为采纳分支会比未采纳分支消耗更多的资源。

BPU可以对下列的分支类型做预测:

  • 直接调用CALL与跳转JUMP。这些分支目标被当作目标数组,不做采纳或非采纳预测。
  • 间接调用CALL与跳转JUMP。分支目标被预测为或者是单一固定目标,或者是多个可变目标(根据近期程序执行行为)。
  • 条件分支。分支目标被预测为采纳或者不采纳。

后续章节有针对BPU的优化技术。

Instruction Fetch Unit

一次指令读取是通过ITLB在指令缓存和指令预取缓冲区中做16字节对齐的查找,如果命中指令缓存,则读取16字节指令流(也称为一个指令行,或者读取行)到指令预译码器中。典型的程序平均每条指令略小于4个字节。由于绝大部分指令都可以被任一译码器处理,所以单次读取的16字节指令流通常可以在一个时钟周期内译码完毕。

非对齐的分支目标会减少有效指令字节数,减少的字节数是指令行中分支目标地址的偏移量,例如,如果分支目标从第14字节开始,则整个16字节的指令行中,前13个字节都是无用指令,会被废弃。采纳分支也会减少发送给译码器的指令字节数,因为由于分支指令发生跳转,紧跟在分支指令之后的指令不会被发送到译码器进行译码。在一个典型的整型计算程序中,大约平均每10条指令中会发生一次分支跳转,这就会导致大约每3次或4次指令读取中即产生一次“非完整”指令行(由非对齐的分支目标或分支指令跳转导致,这里“非完整”并不是说读取的指令行少于16字节,而是有效的指令字节数少于16字节)。这种情况有时候也可能会导致译码器空闲,被称为前端指令饥饿,或者译码器指令饥饿,即没有足够多的x86指令送给译码器进行处理。

由于流水线其他部分的停顿,前端的指令饥饿通常不是导致性能下降的主因。对于极端快速且使用更大(todo:指长度?)指令的代码(例如使用SSE2 整型指令的多媒体处理程序),使用对齐的分支目标可以避免前端指令饥饿,或许会有性能收益。

Intel Core Enhanced Core架构/微架构/流水线 (5) - 分支预测/指令预取相关推荐

  1. Intel Core Enhanced Core架构/微架构/流水线 (7) - 栈指针跟踪器/微熔合

    Stack Pointer Tracker Intel 64和IA32架构上有几个用于参数传递以及过程进入与退出的常用指令:PUSH,POP,CALL,LEAVE和RET.这些指令隐式得更新栈指针寄存 ...

  2. Pentium Pro架构/流水线及其优化 (3) - 指令流水线/乱序执行核/高速缓存/分支预测/指令预取

    Instruction Pipeline 关于Pentium Pro的指令流水线,我从4个来源看到3种不同的说法:11级,12级和14级(没有13级说,不大吉利吧).其实大同小异,不用纠结到底是多少级 ...

  3. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存

    Intel® Advanced Smart Cache 为了支持单基模上的双处理器核,Intel Core微架构提供了许多优化特性.两个核共享一个二级缓存和总线接口单元,下图中绿色部分标出.本节讲述I ...

  4. Intel Core Enhanced Core架构/微架构/流水线 (13) - 存储转发/访存消歧

    Store forwarding 如果一个读存操作紧跟着写存操作且这两条指令操作同一个内存地址,Intel Core微架构可以直接将写存操作的数据转发给读存操作指令.这个过程被称为存储到读取转发机制, ...

  5. Intel Core Enhanced Core架构/微架构/流水线 (12) - 数据预取

    Data Prefetch to L1 Caches Intel Core微架构提供了2个硬件预取器,可以将数据预取到一级缓存中,由此加速程序访问数据的速度: 数据缓存单元预取器(DCU prefet ...

  6. Intel Core Enhanced Core架构/微架构/流水线 (10) - 先进存储器访问

    Intel® Advanced Memory Access Intel Core微架构中的每个处理器核都包含一个指令缓存和一个一级数据缓存.两个处理器核共享一个2M或4M字节大小的二级混合式缓存(既存 ...

  7. Intel Core Enhanced Core架构/微架构/流水线 (9) - 执行单元发射口旁路时延

    Issue Ports and Execution Units 通过发射口,调度器可以每周期分发6条微指令.Intel Core微架构和Enhanced Intel Core微架构的发射口以及支持的操 ...

  8. Intel Core Enhanced Core架构/微架构/流水线 (8) - 执行核

    Execution Core Intel Core微架构的执行核是超标量的,且可以乱序处理指令.注意:这里没有使用乱序执行指令,用的是乱序处理指令."处理"在这里包括对指令的寄存器 ...

  9. Intel Core Enhanced Core架构/微架构/流水线 (6) - 指令预译码/指令队列/指令译码

    Instruction PreDecode 指令预译码器从指令Cache或者指令预取缓存区中接收16字节的指令流,执行如下的预译码操作: 确定每条指令的长度(注:x86指令是变长指令) 译码每条指令的 ...

最新文章

  1. c++编程 文件系统
  2. mysql集群mysql-cluster安装
  3. WebNumericEdit
  4. Mysql主从复制原理以及实现
  5. linux java 安装 gi_gi的安装和使用
  6. 文献记录(part94)--Clustering and outlier detection using isoperimetric number of trees
  7. [蓝桥杯][历届试题]小朋友排队(树状数组)
  8. chi-squared检验_每位数据科学家都必须具备Chi-S方检验统计量:客户流失中的案例研究
  9. Java中的方法调用有多昂贵
  10. mysql不对称复制数据_mysql UNION all 实现不对称数据统计
  11. DevOps on DevCloud|如何构建Kotlin开发的Android Apps
  12. Android 系统(228)---NITZ网络自动对时功能不起作用
  13. 修改过的Lucida Sans typewriter 字体,另推荐两个不错的编程字体
  14. 博文视点大讲堂第6、7期开课
  15. Python-QQ聊天记录分析-jieba+wordcloud
  16. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件
  17. 浅谈Session并且实现购物车
  18. pycharm 配置 interpreter
  19. NOIP复习篇———动态规划
  20. 如何使用清源 CleanSource SCA 管理开源风险

热门文章

  1. python绘图数字_绘制一个绘图,其中Yaxis文本数据(非数字)和Xaxis数字d
  2. Eclipse插件安装方式
  3. jQuery学习之四---Ajax请求
  4. day22 java的枚举
  5. java redis订单_redis实现对账(集合比较)功能
  6. 数学专业下的计算机科学,被录取到信息与计算科学专业,这个专业什么性质,发展前景如何?...
  7. postgresql 创建用户_PostgreSQL创建用户和修改用户密码
  8. python求平方根的小数_python中的数字和数学运算
  9. java webservice 验证_SOAP header验证WebService接口的访问权限
  10. 硬盘清零工具_WinHex使用方法与使用WinHex恢复硬盘实例