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