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