led*_*ter 3 x86 cpu-architecture branch-prediction
我查看了关于分支目标预测器的维基文章;这有点令人困惑:
我认为当 CPU 决定下一步要获取哪些指令(进入 CPU 管道来执行)时,分支目标预测器就会发挥作用。
但这篇文章提到了这样的一些观点:
指令缓存获取指令块
扫描块中的指令以识别分支
那么,指令缓存(==我想象的 L1i)是否基于某些分支目标预测数据(预)取指令?...
或者只是这篇文章暗示了x86以外的东西......好吧,或者我误解了一些东西
在 Itanium(不是 x86,而是 Intel)中,存在 L1i 预取,实际上存在L1I_PREFETCH_MISS_RATIO、L1I_PREFECHES、L2_INST_PREFECHES ……性能监控事件。但是,我没有看到 Haswell 或 Skylake 的任何 L1I 预取事件。ITLB 可以,但 L1I 不行。如果正在进行 L1I 预取,那么就会有性能监控事件来测量这一点,例如 VTune。
您没有询问哪种微架构,但我认为 Haswell+Skylake 缺乏性能监控事件强烈意味着 Intel x86_64 cpu 一般不会进行 I-cache 预取,只有取阶段实际触发的内容,使用分支预测生成的地址。
在最近的 x86 CPU 中,在获取和解码之间以及解码和重命名/分配到后端之间存在大量缓冲。(参见 Kanter 的Haswell 文章和wikichips 上的 Skylake)。因此,获取阶段和前端通常比执行提前运行得足够远,以实现与 L1d 硬件预取器加载/存储数据类似的目的,但由分支预测而不是顺序访问模式驱动。
Intel CPU 中的大部分硬件预取逻辑都位于二级缓存中,这是统一的代码/数据。(它确实寻找顺序访问模式)。考虑到管道中的缓冲,L2 命中延迟足够低,不是什么大问题。