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

2024-03-26

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

这是文档所说的:

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

-fprofile-使用

-fprofile-use=路径

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

如果指定了路径,GCC 将查找该路径以查找配置文件反馈数据文件。请参阅 -fprofile-dir。

并在其之下

-fauto-配置文件

-fauto-profile=路径

启用基于采样的反馈导向优化,以及以下优化,这些优化通常仅在有可用的配置文件反馈的情况下才有利可图:[...]

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

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


我通过一条我什至不记得的路径偶然进入了这个线程,并且在我前进的过程中正在学习这些东西。但我不喜欢看到一个悬而未决的问题,如果我能从中学到一些东西的话!所以我开始读书了。

反馈导向优化

正如 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/

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

-fprofile-use 和 -fauto-profile 之间有什么区别? 的相关文章

  • 跳转到文件行c#

    我如何跳到文件中的某些行 例如 c text txt 中的第 300 行 using var reader new StreamReader c test txt for int i 0 i lt 300 i reader ReadLine
  • 用 C 语言制作查找表的最佳方法是什么?

    我正在开发一个嵌入式 C 项目 我有一个 LCD 显示屏 每个字符都有一个 5x7 点阵 要显示特定字符 您必须移动与要打开的点相关的 5 个字节 所以我需要制作某种带有键的查找表 我可以在其中传递 ASCII 字符 并返回一个 5 字节的
  • 将 void* 作为函数调用而不声明函数指针

    我已经搜索过 但找不到任何结果 我的术语可能有问题 所以如果以前有人问过这个问题 请原谅我 我想知道是否有一种简单的方法可以调用void 作为 C 中的函数 无需首先声明函数指针 然后为函数指针分配地址 IE 假设要调用的函数是类型void
  • 如何在 Google 日历中创建“recurData”?

    我想使用 Google API 创建日历的重复事件 我正在关注链接 谷歌日历API http code google com apis calendar data 2 0 developers guide dotnet html Creat
  • 是否可以将向量的一部分作为向量发送给函数? [复制]

    这个问题在这里已经有答案了 我想看看是否可以将向量的一部分传递给函数 以便它显示为函数的法线向量 更重要的是 我希望这可以在 O 1 的常数时间内完成 我不想迭代向量来创建一个新向量 事实上 我还希望在下面的示例中将新向量的大小更改为 40
  • 如何修改道路网络的 L 系统?

    向大家问好 我目前正在研究道路网络的程序生成 并偶然发现了 L 系统算法 根据我从有关该主题的各种科学论文以及有关该主题的论文的进一步论文中了解到 算法更改为使用 全局目标和局部约束 其中修改所采取的路径以适应地形等输入值和人口密度 现在我
  • 阅读 C 语言中的科学记数法

    我正在尝试读取包含以下内容的文件 1 0000000e 01 2 9265380e 03 5 0821200e 02 4 3231640e 01 2 0000000e 01 1 0170240e 04 9 2798610e 02 4 072
  • 如果文本框不为空,如何添加并显示工具提示文本框 WPF

    需要显示提示 其中包含文本字段中的数据 文本框有数据时出现提示 只需使用绑定到 ToolTipService 附加属性即可 XAML
  • 使用 JsonWriter 时,WriteStartConstructor 的用途是什么?

    标题说明了一切 我看到它 及其相应的结尾 吐出以下内容 new Foo 但我不明白什么new实际上是在反序列化时执行的 文档只是说它编写了一个 Json 构造函数 但没有说 Json 构造函数是什么is 此方法是作为增强功能的一部分引入的
  • 如何以编程方式区分不同的 IOException?

    我正在对写入 Process 对象的 StandardInput 流的代码进行一些异常处理 Process 有点像 unix head 命令 它只读取输入流的一部分 当进程终止时 写入线程会失败并显示 IOException The pip
  • 如何在MVVM架构中将animationview play与LottieForms绑定?

    所以我在列表视图中处理动画 并且我想随时播放一次 所以我想控制它 这是图书馆https github com martijn00 LottieXamarin https github com martijn00 LottieXamarin
  • 为 C# 和 C++ 应用程序编写 DLL

    我需要编写几个 DLL 它们都可以从 C 应用程序和 C 应用程序访问 最初 我认为通过用 C 编写 DLL 并从 C 和 C 应用程序链接到它们可以节省时间 精力 这种方法明智吗 还是应该使用 C 编写 DLL 我的建议是在您最舒服的地方
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • File.Delete 进程无法访问该文件,因为该文件正在被另一个进程使用

    public bool DownloadMp3File DownloadedMp3 mp3 WebClient client new WebClient string filePath bool wasDownload false try
  • 如何声明和定义具有推导类型的静态成员?

    我需要定义一个具有复杂 许多模板参数 类型的静态成员 不是 constexpr 因此 希望有这样的东西 struct X static auto x makeObjectWithComplexType 但它不是 C 所以我尝试解决它 并认为
  • 何时使用 const char * 何时使用 const char[]

    我知道它们是不同的 我知道它们有何不同 并且我阅读了我能找到的所有关于char vs char 但所有这些答案都没有告诉我们什么时候应该使用它们 所以我的问题是 你什么时候使用 const char text text 你什么时候使用 co
  • Plink 通过 C# 返回不需要的字符

    通过 C 使用 Plink 时 我在结果前后收到不需要的字符 Command ls l informatica tgtdynamicparams out grep vaulttest grep Sep 1 awk print 9 sort
  • LINQ 表达式树 Any() 位于Where() 内

    我正在尝试生成以下 LINQ 查询 Query the database for all AdAccountAlerts that haven t had notifications sent out Then get the entity
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • C++ 模板类问题中的类型条件

    使用海湾合作委员会4 2 我有这个条件类型的元模板 template

随机推荐