我了解here所解释的内容,以及这些内容包括对CPU进行静态分支预测的提示。

我想知道这些与Intel CPU的相关性如何,因为Intel CPU放弃了对here提到的静态预测提示的支持。同样,如果我了解它现在是如何工作的,则路径中分支指令的数量将是编译器可以控制的唯一事情,并且预测,获取和解码哪个分支路径是在运行时确定的。

在这种情况下,是否存在任何情况下代码中的分支提示仍可用于针对最新英特尔处理器的软件,例如使用条件返回或避免在嵌套if/else语句的情况下避免在关键路径中使用分支指令的情况?

同样,如果这些仍然有用,则应感谢gcc和其他流行的编译器的任何细节。

P.S.我不是要过早的优化,也不是要用这些宏添加代码,但是我对这个话题很感兴趣,因为我正在处理一些时间紧迫的代码,并且仍然希望尽可能减少代码困惑。

谢谢

最佳答案

正如您对问题的评论部分中所述,您可以正确地找出:

  • 在Intel x86 CPU上,操作码映射中不再有静态分支预测提示。
  • 针对“冷”条件跳跃的动态分支预测倾向于预测下降路径。
  • 编译器可以使用__builtin_expect来重新排列if-then-else构造的路径,作为在生成的程序集中的失败案例。

  • 现在,考虑为多个目标体系结构而不仅仅是英特尔x86编译的代码库。它们中的许多确实具有静态分支提示,复杂性不同的动态分支预测器,或两者都有。

    例如,Intel Itanium体系结构确实为所有类型的指令提供了广泛的预测提示系统:控制流,加载/存储等。Itanium的设计目标是使编译器对代码进行广泛的优化,所有静态分配的指令槽均位于其中。一捆和提示。

    因此,当(1)正确的分支预测信息太难由编译器自动推导,并且2)至少一种目标体系结构上的基础硬件无法可靠预测时,__builtin_expect仍然与(罕见)情况相关。他们动态地。考虑到某些低功耗处理器包括原始分支预测器,这些预测器不跟踪分支历史,但始终选择故障转移路径,因此它开始看起来很有用。对于现代的Intel x86硬件,不算太多。

    关于gcc - BOOST_LIKELY和__builtin_expect是否仍然相关?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30266738/

    10-14 16:44