【发布时间】:2012-11-23 06:16:16
【问题描述】:
据我了解,返回堆栈缓冲区仅支持 4 到 16 个条目(来自 wiki:http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_function_returns),并且不是键值对(基于 ret 指令的位置索引)。这是真的吗? 当上下文切换发生时,RSB 会发生什么?
假设我们在返回堆栈缓冲区长度为 16 的 CPU 中处理了 50 个未返回的函数,之后会发生什么?这是否意味着所有预测都失败了?你能举例说明吗?这种场景在递归函数调用中是否相同?
【问题讨论】:
-
我认为,返回堆栈缓冲区在上下文切换时被重置。 Agner 的 pdf 中有一些关于 RSB 的信息:agner.org/optimize/microarchitecture.pdf 第 3.14 节。 RSB 是一个固定长度的 LIFO 缓冲区(后进先出;也称为堆栈);在深层调用堆栈中,较旧的返回从 RSB 中推出,并且无法预测。这种技术在深度递归的情况下几乎没有帮助。 PS。在第 3.1 节最后一点中,Agner 说“预测器收集的信息经常由于任务切换和其他上下文切换而丢失”
-
据我了解,RSB 不知道上下文切换:就像 osgx 说它是一个 LIFO 缓冲区,在上下文切换时会出现“错误”和错误预测,就像不匹配的 CALL 或 RET遇到过。
-
非常频繁的调用/返回的最常见情况对于 16 项“堆栈”来说足够浅,尽管较新的 CPU 确实使其更深一些。 (如果 RSB 为空,有些会退回到标准的间接分支预测。)
标签: x86 cpu cpu-architecture branch-prediction micro-architecture