另外,有人能指引我一些关于该主题的好教程吗?我找不到任何资料。
另外,有人能指引我一些关于该主题的好教程吗?我找不到任何资料。
-fprofile-generate将在应用程序中插入性能分析代码。当实际运行时,应用程序会记录某些事件,如果在编译时知道了这种使用模式,可以提高性能。分支、内联等都可以进行记录,但我不确定GCC如何实现这一点。
程序退出后,它将把所有这些数据转储到*.gcda文件中,这些文件本质上是测试运行的日志数据。使用-fprofile-use标志重新构建应用程序后,GCC将考虑*.gcda日志数据来进行优化,通常会显著提高性能。当然,这取决于许多因素。
gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch
,但仍然出现了 coverage-mismatch 错误。我做错了什么? - gbriones.gdl来自这个示例:
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
参数重新编译和链接,这将使用优化过的文件。
gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch
,仍然出现coverage-mismatch错误。 我做错了什么? - gbriones.gdl设置makefile是比较棘手的部分。
你一定需要为目标文件设置单独的输出目录。我建议将它们命名为“profile”和“release”。您可能需要复制由profile运行产生的*.gcda文件,以便GCC在发布构建步骤中找到它们。
结果几乎肯定会更快。但它可能也会更大。-fprofile-use选项启用许多其他优化步骤,否则只有-O3才能启用。
info gcc
并搜索 profile-use。它说:“以下选项已启用:-fbranch-probabilities'、'-fvpt'、'-funroll-loops'、'-fpeel-loops'、'-ftracer'”。 - Zan Lynx