返回地址预测堆栈缓冲区与堆栈存储的返回地址?

时间:2014-03-16 20:45:14

标签: performance architecture x86 cpu intel

一直在阅读Agner Fog"英特尔,AMD和威盛CPU的微架构"在第34页,他描述了"返回地址预测":

http://www.agner.org/optimize/microarchitecture.pdf

  

3.15返回(除P1以外的所有处理器)

     

更好的方法用于退货。后进先出缓冲区,   调用返回堆栈缓冲区,每次都记住返回地址   执行调用指令,并使用它来预测位置   相应的回报将会去。这种机制确保了这一点   当相同的子程序时,返回指令被正确预测   从几个不同的地方打来。

我有点不清楚这是什么需要,因为返回地址仍然存储在堆栈上?

那么,如果还有这种技术,那么在堆栈上存储返回地址的目的是什么?堆栈存储值是否仅在此预测技术不起作用时使用?

2 个答案:

答案 0 :(得分:13)

预测器通常是获取阶段的一部分,以便确定接下来要获取的指令。这发生在处理器解码指​​令之前,因此甚至不能确定存在分支指令。与所有预测变量一样,返回地址预测器的意图是更快地获得分支的方向/目标。返回指令是一个分支,因此它通常会有一个分支预测器条目来确定它是否被采用以及目标在哪里。查询返回地址预测器以代替正常的分支目标缓冲区。

因此,返回语句之前的50条指令实际上是"执行",fetch阶段预测返回指令和下一次取指令的指令地址。稍后,当执行返回时,从堆栈中读取地址并与预测返回的位置进行比较。如果它们相同,则继续执行,否则执行将回滚以使用正确的返回地址。

为什么要存储在堆栈中?首先,处理器不知道预测器是否工作而不与存储在堆栈上的地址进行比较。其次,堆栈是"官方"返回地址,可能因合法原因而更改。第三,返回地址预测器具有有限数量的条目。对于没有空间将地址存储在预测器中的返回指令,需要堆栈。

答案 1 :(得分:2)

除了Brians的重要解释之外,还有一个事实是堆栈存在于内存中。您不希望每次想要预测分支的结果时,从某些堆栈地址进入内存单元并进行内存查找(更不用说地址转换为物理)。分支预测想要自给自足。您还可以将RSB视为另一种缓存数据形式。