代码之家  ›  专栏  ›  技术社区  ›  elmarco

轮廓引导优化(C)

  •  12
  • elmarco  · 技术社区  · 16 年前

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

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

    4 回复  |  直到 12 年前
        1
  •  12
  •   Greg Rogers    16 年前

    它通过放置额外的代码来计算每个代码路径被占用的次数。当您第二次编译时,编译器使用关于程序执行的所获得的知识,而这些知识以前只能猜测到。PGO可以朝以下几个方面努力:

    • 根据调用函数的频率决定哪些函数应该是内联的。
    • 决定如何根据调用的百分比来预测“if”语句的哪个分支。
    • 决定如何根据每次调用循环所花费的迭代次数来优化循环。

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

        2
  •  6
  •   Dark Shikari    16 年前

    在编译X264时,PGO提供了大约5%的速度提升,我在这个项目上工作,并且我们有一个内置的系统(make fprofiled)。在某些情况下,这是一个很好的免费速度提升,并且可能对那些不像X264那样由手写程序集组成的应用程序有更多帮助。

        3
  •  4
  •   greatwolf Romowski    12 年前

    杰森的建议是正确的。你将得到的最好的加速来自“发现”你让一个O(N )算法会在某个地方陷入一个内部循环,或者您可以在昂贵的函数之外缓存某些计算。

    与PGO可以触发的微观优化相比,这些都是最大的赢家。一旦您完成了这一级别的优化,PGO可能会有所帮助。不过,我们从未有过多少运气——仪器的成本如此之高,以至于我们的应用程序变得异常缓慢(达到了几个数量级)。

    我喜欢使用“英特尔vtune”作为分析器,主要是因为它与检测性能变化过大的分析器相比是无创的。

        4
  •  2
  •   Jason Cohen    16 年前

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

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

    我建议从剖析器开始( gperf 如果您使用的是gcc),那么只需开始浏览通过一些正常操作运行应用程序的结果。