gpt4 book ai didi

c++ - 分支预测的加速是否取决于谓词的复杂性?

转载 作者:太空狗 更新时间:2023-10-29 20:58:08 27 4
gpt4 key购买 nike

假设我有一些返回 bool 的函数 IsTrue()。如果程序员决定 IsTrue() 通常会返回 true,她可能会使用 GCC 的 __builtin_expect或类似于在这些典型情况下加速指令。

以下面2个例子为例:

// example 1
const bool result = IsTrue();
if (__builtin_expect(result, true))
// do something
;

// example 2
if (__builtin_expect(IsTrue(), true))
// do something
;

假设 IsTrue 是非平凡的,它们之间有什么区别吗?将 IsTrue() 放在 __builtin_expect 参数列表中是否会导致指令缓存在 IsTrue 的结果之前被评估是已知的,还是分支预测仅在 IsTrue 计算结果后应用?

最佳答案

所有现代处理器都采用超标量流水线,它会在实际执行的指令之后预先计算指令。通过使用 __builtin_expect,编译器对指令重新排序,以便预期(可能)路径不会使用跳转,跳转会导致超标量流水线丢失,从而使所有预先计算的结果变得无用。

编辑:这当然是简化的。现代处理器也有分支预测,所以他们试图预测代码将遵循哪条路径,但没有跳转的路径仍然是首选(它对缓存也更好,因为执行的代码路径是紧凑的)。另请注意,这些速度变化通常很小,如果您的代码不是经常执行或确实需要尽可能快的速度,您也不必担心。

关于c++ - 分支预测的加速是否取决于谓词的复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401428/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com