当前位置: 首页 > 知识库问答 >
问题:

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

江新
2023-03-14

我的理解是,在处理器流水线的开始,指令指针(指向要执行的下一条指令的地址)在提取之后由分支预测器更新,以便这个新地址可以在下一个周期被提取。

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

共有1个答案

花品
2023-03-14

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

这是行不通的,因为每个可能出现异常的指令都需要知道自己的地址。或者,当外部中断到达时,CPU 可以决定在任何指令之后为中断提供服务,使该中断成为架构 EIP。在长模式 (x86-64) 中,也有 RIP 相对寻址模式,因此调用不是唯一需要当前程序计数器作为数据的指令。

一个简单的流水线CPU可能对每个流水线阶段都有一个EIP。

现代超标量无序x86将EIP(或RIP)与每个运行中的指令(或可能是每个微操作)相关联;但是多微操作指令的所有微操作都是相互关联的,所以一条指令不能部分失效。)

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

早期的获取/解码阶段可能只跟踪 16 字节或 32 字节获取块的地址,但在解码后,我假设内部 uop 表示中有一个地址字段。对于非分支指令,它可能只是与之前的一个小偏移量(以节省空间),因此如果需要,可以计算它,但我们在这里深入研究了实现细节。乱序执行保持了指令按程序顺序运行的错觉,并且它们确实按顺序发出和停用(进入/离开核心的无序执行部分)。

相关:x86寄存器:MBR / MDR和指令寄存器基于玩具CPU做出了类似的错误假设。也没有保存机器代码字节的“当前指令”寄存器。在我的回答中查看更多链接,以获取有关 OoO / 流水线 CPU 的更多信息。

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

相关:英特尔这些年为什么要改变静态分支预测机制?

 类似资料:
  • 当在汇编指令级别分析代码时,鉴于现代CPU不串行或按顺序执行指令,指令指针的位置真正意味着什么?例如,假设以下x64汇编代码: 指令指针将在哪条指令上花费大部分时间?我可以为他们所有人想出好的理由: mov-RAX,[RBX]可能需要100秒的周期,因为它是缓存未命中

  • 分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?

  • 我目前正在编写一个Intel 8042驱动程序,并编写了两个循环来等待一些缓冲区准备就绪: 如您所见,我在循环中插入了指令。我最近才知道它,很自然地想尝试一下。 由于 的内容是不可预测的,因为它是 I/O 读取,因此分支预测器将使用循环指令填充管道:经过一些迭代后,它会注意到总是采用一个分支,类似于这里的情况。 如果分支预测器真的在其预测中包含I/O指令,那么上述是正确的,我不确定。 那么分支预测

  • 在Intel手册的第3卷中,它包含了硬件事件计数器的描述: 我一直认为分支地址计算器执行静态预测算法(当分支目标缓冲区不包含分支条目时)? 谁能证实以上两个是正确的吗?我什么也找不到。

  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = π 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int

  • 在解释字节码执行的虚拟机中,一般都会有上一篇说的switch结构,而字节码的类型显然不止前面列出的那些,一个很简单的语言都可能有上百个字节码,于是引入了另一个问题,假设用C或C++实现,在很多编译器中,switch实际会被编译成一连串的if...else if... ... ...else,执行的时候,每条指令都从头开始判断,执行某些指令时,需要成百甚至上千的比较次数,严重影响运行效率。当然这个问