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