Optimization 分支目标缓冲区检测到哪个分支预测失误?

Optimization 分支目标缓冲区检测到哪个分支预测失误?,optimization,intel,computer-architecture,cpu-architecture,branch-prediction,Optimization,Intel,Computer Architecture,Cpu Architecture,Branch Prediction,我目前正在研究CPU管道的各个部分,它们可以检测分支预测失误。我发现这些是: 分支目标缓冲区(BPU清除) 分支地址计算器(BA清除) 跳转执行单元(此处不确定信号名称??) 我知道2和3检测到什么,但我不了解在BTB内检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支、BTB未能检测到分支或BTB错误预测了x86 RET指令的目标地址的位置。执行单元评估分支并确定其是否正确 在分支目标缓冲区检测到哪种类型的预测失误?这里究竟检测到什么是预测失误? 我能找到的唯一线索是《英特尔开发

我目前正在研究CPU管道的各个部分,它们可以检测分支预测失误。我发现这些是:

  • 分支目标缓冲区(BPU清除)
  • 分支地址计算器(BA清除)
  • 跳转执行单元(此处不确定信号名称??)
  • 我知道2和3检测到什么,但我不了解在BTB内检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支、BTB未能检测到分支或BTB错误预测了x86 RET指令的目标地址的位置。执行单元评估分支并确定其是否正确

    在分支目标缓冲区检测到哪种类型的预测失误?这里究竟检测到什么是预测失误?

    我能找到的唯一线索是《英特尔开发人员手册》第三卷(底部的两个BPU清除事件计数器):

    BPU在错误地假设一个分支为 还没拿

    这似乎意味着预测不是“同步”进行的,而是“异步”进行的,因此“错误假设后”

    更新:

    罗斯,这是CPU分支电路,来自最初的英特尔专利(如何“读取”?):

    我没有看到“分支预测单元”吗?读过本文的人会认为“BPU”是一种将BTB电路、BTB缓存、BAC和RSB组合在一起的惰性方式,这是否合理


    所以我的问题仍然存在,哪个组件发出BPU清除信号?

    这是一个好问题!我认为它引起的混乱是由于英特尔奇怪的命名方案,这常常使学术界的标准术语过载。我会尽力回答你的问题,也会澄清我在评论中看到的困惑

    首先。我同意在标准的计算机科学术语中,分支目标缓冲区不是分支预测器的同义词。然而,在英特尔术语中,分支目标缓冲区(BTB)[大写]是一种特定的东西,它包含一个预测器和一个分支目标缓冲区缓存(BTBC),后者只是一个分支指令表及其在执行结果上的目标。这个BTBC被大多数人理解为分支目标缓冲区[小写]。那么什么是分支地址计算器(BAC),如果我们有BTB,为什么我们需要它呢

    因此,您知道现代处理器被分成多个阶段的管道。无论这是一个简单的流水线处理器还是一个无序的超极处理器,第一阶段通常是先提取然后解码。在fetch阶段,我们所拥有的只是程序计数器(PC)中包含的当前指令的地址。我们使用PC从内存中加载字节并将其发送到解码阶段。在大多数情况下,我们增加PC以加载后续指令,但在其他情况下,我们处理的控制流指令可以完全修改PC的内容

    BTB的目的是猜测PC中的地址是否指向分支指令,如果是,PC中的下一个地址应该是什么?这很好,我们可以对条件分支使用预测器,对下一个地址使用BTBC。如果预测是正确的,那就太好了!如果预测是错误的,那会怎样?如果BTB是我们拥有的唯一单元,那么我们必须等待分支到达管道的发布/执行阶段。我们必须冲洗管道,然后重新开始。但并非所有情况都需要这么晚才能解决。这就是分支地址计算器(BAC)的作用

    BTB用于管道的提取阶段,但BAC位于解码阶段。一旦我们获取的指令被解码,我们实际上就有了更多有用的信息。我们知道的第一条新信息是:“我获取的指令实际上是一个分支吗?”在获取阶段,我们不知道,BTB只能猜测,但在解码阶段,我们肯定知道它。当指令实际上不是分支时,BTB预测分支是可能的;在这种情况下,BAC将停止提取单元,修复BTB,并正确重新初始化提取

    无条件相对
    调用
    这样的分支呢?这些可以在解码阶段进行验证。BAC将检查BTB,查看BTBC中是否有条目,并将预测器设置为始终预测所采取的措施。对于
    条件分支
    分支,BAC无法确认它们是否已被占用/尚未占用,但它至少可以验证预测的地址,并在地址预测错误的情况下纠正BTB。有时BTB根本无法识别/预测分支。BAC需要纠正此问题,并向BTB提供有关此指令的新信息。由于BAC本身没有条件预测器,因此它使用一种简单的机制(向后分支,向前分支不被执行)

    需要有人确认我对这些硬件计数器的理解,但我相信它们的含义如下:

    • BACLEAR.CLEAR
      在获取中的BTB执行错误操作时递增 作业和解码中的BAC可以修复它
    • BPU_清除。早期
      当fetch决定(错误地)加载下一个 在BTB预测它应该从中实际加载之前的指令 取而代之的是这条路。这是因为BTB需要多个周期,fetch使用该时间推测性地加载连续的指令块。这可能是由于Intel使用了两个BTB,一个快速,另一个较慢但更精确。需要更多的周期才能得到更好的预测

    这解释了为什么在BTB中检测到预测失误的惩罚是2/3个周期,而在BAC中检测到预测失误的惩罚是8个周期。

    事实
    BPU\u清除。早期