Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 是否有可能和内置的预期仍然相关?_Gcc_Assembly_Boost_Intel - Fatal编程技术网

Gcc 是否有可能和内置的预期仍然相关?

Gcc 是否有可能和内置的预期仍然相关?,gcc,assembly,boost,intel,Gcc,Assembly,Boost,Intel,我理解所解释的内容,这些内容包括对CPU进行静态分支预测的提示 我想知道这些在Intel CPU上有多重要,因为Intel CPU已经不再支持前面提到的静态预测提示。另外,如果我了解它现在是如何工作的,那么路径中的分支指令数量将是编译器唯一可以控制的事情,并且在运行时决定预测、获取和解码哪个分支路径 有鉴于此,是否存在代码中的分支提示对于针对最新英特尔处理器的软件仍然有用的情况,可能使用条件返回,或者在嵌套if/else语句的情况下避免关键路径中的分支指令数 此外,如果这些仍然是相关的,任何关于

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

我想知道这些在Intel CPU上有多重要,因为Intel CPU已经不再支持前面提到的静态预测提示。另外,如果我了解它现在是如何工作的,那么路径中的分支指令数量将是编译器唯一可以控制的事情,并且在运行时决定预测、获取和解码哪个分支路径

有鉴于此,是否存在代码中的分支提示对于针对最新英特尔处理器的软件仍然有用的情况,可能使用条件返回,或者在嵌套if/else语句的情况下避免关键路径中的分支指令数

此外,如果这些仍然是相关的,任何关于gcc和其他流行编译器的细节都是值得赞赏的

另外,我不赞成过早的优化,也不赞成在代码中添加这些宏,但我对这个主题感兴趣,因为我正在处理一些时间关键的代码,并且仍然希望尽可能减少代码混乱


谢谢

在评论部分回答您的问题,您正确地指出:

  • 英特尔x86 CPU上的操作码映射中不再有静态分支预测提示
  • “冷”条件跳跃的动态分支预测倾向于预测故障路径
  • 编译器可以使用
    \u builtin\u expect
    重新排序if-then-else构造的路径,该路径将作为故障案例放置在生成的程序集中
  • 现在,考虑编译多个目标体系结构的代码库,而不仅仅是英特尔X86。它们中的很多都有静态分支提示和不同复杂性的动态分支预测,或者两者都有

    例如,“英特尔安腾体系结构”确实为所有类型的指令(控制流、加载/存储等)提供了广泛的预测提示系统。安腾的设计目的是让编译器对代码进行广泛优化,并将所有这些静态分配的指令槽放入一个捆绑包和提示中


    因此,
    \u内置的expect
    仍然适用于(罕见的)情况:1)正确的分支预测信息很难由编译器自动推断,2)至少一个目标体系结构上的底层硬件也无法可靠地动态预测。考虑到某些低功耗处理器包含基本的分支预测器,这些预测器不跟踪分支历史,但总是选择故障路径,因此它开始看起来很有用。对于现代的英特尔x86硬件来说,没有这么多。

    生成代码以使预期的路径在内存中结合在一起仍然可以改进代码的局部性,编译器可以控制它。@Jester谢谢。同意它可以提高指令缓存性能。不知道gcc现在在针对特定处理器时是否会这样做。另外,AFAIK方法在编译/链接期间不会被拆分。因此,对于小方法/控制块中的if/else,局部性改进可能没有多大帮助。简言之,他们认为,如果您的预测正确>99.99%(示例为1/10000),那么它们是有意义的,当然要取决于编译器、cpu等。在阅读更多内容并查看上述博客中提供的代码反汇编之后(在sandybridge框上,使用-O3-march=native进行编译)我可以这样说:1.机器代码中没有特殊的指令/提示。预测是通过硬件分支预测器进行的。2.当预测器没有地址的任何历史记录时,前向跳转被预测为未执行,后向跳转被预测为执行。3.编译器在这种情况下为示例生成了不同的代码y代码将从“2”中描述的行为中受益。未执行的分支仍然比执行的分支便宜,即使两者都预测正确:如果预测正确,则不可能出现任何前端气泡,并且它们可以在更多的执行端口上运行(英特尔Haswell)。并且将所有热代码放在一起对于L1I/uop缓存位置/密度更好。编译器还可能根据可能的情况或不可能的情况做出其他决定(例如,选择不使代码膨胀,从而自动向量化不太可能运行的循环)。或者,如果不太可能出现这种情况,可以选择使用分支而不是
    cmov
    。如果我错了,请纠正我,但“向前跳跃时失败,而不是失败”的预测不是吗