首页 文章

分支预测如何与指令指针交互

提问于
浏览
3

我的理解是,在处理器流水线的开头,指令指针(指向要执行的下一条指令的地址)在读取后由分支预测器更新,以便可以在下一个周期获取该新地址 .

但是,如果在管道的早期修改指令指针,这是否会影响当前处于执行阶段的指令,这些指令可能依赖于旧的指令指针值?例如,在执行 call 时,需要将当前EIP推入堆栈,但在分支预测期间更新指令指针时不会受到影响吗?

1 回答

  • 8

    您似乎假设只有一个物理EIP寄存器被整个CPU内核使用 .

    这不起作用,因为每个可能发生异常的指令都需要知道自己的地址 . 或者当外部中断到来时,CPU可以决定在任何指令之后服务中断,使其成为架构EIP . 在长模式(x86-64)中,还有RIP相对寻址模式,因此 call 不是唯一需要当前程序计数器作为数据的指令 .

    一个简单的流水线CPU可能为每个管道阶段都有一个EIP .

    A modern superscalar out-of-order x86 associates an EIP (or RIP) with each in-flight instruction (or maybe each uop ;但是多uop指令将所有uop相互关联,因此指令不能部分退出 . )

    与架构状态的其他部分(例如EFLAGS,EAX等)不同,该值在解码后是静态已知的 . 实际上甚至比直接 Value 更早;在预解码阶段(或在L1i高速缓存中标记)检测指令边界,以便可以将多个指令并行地馈送到多个解码器 .

    早期的提取/解码阶段可能只跟踪16字节或32字节提取块的地址,但在解码之后我假设有需要它的's an address field in the internal uop representation. It might just be a small offset from the previous (to save space) for non-branch instructions, so if it'可以计算,但我们在这里深入了解实现细节 . 乱序执行保持了在程序顺序中运行的指令的错觉,并且它们按顺序发出和退出(进入/离开核心的无序执行部分) .

    相关:基于查看玩具CPU,x86 registers: MBR/MDR and instruction registers做出了类似的错误假设 . 没有"current instruction"寄存器保存机器代码字节 . 有关OoO /流水线CPU的更多信息,请参阅我的答案中的更多链接 .


    在块被解码之前,分支预测必须工作 . 即假设我们刚刚在地址abc处获取了一个块,我们需要预测下一个要获取的块 . 即预测必须预测将并行解码的16字节指令块中跳跃的存在 .

    相关:Why did Intel change the static branch prediction mechanism over these years?

相关问题