奔腾中的分支预测详细指南

2021年3月31日18:12:50 发表评论 910 次浏览

为什么需要分支预测

  1. 产生的收益流水线可以通过存在程序传输指令(例如JMP, CALL, RET等)来减少
  2. 它们更改了顺序, 导致在程序传输指令无效之后所有进入管线的指令
  3. 因此, 在重新加载管道阶段时, 无需进行任何工作。

分支预测逻辑:

为避免此问题, 奔腾使用了一种称为动态分支预测的方案。在该方案中, 对流水线中当前的分支指令进行预测。该预测将被采用或不被采用。如果预测为真, 则不会刷新管道, 也不会丢失时钟周期。如果预测为假, 则刷新管道并从当前指令重新开始。

它是使用具有256个条目的4种方式设置的关联缓存来实现的。这就是所谓的分支目标缓冲区(BTB)。每行的目录条目包括:

  • 有效位:指示条目是否有效。
  • 历史记录位:跟踪多久采取一次。

源存储器地址是从中提取分支指令的位置。如果目录条目有效, 则分支的目标地址存储在BTB中的相应数据条目中。

分支预测的工作:

  1. BTB是一个后备缓存, 位于2条管道的Decode Instruction(DI)阶段的一侧, 并监视分支指令。
  2. 分支指令第一次进入管道时, BTB使用其源存储器在高速缓存中执行查找。
  3. 由于之前从未见过该指令, 因此是BTB错过了。它预测即使是无条件跳转指令也不会采用该分支。
  4. 当指令到达EU(执行单元)时, 将采用或不采用分支。如果采用, 将从分支目标地址中提取下一条要执行的指令。如果不采取, 将有顺序的指令获取。
  5. 当第一次进行分支时, 执行单元将反馈提供给分支预测。分支目标地址被发送回, 并记录在BTB中。
  6. 将创建一个包含源内存地址的目录条目, 并且将历史位设置为强置。
奔腾中的分支预测1

下表说明了该图:

历史位 结果描述 做出预测 如果采取分支 如果没有采取分支
11 强烈推荐 采取的分支 保持相同状态 降级为弱势
10 弱摄 采取的分支 升级为强烈推荐 降级为弱未采取
01 弱不服用 没有分支 升级为弱摄 降级为强烈不参加
00 强烈不采取 没有分支 升级为弱未采取 保持相同状态

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: