x86 - 返回堆栈缓冲区?

标签 x86 cpu cpu-architecture branch-prediction micro-architecture

据我了解,返回堆栈缓冲区仅支持 4 到 16 个条目(来自维基:http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_function_returns)并且不是键值对(基于 ret 指令的位置索引)。这是真的吗?
发生上下文切换时 RSB 会发生什么变化?
假设我们进入了 50 个未在 CPU 中返回且返回堆栈缓冲区长度为 16 的函数,之后会发生什么?这是否意味着所有预测都失败了?你能说明一下吗?这种情况在递归函数调用中是否相同?

最佳答案

BPU 可以包含自己的 RAS 预测器,当它预测 BTB 中的调用类型时,它会将假定的调用 NLIP(以下指令的 IP)推送到 RAS 堆栈上。它在 BTB 中预测的下一个返回将使用 RAS 的顶部作为预测地址(就像当它预测常规间接分支时,ITA 中的并行命中将超过 BTB 中的目标地址)。
BAC 将在解码时通过将每个调用指令的 NLIP 推送到其自己的 RSB 来验证/覆盖这些返回目标预测,下一个返回地址的预测将与该地址进行比较。如果不正确,BAC 将发出 BAclear 并将管道开始处的下一个 IP 逻辑重新引导到正确的返回地址(如果 RSB 损坏,结果可能是错误的)。它可能会用 BAC RSB 状态覆盖 RAS 预测器堆栈。
在一种实现中,BAC 向 TOS 指针提供它验证的每个分支预测,以及通过地址。一旦执行分支并且知道真实结果,如果发生错误预测,则恢复RSB TOS。我认为更有效的是在退休时使用架构 RSB,在管道刷新/错误预测时将其复制到 BAC RSB 和 RAS 预测器中。这可以防止恢复到损坏的 RSB。
RAS 预测器可能是一个循环堆栈,它可能有也可能没有上溢和下溢检查和保证,具体取决于实现。当堆栈已满时,新的预测可能会覆盖最旧的预测,以便它始终是最新的(而不是阻止它在已满时添加,这意味着保留一个计数器,以了解有多少调用/返回它无法进行预测为了)。至于下溢,它可能拒绝进行预测,而是使用 ITA 进行预测。如果 RSB 下溢,它可能不会覆盖 RAS 预测器所做的预测。
当执行宏操作的最后一个 uop 时,上下文切换的硬件中断会导致管道被清除。 RSB 可能会恢复到架构状态以在中断后继续。预测器 RAS/BAC RSB 可能会在微代码中刷新,如果它被损坏,它最终会自行恢复原状。

关于x86 - 返回堆栈缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722935/

相关文章:

c++ - 如何自动并行化堆数组?

c++ - 如何翻译多于一个字节的值?

uwp - 获得总体 CPU 百分比使用率的可能性有哪些

x86 - 加载和存储是唯一被重新排序的指令吗?

c - 是否可以将部分共享二级缓存分配给不同的内核

c - 为什么我们需要读写屏障?

opencl - CPU/Intel OpenCL 性能问题、实现问题

linux - nanosleep sleep 60 微秒太长

cpu-architecture - CISC ISA 下的 RISC

performance - 是否有任何现代 CPU 的缓存字节存储实际上比字存储慢?