【发布时间】:2015-07-27 19:19:32
【问题描述】:
我了解here 的解释以及这些将包括对 CPU 进行静态分支预测的提示。
我想知道这些在 Intel CPU 上的相关性如何,因为 Intel CPU 已经放弃了对 here 提到的静态预测提示的支持。另外,如果我现在了解它的工作原理,那么路径中的分支指令的数量将是编译器可以控制的唯一内容,并且预测、获取和解码的分支路径是在运行时决定的。
鉴于此,是否存在代码中的分支提示对于针对最新英特尔处理器的软件仍然有用的情况,可能使用条件返回或在嵌套 if/else 语句的情况下避免关键路径中的分支指令数量?
此外,如果这些仍然相关,任何有关 gcc 和其他流行编译器的细节都将受到赞赏。
附:我不是为了过早优化或在代码中添加这些宏,但我对这个主题很感兴趣,因为我正在处理一些时间关键的代码,并且仍然希望尽可能减少代码混乱。
谢谢
【问题讨论】:
-
生成代码以使预期的路径在内存中在一起仍然可以提高代码局部性,并且编译器可以控制它。
-
@Jester 谢谢。同意它可以提高指令缓存性能。想知道当针对特定处理器时,gcc 现在是否会这样做。
-
另外,AFAIK,方法在编译/链接期间不会被拆分。因此,对于 if/else 的小方法/控制块,局部性改进可能没有多大帮助。
-
简而言之,blog.man7.org/2012/10/how-much-do-builtinexpect-likely-and.html 认为,如果您的预测正确 > 99.99%(示例为 1 万分之一),它们是有意义的,当然这取决于编译器、cpu 等。
-
在阅读了更多内容并查看了上述博客中提供的代码的反汇编(在一个沙桥盒子上并使用 -O3 -march=native 编译)之后,我可以说:1.没有特别的机器代码中包含的指令/提示。预测是通过硬件分支预测器进行的。 2. 当预测器没有任何地址历史时,前向跳转被预测为未采取,后向跳转被预测为已采取。 3. 编译器为示例生成不同的代码,使代码受益于“2”中描述的行为。