-fprofile-use
和-fauto-profile
有什么区别?
医生们是这么说的:
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
-fprofile-使用 -fprofile-use=path 启用配置文件反馈导向的优化,以及以下优化,这些优化通常只有在配置文件反馈可用的情况下才有利可图: 如果指定了路径,GCC将查看路径以找到配置文件反馈数据文件。见-fprofile-dir。
在那下面
-自动轮廓 -=path 启用基于抽样的反馈导向优化,以及以下优化,这些优化通常只有在配置文件反馈可用的情况下才能盈利: 路径是包含AutoFDO配置文件信息的文件的名称。如果省略,则默认为当前目录中的fbdata.afdo。
( [...]
for -fauto-profile
中的优化列表更长。)
发布于 2016-07-30 19:26:00
我被一条我甚至都记不起来的路绊倒在这条线上,我正在学习这些东西。但我不喜欢看到一个没有答案的问题,如果我能从中学到一些东西!所以我开始读书了。
反馈导向优化
正如GCC所说,这两种模式都是应用反馈导向优化的模式.通过运行这个程序并分析它所做的事情,它是如何做的,它在哪些函数中花费了多长时间,等等--我们可以为额外的、导向的从结果数据中优化提供便利。分析器的结果将“向前”传递给优化者。接下来,您可以使用您的配置文件优化的二进制和概要文件,然后编译另一个FDO的版本,等等.因此,名称的反馈部分。
真正的答案,这两个开关之间的区别,并没有很清楚的文档,但它是可用的,如果我们只是需要进一步研究。
-fprofile-使用
首先,您对-fprofile-use
的引用实际上只说明了它需要一个没有很好文档的选项:来自-use
的引用只是告诉您阅读您已经在上面的页面,在所有情况下,都只提到了-generate
,而从未定义过-generate
。有用!但!我们可以参考这个问题的答案:如何在g++中使用概要文件引导的优化?
正如答案所述,GCC的文件在这里温和地表明.-fprofile-generate
导致将仪器仪表添加到输出二进制文件中。当该页面总结时,一个可执行工具增加了一些东西,以便于在运行时进行额外的检查或洞察。
(我所知道的另一种工具-以及我使用过的一种--是编译器附加库UBSan,我通过选项使用它。这在运行时捕获一些未定义的行为。GCC发布了UB,否则我可能要花很长时间才能找到它--这让我想知道我的程序是如何运行的!Clang也可以使用这个库。,也许还有其他编译器。)
-自动轮廓
相反,-fauto-profile
是不同的。在你引用的概要中,如果不是很清楚,关键的区别就会被暗示出来:
path
是包含AutoFDO配置文件信息的文件的名称。
此模式使用AutoFDO处理分析和后续优化。对于Google,我们要说的是:AutoFDO前几行并没有尽可能简洁地解释这一点,我认为最好的摘要已经隐藏在页面下面了:
AutoFDO
-fauto-profile
和FDO-fprofile-use
的主要区别在于优化后的二进制文件上的AutoFDO配置文件,而不是仪器化的二进制文件。使得它在处理克隆函数时有很大的不同。
它是如何做到这一点的?-fauto-profile
要求您提供由Linux内核的分析器性能指标编写的分析文件,并将其转换为AutoFDO格式。Perf没有添加插装,而是使用操作系统的CPU和内核级功能的硬件特性来分析程序运行时的各种统计信息:
perf
功能强大:它可以检测CPU性能计数器、跟踪点、k探针和u探针(动态跟踪)。它能够轻量级分析。..。性能计数器是计算硬件事件的CPU硬件寄存器,例如执行的指令、缓存丢失或错误预测的分支。它们构成了分析应用程序跟踪动态控制流和识别热点的基础。
因此,这使得它能够分析优化的程序,而不是仪器化的程序。我们可以合理地假设,这更能代表您的程序在现实世界中的反应-因此可以方便地收集更有用的分析数据,并因此应用更有效的优化。
这里总结了一个示例,说明如何将所有这些绑定在一起并让-fauto-profile
用您的程序来做一些事情:基于GCC和Perf的反馈定向优化。
(也许现在我已经学会了这一切,总有一天我会尝试这些选择的!)
发布于 2019-05-18 09:05:48
underscore_d给出了对这些差异的深入了解.
,这是我对它的看法。
通过最初使用-fprofile-generate
进行编译来执行内部分析,它将分析器集成到二进制文件中,以便运行性能数据收集。执行二进制文件,10分钟或任何您认为包含足够活动的时间,以供分析器记录。如果-fprofile-use
是多线程应用程序,则与-fprofile-correction
一起重新编译。内部分析器的运行会导致显着的性能损失(在我的例子中是25%),它没有反映实际的非分析器包括二进制行为,因此可能导致不太准确的分析,但是如果在运行允许分析器的二进制标度时所有的活动都会受到性能的影响,我想这并不重要。
或者,您可以使用perf工具(更容易出错和更努力)来创建分析数据,它是特定于内核的(可能还需要构建内核以支持分析、跟踪等)。这是可以考虑的,外部分析和对应用程序性能的影响可以忽略不计。您可以在正常编译的二进制文件上运行此操作。我找不到任何比较这两种情况的研究。
perf record -e br_inst_retired:near_taken -b -o perf.data *your_program.unstripped -program -parameters*
然后在不去掉二进制数据的情况下,把分析数据转换成GCC所理解的东西.
create_gcov --binary=your_program.unstripped --profile=perf.data --gcov=profile.afdo
然后使用-fauto-profile
重新编译应用程序。已知存在Perf和AutoFDO/create版本特定问题。有关此可选分析方法的详细信息,我参考了https://blog.wnohang.net/index.php/2015/04/29/feedback-directed-optimization-with-gcc-and-perf/。
默认情况下,-fprofile-use
和-fauto-profile
都启用了许多优化选项,在我的示例中,我知道这些循环对我的应用程序中的性能有负面影响。如果您的踏板类型,您可以测试选项组合,包括禁用对应的编译标志,在我的情况下-fno-展开-循环。
在我的程序中,在去掉二进制文件之后,使用内部分析可以减少25%的大小(与原始的非剖析器剥离二进制文件相比),但是我只观察到次百分位数性能的提高,而程序日志(它是一个加密货币矿工)报告的以前的工作输出波动更不稳定,而不是像原来那样在峰值和低谷之间逐渐上升和下降。
总之,暗处捅了一刀。
https://stackoverflow.com/questions/29700460
复制相似问题