我理解解释的内容here以及这些内容包括CPU对静态分支预测的提示。
我想知道英特尔CPU上的这些是如何相关的,因为英特尔CPU已经放弃了对提到的静态预测提示的支持here。此外,如果我现在理解它是如何工作的,那么路径中的分支指令数量将是编译器可以控制的唯一内容,以及在运行时决定预测,获取和解码的分支路径。
鉴于此,是否存在代码中的分支提示对于针对最近的Intel处理器的软件仍然有用的情况,可能使用条件返回或者在嵌套if / else语句的情况下避免关键路径中的分支指令数量?
此外,如果这些仍然相关,那么gcc和其他热门编译器的任何细节都会受到赞赏。
P.S。我不是为了过早优化或者使用这些宏来编写代码,但是我对这个主题感兴趣,因为我正在使用一些时间关键代码,并且仍然希望尽可能减少代码混乱。
由于
答案 0 :(得分:2)
如同您的问题的评论部分一样,您正确地指出:
__builtin_expect
重新排序if-then-else结构的路径,作为生成的程序集中的一个初始案例。现在,考虑为多个目标架构编译的代码库,而不仅仅是Intel x86。他们中的很多人都有静态分支提示,不同复杂度的动态分支预测器,或两者兼而有之。
例如,英特尔安腾架构确实为所有类型的指令提供了广泛的预测提示系统:控制流,加载/存储等。安腾的设计目的是通过编译器对所有这些静态分配的代码进行广泛优化指示插槽中的插槽和提示。
因此,当{1}正确的分支预测信息难以由编译器自动推断时,__builtin_expect
仍然与(罕见)情况相关,并且2)至少一个目标体系结构上的底层硬件也是已知无法动态可靠地预测它们。鉴于某些低功耗处理器包括原始分支预测器,它们不跟踪分支历史但总是选择通过路径,它开始看起来是有益的。对于现代的英特尔x86硬件,没有那么多。