编辑:我的混乱是因为肯定通过预测采取了哪个分支,你是否也在有效地进行目标预测?
这个问题与我关于这个主题的第一个问题有着内在的联系:
看看接受的答案:
无条件分支,固定目标
- 无限循环
goto声明break或continue声明if/else声明的'then'子句结束(跳过该else子句)- 非虚函数调用
无条件分支,变量目标
- 从函数返回
- 虚函数调用
- 函数指针调用
switch语句(如果编译成跳转表)条件分支,固定目标
if声明switch声明(如果汇编成一系列if/else声明)- 循环条件测试
- 在
&&与||运营商- 三元
?:运算符条件分支,变量目标
- 在正常情况下不太可能出现,但编译器可能会综合一个作为优化,结合上述两种情况.例如,在x86上,编译器可以将代码优化
if (condition) { obj->VirtualFunctionCall(); }为条件间接跳转,就像jne *%eax它由于尾调用优化而出现在函数末尾一样.
如果我有以下代码:
if(something){
//a
}
else{
//b
}
Run Code Online (Sandbox Code Playgroud)
(BP ="分支预测"和BTP ="分支目标预测")
其非常明显的BP用于评估条件something.但是,我试图了解BTP是否也参与确定分支中发生的情况a.BTP是否也恰好确定位于branch a/ 的代码的地址b,具体取决于BP的结果?
我问这个维基百科页面(http://en.wikipedia.org/wiki/Branch_target_predictor):
在计算机体系结构中,分支目标预测器是处理器的一部分,其在由处理器的执行单元计算分支指令的目标之前预测所采用的条件分支或无条件分支指令的目标.
它表明BTP用于在预测条件后预测目标.
1)有人可以澄清以上内容吗?
第二个相关问题 - BP和BTP如何与CPU的fetch/decode/execute/write-back管道交互方式不同?BP是从获取还是解码阶段开始的?在条件代码的执行阶段之后,我们可以检查预测是否正确并更新分支预测缓存.
2)BTP如何处理fetch/decode/execute/write-back …