【问题标题】:profile-guided optimization (C)配置文件引导优化 (C)
【发布时间】:2010-09-08 07:54:09
【问题描述】:

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

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

【问题讨论】:

标签: c++ c optimization gcc pgo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    与 PGO 可以触发的微优化相比,这些是最大的赢家。一旦您完成了该级别的优化,PGO 可能会提供帮助。不过,我们从来没有运气好过——仪器的成本使得我们的应用程序变得非常慢(几个数量级)。

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

    【讨论】:

      【解决方案3】:

      它通过放置额外的代码来计算每个代码路径的使用次数。当你第二次编译时,编译器会使用之前只能猜测的关于程序执行的知识。 PGO 可以做以下几件事:

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

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

      【讨论】:

      • 谢谢,这似乎很有趣。你有任何文档链接可以分享吗?
      • 你提到的分支预测没有使用,完全没用,因为分支命中前缀只在CPU第一次遇到分支时使用。真正的好处是 GCC 知道如何根据预测概率最好地构建复杂的分支代码。
      • 根据 OP 的要求,如果您可以通过有关如何使用它的信息来扩展您的答案,那就太好了。 (例如特定选项等)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2021-03-09
        相关资源
        最近更新 更多