【问题标题】:Any way to handle "predictable branches" faster?有什么方法可以更快地处理“可预测的分支”?
【发布时间】:2012-07-19 03:55:33
【问题描述】:

我有一些代码,其中有两个或三个分支,你不知道它们会走向何方,但在它们第一次被击中后,要么 100% 确定,要么接近确定,同样的路径将再次发生。我注意到使用 __builtin_likely 在避免分支未命中方面并没有多大作用。即使在短时间内重复调用我的函数时分支预测做得很好……只要在调用我的函数之间发生其他事情,性能就会大大降低。有什么方法可以解决这个问题或我可以研究一些技术?有什么办法可以以某种方式“标记”这些分支,以便在流浪后再次到达它们时?

【问题讨论】:

  • 如果您的编译器支持,这通常是 PGO 的用途。
  • 当“还有其他事情发生”时,性能总是会下降。使用一个好的分析器,这样你就不会猜测了。
  • 我过去曾见过两次相同的函数实现,内置提示被反转,并且调度程序指针将在错误预测的分支上重置......我不确定我会在外面这样做一个非常紧密的循环,你应该按照 Hans Passant 所说的那样做:profile 并确定分支错误预测是否真的是问题(如果在两者之间执行其他事情,错误预测的成本可能不是真的成为馅饼的重要组成部分)
  • @David Rodriguez,你不需要另一个分支来检查你是否错误地预测了分支并需要切换指针吗?
  • @Passant,是的,我现在正在使用 cachegrind..我认为缓存也可能在其中发挥作用。错误预测的循环不应该花费超过两位数的循环,所以也许缓存是一个更大的问题。

标签: c++ performance optimization conditional x86-64


【解决方案1】:

分支预测器和编译器内在函数就是你所拥有的。充其量,您可以查看程序集并尝试自己手动进行一些优化,但您不会发现太多。

【讨论】:

  • 你不是说 __builtin_expect 吗?
【解决方案2】:

您可以使用模板为每个代码路径生成不同版本的函数,然后在运行时找出条件走向时使用函数指针选择一个。

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2021-11-21
    • 2021-07-15
    • 2018-01-27
    • 1970-01-01
    • 2020-06-02
    • 2020-03-06
    相关资源
    最近更新 更多