【问题标题】:How to use profile guided optimizations in g++?如何在 g++ 中使用配置文件引导优化?
【发布时间】:2011-05-20 22:35:06
【问题描述】:

另外,谁能给我指出一个关于这个主题的好教程?我找不到。

【问题讨论】:

  • 为什么这会被否决并被投票关闭?这是一个完全有效的问题。
  • @jalf 这是一个关于如何使用配置文件引导优化的完全有效的问题
  • @jalf:我会将“...的用途”改为“如何使用...”。那会让你满意吗。虽然我知道大多数人都理解我在这个问题中提出的问题。
  • @nakiya:如果您想知道如何在 G++ 中进行配置文件引导优化,请询问。当您这样问时,我不得不怀疑是您感兴趣的特定开关,还是“使用配置文件引导的优化来加速我的应用程序”的总体目标。
  • @jalf: "profile-guided optimization :" 这是我第一次听到这句话。我现在两次编辑了这个问题。我会再次编辑,希望得到答案:(

标签: c++ optimization g++


【解决方案1】:

来自this example

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name

基本上,您最初使用此额外标志进行编译和链接,用于编译和链接:-fprofile-generate(来自here)。

然后,当您运行它时,默认情况下,它会在您的 .o 文件“下一个”创建 .gcda 文件,看起来(硬编码到构建它们的完整路径)。

您可以选择使用 -fprofile-dir=XXX setting 更改创建这些 .gcda 文件的位置。

然后您使用-fprofile-use 参数重新编译和重新链接,它使用配置文件引导的优点进行编译。

【讨论】:

  • 顺便说一下,如果你的程序是多线程的,那么生成的profile数据可能会不一致,你在尝试使用它时很可能会出错。因此,您可能还需要传递 -fprofile-correction 以进行 g++ 的第二次调用。
  • 我无法摆脱错误。我正在使用的命令是 gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch 仍然出现覆盖不匹配错误。我做错了什么?
【解决方案2】:

棘手的一点是设置 makefile。

您肯定需要单独的目标文件输出目录。我建议将它们命名为“profile”和“release”。您可能必须复制配置文件运行产生的 *.gcda 文件,以便 GCC 在发布构建步骤中找到它们。

结果几乎肯定会更快。它可能也会更大。 -fprofile-use 选项启用了许多其他优化步骤,否则这些步骤只能由 -O3 启用。

【讨论】:

  • 您能评论一下是哪些优化步骤吗?或者引用一些文件?
  • @JohnTortugo: info gcc 并搜索配置文件使用。它说:“启用了以下选项:-fbranch-probabilities'、'-fvpt'、'-funroll-loops'、''-fpeel-loops'、'-ftracer'”
【解决方案3】:

-fprofile-generate 将使用分析代码检测应用程序。如果在编译时知道这种使用模式,应用程序将在实际运行时记录可以提高性能的某些事件。可以记录分支、内联的可能性等,但我不确定 GCC 是如何实现这一点的。

程序退出后,会将所有这些数据转储到 *.gcda 文件中,这些文件本质上是用于测试运行的日志数据。使用 -fprofile-use 标志重建应用程序后,GCC 在优化时会考虑 *.gcda 日志数据,通常会显着提高性能。当然,这取决于很多因素。

【讨论】:

  • 顺便说一下,如果你的程序是多线程的,那么生成的profile数据可能会不一致,你在尝试使用它时很可能会出错。因此,您可能还需要传递 -fprofile-correction 以进行 GCC 的第二次调用。
  • 我无法摆脱错误。我正在使用的命令是 gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch 仍然出现覆盖不匹配错误。我做错了什么?
猜你喜欢
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多