有人知道这个编译器功能吗?海湾合作委员会似乎支持这一点。它是如何工作的?潜在收益是多少?什么情况下好呢?内循环?

(这个问题是具体的,不是一般的优化问题,谢谢)

有帮助吗?

解决方案

它的工作原理是放置额外的代码来计算每个代码路径被采用的次数。当您第二次编译时,编译器会使用之前只能猜测的有关程序执行的知识。PGO 可以在以下几个方面做出努力:

  • 根据调用频率来决定哪些函数应该内联或不内联。
  • 根据单向或另一向调用的百分比,决定如何放置有关应预测“if”语句的哪个分支的提示。
  • 根据每次调用循环时进行的迭代次数来决定如何优化循环。

在你测试之前,你永远不知道这些东西能有多大帮助。

其他提示

PGO 在编译 x264(我从事的项目)时提供了大约 5% 的速度提升,并且我们有一个内置系统(make fprofiled)。在某些情况下,它可以带来很好的免费速度提升,并且可能对与 x264 不同、较少由手写汇编组成的应用程序有更多帮助。

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

与 PGO 可以触发的微观优化相比,这些都是大赢家。一旦您完成了该级别的优化,PGO 可能会有所帮助。但我们在这方面一直没有太多运气 - 仪器的成本如此之高,以至于我们的应用程序变得非常慢(几个数量级)。

我喜欢使用英特尔 VTune 作为分析器,主要是因为与会改变行为的分析器相比,它是非侵入性的。

优化的有趣之处在于,速度增益可以在最不可能的地方找到。

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

我建议从分析器开始(gperf 如果您使用的是 GCC),然后开始通过一些正常操作来研究运行应用程序的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top