-fprofile-use和-fauto-profile有什么区别?

Pra*_*tic 8 c++ gcc

-fprofile-use和之间有什么区别-fauto-profile

以下是文档所说的内容:

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

-fprofile使用

-fprofile使用=路径

启用配置文件反馈导向的优化,以及通常只有可用的配置文件反馈才能获利的以下优化:[...]

如果指定了path,GCC将查看查找概要文件反馈数据文件的路径.见-fprofile-dir.

在那之下

-fauto瞩目

-fauto轮廓=路径

启用基于采样的反馈导向优化,以及通常仅通过可用的配置文件反馈获利的以下优化:[...]

path是包含AutoFDO配置文件信息的文件的名称.如果省略,则默认为当前目录中的fbdata.afdo.

([...]for 中的优化列表-fauto-profile更长.)

und*_*e_d 6

我通过一条我什至不记得的路径偶然发现了这个线程,并且在学习过程中不断学习。但是我不喜欢看到一个无法回答的问题,如果我可以从中学习到一些东西!所以我读了。

反馈导向的优化

正如GCC所说,这两种都是应用反馈导向优化的模式。通过运行该程序并分析其功能,如何执行,在多个功能上花费的时间等,我们可以促进对所得数据进行额外的定向优化。分析器的结果被“馈送到”优化器。接下来,大概是,您可以获取配置文件优化的二进制文件和配置文件that,然后编译另一个FDO的版本,依此类推……因此是名称的反馈部分。

真正的答案,即这两个开关之间的差异,没有得到很清楚的记录,但是如果我们只需要进一步了解的话,就可以使用。

-fprofile-use

首先,您的报价-fprofile-use仅真正指出了它所需要-fprofile-generate的选项,但该选项的文档记录不充分:的引用-use只是告诉您阅读您已经在使用的页面,在所有情况下,-generate仅提及但从未定义。有用! 但!我们可以参考以下问题的答案:如何在g ++中使用配置文件引导的优化?

正如该回答所指出的那样,有关的GCC文档在此处 轻轻地指示 ... -fprofile-generate导致将仪表添加到输出二进制文件中。随着该页面的摘要,已检测的可执行文件已添加了一些东西,以在运行时促进额外的检查或洞察。

(我知道的另一种检测手段(也是我使用的一种检测手段)是编译器附加库UBSan,我通过GCC的-fsanitize=undefined选项使用它。它捕获了运行时的一些UndefinedBehavior。GCC揭示了UB I否则可能要花很多时间才能找到-并且让我想知道我的程序是如何运行的!Clang也可以使用该库,也可以使用其他编译器。)

-fauto-profile

相反,-fauto-profile是不同的。如果未明确指出,则主要区别在于所引用的摘要:

path是包含AutoFDO配置文件信息的文件的名称。

此模式使用AutoFDO处理性能分析和后续优化。对于Google,我们去:AutoFDO最初的几行不能尽可能简洁地解释这一点,我认为最好的摘要被埋在页面的下方:

AutoFDO [ -fauto-profile]和FDO [ -fprofile-use] 之间的主要区别在于,AutoFDO基于优化的二进制文件而不是经过检测的二进制文件进行配置文件。这使得它在处理克隆函数方面大不相同。

它是如何做到的?-fauto-profile要求您提供由Linux内核的探查器Perf写入的性能分析文件,该文件转换为AutoFDO格式。Perf而不是添加检测,而是使用CPU的硬件功能和OS的内核级功能来分析程序在运行时的各种统计信息:

perf功能强大:它可以检测CPU性能计数器,跟踪点,kprobes和uprobes(动态跟踪)。它能够进行轻量级分析。性能计数器是CPU硬件寄存器,用于对硬件事件进行计数,例如执行的指令,遭受的高速缓存未命中或分支的错误预测。它们构成了对应用程序进行性能分析以跟踪动态控制流和识别热点的基础。

因此,这使它可以描述优化的程序,而不是经过测试的程序。我们可能会合理地假设这更能代表您的程序在现实世界中的反应方式-因此可以促进收集更多有用的性能分析数据并因此应用更有效的优化。

-fauto-profile这里总结了一个如何将所有这些捆绑在一起并开始对程序进行处理的方法的示例:使用GCC和Perf的反馈定向优化

(也许现在我已经了解了所有这些,所以有一天我会尝试这些选项!)