我想知道英特尔 i7 处理器的分支预测是如何工作的?
目前,我知道称为“动态分支预测”的预测器。
对于1位预测器:硬件总是预测分支指令的方向与上次执行时的方向相同。
在实践中效果更好的改进版本是2位预测器。为了进一步提高预测精度,引入了2位预测方案。在这些方案中,预测必须错误两次才能改变。
i7有和上面一样的预测器吗
简短的回答是否定的。
我相当肯定没有英特尔CPU使用过你描述的一位预测器。
最初的奔腾处理器使用了两位描述符,就像你描述的那样。它使用的四个值通常被描述为“强烈不采用”、“微弱不采用”、“微弱采用”和“强烈采用”。每当一个分支被采用,计数器就向“强采用”移动一位。每当一个分支未被采用,它就向“强烈未被采用”移动一点。它是一个饱和计数器,所以如果(例如)在计数器已经处于“强执行”时执行分支,计数器就不会改变。[我应该补充一下:这是英特尔如何记录它的,显然是打算让它工作——如果没记错的话,Agner Fog和Terje Mathiesen发现它的工作方式确实有点不同——而且通常没有这个好。
从奔腾/MMX和奔腾专业版开始,他们设计了一个更复杂的两级分支预测器。它增加了一个4位分支历史,用于选择16个2位计数器中的一个。这意味着如果你有一个模式(例如)采取,采取,不采取,采取,(然后重复),它会迅速调整到这一点,并正确预测所有分支。
我不确定i7中分支预测的细节,但我认为可以肯定的是,它至少与奔腾Pro一样复杂,而不是原始奔腾的回归。
我们对分支预测器的大部分了解来自测试。英特尔没有公布太多细节。错误预测惩罚大约是18个时钟周期,因此准确的分支预测很重要。
英特尔使用两级分支预测器。内部级别被认为与酷睿2 CPU相同。
外层更复杂,甚至可以正确预测固定计数高达64的循环。使用了两个18位全局历史缓冲区。一个包含至少进行过一次的所有跳转。另一个包含最重要的跳转。(这些缓冲区中的条目数量未知。)
注意,间接跳转和调用有自己的预测器。
我有一个与相关预测因子相关的练习,它指出以下几点: 答:贝兹·R1,D … D:贝兹·R1,F … F:不是R1的R1 预测工作如下 > 获取当前指令 如果是分支,则确定预测器的当前状态并预测分支: a.row 由分支地址确定(在本例中为 A 或 D) b. 列由当前全局移位寄存器确定 c.使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中) 执行分支,并确定实际决策(已采取:1,未采取
如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么
分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?
编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B
我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要
我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但是只有这么远的时间才能带我,这让我想知道不同类型的分支。 在 c 中,固定目标的条件分支: 并且(如果我正确理解这个问题),无条件分支到变量目标: 是否存在性能差异?在我看来,如果这两种方法中的一种明显快于另一种,编译器只需将代码转换为匹配即可。 对于那些分支预测非常