gpt4 book ai didi

optimization - 编译器可以用分支信息做什么?

转载 作者:行者123 更新时间:2023-12-03 15:30:24 30 4
gpt4 key购买 nike

在现代 Pentium 上,似乎不再可能向处理器提供分支提示。假设分析编译器(例如具有分析引导优化的 gcc)获得有关可能的分支行为的信息,它可以做什么来生成执行速度更快的代码?

我知道的唯一选择是将不太可能的分支移动到函数的末尾。还有什么吗?

更新。

http://download.intel.com/products/processor/manual/325462.pdf第 2a 卷,第 2.1.1 节说

“分支提示前缀(2EH、3EH)允许程序向处理器提示最可能的代码路径
一个分支。仅将这些前缀用于条件分支指令 (Jcc)。分支提示前缀的其他用途
和/或其他未定义的带有 Intel 64 或 IA-32 指令的操作码被保留;此类使用可能会导致不可预测的
行为。”

我不知道这些是否真的有任何影响。

另一方面,第 3.4.1 节。的 http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf


编译器生成的代码可提高英特尔处理器中分支预测的效率。英特尔
C++ 编译器通过以下方式实现这一点:

  • 将代码和数据保存在单独的页面上
  • 使用条件移动指令消除分支
  • 生成与静态分支预测算法一致的代码
  • 在适当的情况下内联
  • 如果迭代次数可预测,则展开

  • 通过配置文件引导的优化,编译器可以布置基本块以消除最多的分支
    经常执行的函数路径或至少提高它们的可预测性。分支预测需要
    不是源级别的问题。有关更多信息,请参阅英特尔 C++ 编译器文档。


    http://cache-www.intel.com/cd/00/00/40/60/406096_406096.pdf在“PGO 性能改进”中说


    PGO 最适合具有许多难以执行的频繁执行的分支的代码
    在编译时预测。一个例子是带有密集错误检查的代码,其中
    大多数时候错误条件都是假的。
    不经常执行的(冷的)错误处理代码可以重新定位,因此分支很少会被错误地预测。最小化
    冷代码交错到频繁执行的(热)代码中改善了指令缓存
    行为。”

    最佳答案

    您想要的信息有两种可能的来源:

  • 有 Intel 64 and IA-32 Architectures Software Developer's Manual(3 卷)。这是一项巨大的工作,已经发展了几十年。这是我所知道的关于许多主题的最佳引用,包括浮点数。在这种情况下,您要检查第 2 卷,指令集引用。
  • 有 Intel 64 and IA-32 Architectures Optimization Reference Manual。这将简要地告诉您对每个微体系结构的期望。

  • 现在,我不知道你所说的“现代奔腾”处理器是什么意思,这是 2013 年,对吧?现在没有奔腾了...

    指令集确实支持通过条件分支指令(例如 JC、JZ 等)的前缀来告诉处理器是否预期采用或不采用该分支。参见 (1) 的第 2A 卷,第 2.1.1 节(我拥有的版本)指令前缀。有 2E 和 3E 前缀分别表示未采取和采取。

    至于这些前缀是否真的有任何影响,如果我们能得到这些信息,它会在优化引用手册上,你想要的微体系结构部分(我确定它不会是奔腾)。

    除了使用这些之外,关于该主题的优化引用手册有一整节,即第 3.4.1 节(我拥有的版本)。

    在这里复制是没有意义的,因为您可以免费下载手册。
    简而言之:
  • 使用条件指令(CMOV、SETcc)消除分支,
  • 考虑静态预测算法(3.4.1.3),
  • 内联
  • 循环展开

  • 此外,一些编译器,例如 GCC,即使在无法使用 CMOV 时,也经常执行按位算术来选择计算的两个不同事物之一,从而避免分支。在向量化循环时,它特别使用 SSE 指令执行此操作。

    基本上,静态条件是:
  • 预计将采用无条件分支(......有点可预期......)
  • 预计不会采用间接分支(由于数据依赖性)
  • 预测将采用后向条件(适用于循环)
  • 预测不会采用前向条件

  • 您可能想阅读整个第 3.4.1 节。

    关于optimization - 编译器可以用分支信息做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834757/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com