【问题标题】:branch prediction vs branch target prediction分支预测与分支目标预测
【发布时间】:2014-03-03 18:01:05
【问题描述】:

我理解对了吗,if 语句更依赖于分支预测,而 v-table 查找更依赖于分支目标预测?关于v-tables,没有“分支预测”,只有目标预测?

试图了解 CPU 是如何处理 v-table 的。

【问题讨论】:

  • 让我们结束一个问题,因为它只有 4 行长.....
  • 这是一个相当讽刺的评论,我知道未评论的关闭动议可能看起来不公平,但原因(在某种程度上)记录在选择的选项中(太宽泛)并且您没有被否决,这表明选民认为这个问题无法在 StackOverflow 上得到有效解决,这与 StackOverflow 本身有关,而与您的问题关系不大。 AFAIK 你的推论是正确的:if 和循环一般使用 分支预测 (布尔输出),而函数指针/虚拟函数使用 分支目标预测 (目标输出) .
  • 如何查看关闭的原因?这不能是一个广泛的问题——有两个问题,既相关又具体? (但我感谢您花时间通过您的评论回答我的问题)
  • 啊!您可能没有足够的声誉来访问close 对话:x

标签: c++ performance polymorphism cpu branch-prediction


【解决方案1】:

分支预测是预测分支是否会被采用。分支目标预测是预测分支将要到达的位置。这两件事是独立的,可以在所有组合中出现。

这些例子可能是:

无条件分支,固定目标

  • 无限循环
  • goto声明
  • breakcontinue 声明
  • if/else 语句的“then”子句结束(跳过else 子句)
  • 非虚函数调用

无条件分支,可变目标

  • 从函数返回
  • 虚函数调用
  • 函数指针调用
  • switch 语句(如果编译成跳转表)

条件分支,固定目标

  • if声明
  • switch 语句(如果编译成一系列if/else 语句)
  • 循环条件测试
  • &&|| 运算符
  • 三元?:运算符

条件分支,可变目标

  • 在正常情况下不太可能出现,但编译器可能会合成一个作为优化,结合上述两种情况。例如,在 x86 上,如果由于尾调用优化而出现在函数末尾,编译器可能会将 if (condition) { obj->VirtualFunctionCall(); } 之类的代码优化为 jne *%eax 之类的条件间接跳转。

【讨论】:

猜你喜欢
  • 2014-04-25
  • 2015-11-24
  • 2015-09-20
  • 2016-07-01
  • 2011-02-01
  • 2012-07-02
  • 2015-09-25
  • 1970-01-01
  • 2012-12-10
相关资源
最近更新 更多