关于c ++:配置文件引导的优化(C)

关于c ++:配置文件引导的优化(C)

profile-guided optimization (C)

有人知道这个编译器功能吗? 海湾合作委员会似乎对此表示支持。 它是如何工作的? 潜在收益是多少? 在哪种情况下很好? 内循环?

(这个问题是特定的,而不是一般的优化,谢谢)


它通过放置额外的代码来计算每个代码路径的使用次数来工作。当您第二次编译时,编译器将使用以前只能猜测的有关程序执行的知识。 PGO可以采取以下措施:

  • 根据调用的频率来决定应该内联哪些函数。
  • 根据如何以一种方式或另一种方式进行调用的百分比来确定如何预测" if"语句的哪个分支的提示。
  • 根据每次调用该循环要执行的迭代次数来决定如何优化循环。

在测试之前,您永远不会真正知道这些东西有多少帮助。


当我编译x264(我正在从事的项目)时,PGO的速度提高了5%,我们有一个内置的系统(使fprofiled)。在某些情况下,它提供了很好的自由速度提升,并且可能在与x264不同的应用程序中有更多帮助,而这些应用程序很少由手写组装组成。


杰森的建议是正确的。您将获得的最佳加速来自"发现",即让O(n2)算法滑入某个位置的内部循环,或者可以将某些计算缓存在昂贵的函数之外。

与PGO可以触发的微优化相比,这些是最大的赢家。完成该级别的优化后,PGO可能会提供帮助。但是,我们从来没有碰到太多运气-仪器的成本是如此之高,以至于我们的应用变得越来越慢(几个数量级)。

我喜欢将Intel VTune用作探查器,主要是因为与仪器探查器相比,它无创性,而探查器会改变行为。


优化的有趣之处在于,在最不可能的地方发现了速度提升。

这也是您需要分析器的原因,而不是猜测速度问题在哪里。

我建议从探查器(如果使用GCC,则为gperf)开始,并开始通过一些常规操作来了解运行应用程序的结果。


推荐阅读