【问题标题】:What kind of instructions does the branch predictor speculatively execute?分支预测器推测性地执行什么样的指令?
【发布时间】:2014-07-03 06:11:07
【问题描述】:

我正在阅读有关分支预测的内容,我想知道分支预测器是否会“推测性地”执行任何类型的指令。特别是,我想知道它是否会与硬件通信。

假设你有这样的东西:

while (true) {
   if (condition)
      SendPacketOverNetwork()
   DoSomethingElse()
}

(在汇编级别,if 之后的第一条指令引发中断,或与硬件通信)。如果分支预测器碰巧“猜错了”,在这种情况下会发生什么?如果这不能发生,为什么?分支预测器将执行什么样的指令?我是否误解了分支预测器的作用?

【问题讨论】:

    标签: branch-prediction


    【解决方案1】:

    首先 - 分支预测器不执行任何操作,它只是告诉 CPU 下一条要获取和执行的指令是什么。然后 CPU 将获取下一组指令并将其插入到其管道中,并开始执行它们。

    所有对外部世界产生任何影响的操作(即在核心之外可观察到),只有在相应的指令退出并提交后才会执行。在 CPU 在内核外部有一些专用缓冲以防止推测状态泄漏的情况下,可能存在一些小异常,但效果是一样的 - 即使操作是在内部执行的,直到这一点才能观察到它在哪里提交。存储到内存、端口、断点或任何其他可观察的操作都包括在内。

    一旦分支预测错误,推测状态将被刷新,并且机器中的任何虚假结果,包括比错误预测分支更年轻的所有操作都将回滚(在通常通过排序缓冲区管理的无序 CPU 上)。确切的细节当然取决于实际的微架构。 由于提交是按顺序执行的(即使执行是无序的),它们充当一个收敛点 - 错误预测的分支的执行必须在管道中的那个点之前完成,因此先于任何年轻指令的退休和提交(它们通常被认为是该分支的“阴影”)。因此,任何外部可观察的操作都无法执行,除非它比错误预测的分支更早。

    示例(在故障机器上,因为这是更有趣的情况):

    op1   |         exec          retire     
    op2   |    exec                 retire    
    branch|            exec           retire   
    op3   |   exec                      retire 
    op4   |          exec                 retire
    store |                                 retire    dispatch
            ---------------------------> Time
    

    如果分支在执行时发现其预测错误,则保证在其退休/提交之前或沿管道的任何后续操作(包括执行任何较年轻的存储)之前刷新下一条指令。在更简单的有序机器中,执行本身是有序的,因此分支将在任何较年轻的指令执行之前执行(并且分支解析将是已知的)。

    【讨论】:

    • 很好的答案,非常感谢。你有什么推荐的讲座来扩展分支预测和处理器微架构吗?
    • 一次讲座的主题有点宽泛。对于 comp arch 有好书(Computer Architecture: A Quantitative Approach 被认为是一本普通的教科书,但 uarch 进展非常快),通过分支预测,google 的一些结果似乎是合理的,我知道this one 的作者很好:)
    猜你喜欢
    • 2019-04-23
    • 2020-03-31
    • 2016-07-11
    • 2019-01-27
    • 2019-01-15
    • 2014-01-25
    • 2016-09-14
    • 2014-04-25
    • 2014-03-03
    相关资源
    最近更新 更多