作者:手机用户2602927383 | 来源:互联网 | 2022-12-12 21:19
我试图详细了解当分支预测错误时,skylake CPU管道的各个阶段中的指令会发生什么,以及从正确的分支目标开始执行指令的速度如何。
因此,让我们在这里将两个代码路径标记为红色(一个预测但未实际采用)和绿色(一个已预测但未预期)。所以问题是:1.在红色指令开始被丢弃之前,分支必须经过管道多远(以及在管道的哪个阶段被丢弃)?2.绿色指令(在分支到达的流水线阶段方面)多久可以开始执行?
我看过Agner Fogg的文档和许多讲义,但这些观点并不清楚。
1> Peter Cordes..:
分支执行单元(在端口0和6上)实际上是检查FLAGS或间接分支地址的条件分支还是间接分支。我认为,恢复是在执行单位发现后立即开始的,而不必等待其退役。(这是我的最佳猜测/理解,不一定得到英特尔优化手册的支持。)
分支预测+推测执行将数据依赖与控制依赖解耦,但是分支uop本身确实对EFLAGS或间接地址输入具有数据依赖。
p0上的分支单元只能运行未预测的JCC微指令(或宏融合的JCC微指令),但是这些是通用的。p6上的分支单元是“主要”单元,用于处理已采取的分支。
对于直接分支(jmp rel8/rel32
/ call rel32
),可以在解码时检查预测并重新引导取回阶段,也许会使前端停滞不前,但是我认为永远不需要在后端触发任何类型的恢复。来自错误路径的Uop永远不会为直接无条件分支发出。有用于管道重新引导的性能计数器。
分支错误预测可以使用分支顺序缓冲区快速恢复,这与异常情况下通常回滚到退出状态不同:发生中断时,流水线中的指令会发生什么?。有关在退休之前管道如何将所有内容视为投机的信息,请参阅乱序执行与投机执行。
根据David Kanter的Sandybridge Microarch文章:
Nehalem增强了分支错误预测的恢复能力,该错误预测已被延续到Sandy Bridge中。一旦发现分支预测错误,内核就能在知道正确的路径后立即重新开始解码,与此同时无序的机器正在从错误推测的路径中清除错误。以前,直到管道完全刷新,解码才会恢复。
这是由分支顺序缓冲区启用的“快速恢复”功能,可对有条件和间接分支指令上的重新命名状态进行快照,即使在正常程序中,这些指令也可能会预测错误。但是异常和内存排序机器清除的成本更高。它们确实会发生(尤其是页面错误),但是它们很少见并且更难优化。
快速恢复的关键点是,在ROB + RS(调度程序)中已经存在错误预测分支之前的微指令可以继续执行,而随后的微指令将被丢弃,并且前端将重新定向到正确的地址。因此,如果足够早地准备好JCC uop的输入,那么如果存在较长的依赖链,则在恢复过程中CPU可能会咀嚼大部分分支未命中的损失,则可以将其隐藏。例如,错误地预测了从带有适当长度的循环承载的dep链的循环退出,或除总uop吞吐量或端口6瓶颈以外的任何瓶颈。请参阅避免通过提前计算条件而使管道停顿
如果没有快速恢复,我认为ROB中的所有微词都会被丢弃(即所有未退休的微词)。这里可能有一些中间立场,例如保留已经从ROB分支但已离开调度程序的分支开始执行的微指令。我不知道Merom / Conroe到底做了什么。
相关文章:表征分支误判处罚是一篇有趣的文章,介绍了分支未命中和长缓存未命中如何与ROB交互。它基于简化的管道模型,但是在我看来,它的发现可能适用于Skylake。