编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测??
这个问题与我关于这个主题的第一个问题有内在联系:
分支预测与分支目标预测
goto
语句break
或continue
语句if/else
语句的“then”子句结尾(跳过else
子句)switch
语句(如果编译为跳转表)if
语句switch
语句(如果编译成一系列if/else
语句)&
和
运算符?:
运算符如果我有以下代码:
if(something){
//a
}
else{
//b
}
(BP=“分支预测”和BTP=“分支目标预测”)
它非常明显的BP用于计算条件something
。但是,我正在尝试了解BTP是否也参与确定分支A
中发生的事情。BTP是否也碰巧根据BP的结果确定位于分支A
/B
处的代码的地址?
建议在条件预测完成后再用BTP进行目标预测。
1)谁能澄清一下上面的问题吗?
第二个相关的问题--BP和BTP在与CPU的提取/解码/执行/回写流水线交互的方式上有何不同?BP开始于提取还是解码阶段?在条件代码的执行阶段之后,我们可以检查预测是否正确,并更新分支预测缓存。
2)BTP是如何在获取/解码/执行/回写CPU阶段工作的?
请阅读Intel优化手册,当前下载位置在这里。当陈腐时(他们一直在到处移动东西),然后在Intel网站上搜索“架构优化手册”(Architectures optimization Manual)。请记住,那里的信息是相当通用的,它们只公开了允许编写高效代码所需的内容。分支预测实现细节被认为是一个商业秘密,并且在体系结构之间会发生变化。在手册中搜索“分支预测”以找到参考,它在各章节中相当分散。
我将对手册中的内容进行总结,并在适当的地方添加细节:
分支预测是核心(分支预测单元)中的BPU单元的工作。与你问题中的“BP”大致相关。它包含几个子单位:
BTB分支目标缓冲区。此缓冲区存储先前进行的间接跳转或调用的目标地址。这与你问题中的“BTP”相关。手册中没有说明缓冲区是否可以存储每个地址的多个目标(由历史表索引),我认为这可能适用于以后的体系结构。
返回堆栈缓冲区。该缓冲器充当“影子”堆栈,存储呼叫指令的返回地址,使得RET指令的目标以高度的置信度可用,而处理器不必依赖BTB,而BTB对呼叫不太可能是有效的。据记载它有16层深。
Bullet 2)有点难以准确地回答,手册只讨论了“前端”,并没有分解流水线的细节。足够恰当,它严重依赖于体系结构。2.2.5节中的图可能是说明性的。执行跟踪缓存起作用,它存储先前解码的指令,因此是BPU咨询的主要来源。否则就在指令翻译器(aka decoder)之后。
如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么
分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?
我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要
我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但是只有这么远的时间才能带我,这让我想知道不同类型的分支。 在 c 中,固定目标的条件分支: 并且(如果我正确理解这个问题),无条件分支到变量目标: 是否存在性能差异?在我看来,如果这两种方法中的一种明显快于另一种,编译器只需将代码转换为匹配即可。 对于那些分支预测非常
我有一个与相关预测因子相关的练习,它指出以下几点: 答:贝兹·R1,D … D:贝兹·R1,F … F:不是R1的R1 预测工作如下 > 获取当前指令 如果是分支,则确定预测器的当前状态并预测分支: a.row 由分支地址确定(在本例中为 A 或 D) b. 列由当前全局移位寄存器确定 c.使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中) 执行分支,并确定实际决策(已采取:1,未采取
我目前正在查看CPU管道中可以检测分支错误预测的各个部分。我发现这些是: 分支目标缓冲区(BPU CLEAR) 分支地址计算器(BA CLEAR) 跳转执行单元(不确定此处的信号名称??) 我知道2和3检测到什么,但我不知道BTB中检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支,BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址。执行单元评估分支并确定它是否正