【问题标题】:gcc cold function attribute vs builtin_expect behaviorgcc 冷函数属性与 builtin_expect 行为
【发布时间】:2021-05-06 08:51:43
【问题描述】:

来自 gcc 函数属性:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html 冷属性可以提示gcc分区调用者的冷到2部分:正常部分(保持部分)和冷部分进入分离功能

函数的冷属性用于通知编译器该函数不太可能被执行。该函数针对大小而不是速度进行了优化,并且在许多目标上,它被放置在文本部分的特殊子部分中,因此所有冷函数看起来很接近,从而提高了程序非冷部分的代码局部性。分支预测机制将导致代码中冷函数调用的路径标记为不太可能。因此,将用于处理不太可能的情况(例如 perror)的函数标记为冷函数很有用,以改进在极少数情况下调用标记函数的热函数的优化。

当配置文件反馈可用时,通过 -fprofile-use 自动检测冷功能并忽略此属性。

这是一个例子https://godbolt.org/z/j7sK4hd48

但是,像 __builtin_expect(int , int) 这样的其他提示无法提示编译器进行此类优化,而是编译器仅将 unexpected 放在函数的底部。但不要将它们分开并拆分为另一个函数,就像函数属性 cold 一样。

GCC 是否计划支持 __builtin_expect 的这种优化? 如果没有,我们可以做其他努力来实现这种效果吗?

另一方面,Clang 似乎不支持这种拆分热/冷鳕鱼来分离功能,或者我错过了?

【问题讨论】:

  • is GCC planing to 这是一些 gcc 邮件列表或一些 gcc 开发人员的问题,而不是 stackoverflow 上的问题。

标签: c++ c gcc clang compiler-optimization


【解决方案1】:

实际上,LLVM 已经支持这种优化。LLVM 有选项 hot-cold-split=true 可以做到这一点。而在 x86 后端,有一个选项 -split-machine-functions 可以做到这一点。

【讨论】:

  • 但是在 gcc 中,它是由多次传递来实现该结果的,例如静态分支预测或配置文件指南、bb-reorder 和 ipa-split,而不仅仅是一次传递。
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多