📜  奔腾中的分支预测

📅  最后修改于: 2021-06-28 15:42:28             🧑  作者: Mango

为什么需要分支预测?

  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. 将创建一个包含源内存地址的目录条目,并且将历史记录位设置为强置。

下表说明了该图:

History Bits Resulting Description Prediction made If branch taken If branch not taken
11 Strongly Taken Branch Taken Remains in same state Downgraded to weakly taken
10 Weakly Taken Branch Taken Upgraded to strongly taken Downgraded to weakly not taken
01 Weakly Not Taken Branch Not Taken Upgraded to weakly taken Downgraded to strongly not taken
00 Strongly Not Taken Branch Not Taken Upgraded to weakly not taken Remains in same state