我明白所解释的内容here https://stackoverflow.com/questions/7346929/why-do-we-use-builtin-expect-when-a-straightforward-way-is-to-use-if-else这些还包括对 CPU 进行静态分支预测的提示。
我想知道这些在英特尔 CPU 上的相关性如何,因为如上所述,英特尔 CPU 已经放弃了对静态预测提示的支持here http://en.wikipedia.org/wiki/Branch_predictor#Static_prediction。另外,如果我现在了解它是如何工作的,路径中的分支指令的数量将是编译器可以控制的唯一东西,并且预测、获取和解码哪个分支路径是在运行时决定的。
鉴于此,是否存在代码中的分支提示对于针对最新英特尔处理器的软件仍然有用的情况,可能使用条件返回或在嵌套 if/else 语句的情况下避免关键路径中的分支指令数量?
另外,如果这些仍然相关,那么有关 gcc 和其他流行编译器的任何细节都值得赞赏。
附:我不赞成过早优化或用这些宏填充代码,但我对此主题很感兴趣,因为我正在处理一些时间关键的代码,并且仍然希望尽可能减少代码混乱。
Thanks
正如在您的问题的评论部分中您正确地发现:
- Intel x86 CPU 上的操作码映射中不再有静态分支预测提示;
- “冷”条件跳转的动态分支预测往往会预测失败路径;
- 编译器可以使用
__builtin_expect
重新排序 if-then-else 构造的路径将作为生成的程序集中的失败案例放置。
现在,考虑正在编译的代码库multiple目标架构,而不仅仅是 Intel x86。其中很多确实具有静态分支提示、不同复杂度的动态分支预测器,或两者兼而有之。
例如,英特尔安腾架构确实为所有类型的指令提供了广泛的预测提示系统:控制流、加载/存储等。安腾的设计目的是让编译器对代码进行广泛优化,并在其中包含所有这些静态分配的指令槽。捆绑包和提示。
所以,__builtin_expect
仍然与以下(罕见)情况相关:1)编译器很难自动推导出正确的分支预测信息,2)至少一种目标架构上的底层硬件也已知无法可靠地动态预测它们。鉴于某些低功耗处理器包含不跟踪分支历史但始终选择失败路径的原始分支预测器,它开始看起来很有用。对于现代 Intel x86 硬件来说,情况并非如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)