如何在g++中使用基于配置文件的优化?

84

另外,有人能指引我一些关于该主题的好教程吗?我找不到任何资料。


14
为什么这个问题会被投票否决并且要关闭?这是一个完全合理的问题。 - nico
9
@jalf,如何使用基于配置文件的优化是一个完全有效的问题。 - Laurynas Biveinis
1
@jalf:我会把“What is the use of…”改成“How to use…”,这样你满意了吗?虽然我知道大多数人都能理解我在这个问题中所问的。 - nakiya
1
@nakiya:如果你想知道如何在G++中进行基于配置文件的优化,请直接问。当你这样问的时候,我不得不想知道你是否对特定的开关感兴趣,还是对“使用基于配置文件的优化来加速我的应用程序”的一般目标感兴趣。 - jalf
1
@jalf:"基于剖面的优化:" 这是我第一次听到这个短语。我已经编辑了问题两次了。我会再次编辑,希望能得到答案:( - nakiya
显示剩余4条评论
3个回答

67

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

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


9
顺便提一下,如果你的程序是多线程的,那么生成的性能分析数据可能会不一致,并且在尝试使用它时可能会出现错误。因此,你可能还需要在第二次调用GCC时传递“-fprofile-correction”。 - Nicu Stiurca
我无法摆脱这个错误。我使用的命令是 gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch,但仍然出现了 coverage-mismatch 错误。我做错了什么? - gbriones.gdl

25

来自这个示例

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(来自这里)。

然后,默认情况下,当你运行它时,它似乎会创建一个 .gcda 文件“紧挨着”你的 .o 文件(硬编码为构建它们的完整路径)。

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

然后,你需要使用 -fprofile-use 参数重新编译和链接,这将使用优化过的文件。


4
顺便提一句,如果你的程序是多线程的,那么生成的性能分析数据可能会不一致,并且在尝试使用它时可能会出现错误。因此,你可能还需要在第二次调用 g++ 时传递 “-fprofile-correction”。 - Nicu Stiurca
1
我无法摆脱错误。 我使用的命令是gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch,仍然出现coverage-mismatch错误。 我做错了什么? - gbriones.gdl

3

设置makefile是比较棘手的部分。

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

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


你能否评论一下哪些是这些优化步骤?或者引用一些文档? - JohnTortugo
2
@JohnTortugo:执行 info gcc 并搜索 profile-use。它说:“以下选项已启用:-fbranch-probabilities'、'-fvpt'、'-funroll-loops'、'-fpeel-loops'、'-ftracer'”。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接