我通过一条我什至不记得的路径偶然进入了这个线程,并且在我前进的过程中正在学习这些东西。但我不喜欢看到一个悬而未决的问题,如果我能从中学到一些东西的话!所以我开始读书了。
反馈导向优化
正如 GCC 所说,这两种都是应用反馈导向优化的模式。通过运行程序并剖析它做什么、如何做、在哪些功能上花费多长时间等等 - 我们可能会提供额外的帮助,定向优化从结果数据来看。分析器的结果被“前馈”到优化器。接下来,大概您可以获取配置文件优化的二进制文件和配置文件that,然后编译另一个 FDO 版本,依此类推...因此feedback名称的一部分。
真正的答案,即这两个开关之间的差异,并没有非常清楚地记录下来,但如果我们只需要进一步观察,就可以获得它。
-fprofile-使用
首先,您的报价-fprofile-use
只是真正声明它需要-fprofile-generate
,一个没有很好记录的选项:来自的参考-use
只是告诉您阅读您已经所在的页面,在所有情况下,-generate
仅被提及但从未定义。有用!But!我们可以参考这个问题的回答:如何在 g++ 中使用配置文件引导优化? https://stackoverflow.com/a/4366805/2757035
正如该答案所述,以及此处有问题的 GCC 文档轻轻地表示... -fprofile-generate
causes 仪器仪表 https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html添加到输出二进制文件中。正如该页面总结的那样,经过检测的可执行文件添加了一些内容,以便在运行时进行额外的检查或洞察。
(我知道的另一种形式的工具 - 也是我使用过的工具 - 是编译器附加库 UBSan,我通过以下方式使用它GCC's -fsanitize=undefined option http://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/。这会在运行时捕获一些未定义的行为。有了这个,GCC 就揭示了 UB,否则我可能要花很长时间才能找到 - 并且让我想知道我的程序到底是如何运行的!Clang 也可以使用这个库 http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html,也许还有其他编译器。)
-fauto-配置文件
相比之下,-fauto-profile
是不同的。如果不是很清楚的话,在您引用的概要中暗示了关键的区别:
path
是包含以下内容的文件的名称AutoFDO档案信息。
此模式使用 AutoFDO 处理分析和后续优化。到谷歌,我们去:AutoFDO https://gcc.gnu.org/wiki/AutoFDO前几行并没有尽可能简洁地解释这一点,我认为最好的摘要埋在页面的深处:
AutoFDO 之间的主要区别 [-fauto-profile
] 和 FDO [-fprofile-use
] 就是它AutoFDO 配置文件基于优化的二进制文件而不是经过检测的二进制文件。这使得它在处理克隆函数时非常不同。
它是如何做到这一点的?-fauto-profile
要求您提供由 Linux 内核分析器编写的分析文件,Perf https://perf.wiki.kernel.org/index.php/Main_Page,转换为 AutoFDO 格式。 Perf 不是添加仪器,而是使用 CPU 的硬件功能和操作系统的内核级功能来分析程序运行时的各种统计信息:
perf
功能强大:它可以检测 CPU 性能计数器、跟踪点、kprobes 和 uprobes(动态跟踪)。它能够进行轻量级分析。 [...] 性能计数器是 CPU 硬件寄存器,用于对硬件事件进行计数,例如执行的指令、遭受的高速缓存未命中或错误预测的分支。它们构成了分析应用程序以跟踪动态控制流和识别热点的基础。
因此,它可以分析优化的程序,而不是经过检测的程序。我们可以合理地假设这更能代表您的程序在现实世界中的反应 - 因此可以促进收集更有用的分析数据并因此应用更有效的优化。
一个示例,说明如何将所有这些结合在一起并获得-fauto-profile
使用你的程序做一些事情总结如下:使用 GCC 和 Perf 进行反馈定向优化 https://blog.wnohang.net/index.php/2015/04/29/feedback-directed-optimization-with-gcc-and-perf/
(也许现在我已经了解了这一切,有一天我会尝试这些选项!)