问题标签 [pgo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
95 浏览

gcc - PGO 如何应用于源代码?它如何影响CFG?

最近一直在寻找PGO的相关话题,开始想知道它们是如何应用到源代码中的,并且已经应用​​了一个又一个的应用效果。

我的意思是,如果您在 GCC 或 CLang 中启用 PGO 优化,例如,它将应用所有优化(内联、虚拟调用推测、死代码分离等),对吧!?

即使它们都没有应用于源代码,让我们假设其中一些是。那么,我猜它们是按顺序应用的,对吧?

那么,他们能否将 CFG(控制流图)修改为一些基本块频率丢失的程度?

例如,如果在名为“A”的 PGO 之后应用了名为“B”的 PGO,并且“A”修改了源代码,导致丢失了一些 Basic Blocks 频率,那么“B”如何应用(假设两者都是 PGO这取决于BB频率)?

(对不起,我的英语不好)

0 投票
1 回答
710 浏览

llvm - 如何使用 llvm 3.5 或更高版本的 llvm 工具分析程序?

我正在研究使用 llvm 工具来生成小程序的块级配置文件。看起来在旧版本中这就像运行一样简单:

在新版本的 LLVM 中如何进行分析?

0 投票
1 回答
155 浏览

intel - 大型程序的 LBR

英特尔处理器中的最后一个分支记录功能。它们是否适合具有大量分支的大型程序?如果是的话,你如何通过使用 Haswell 的 16 个 MSR 寄存器来找到整个路径?

0 投票
0 回答
2215 浏览

c - GCC 如何使用 PGO + LTO 优化

我最近一直在研究 PGO 和 LTO 如何显着优化程序速度(有人说大约 20%)。我目前只是在 C 中编程并在 Windows 中使用 GTK+ 构建 GUI(通过 GCC 编译所有内容)并且只使用 -O2 进行优化。

我一直在阅读以使用标志进行编译

一个 .gcno 和一个 .gcda 文件被创建,然后你运行编译的 .exe 多次,然后再次重新编译相同的 .c 文件,但将“-fprofile-generate”与“-fprofile-use”交换?(同时确保所有这些文件都保留在同一个文件夹/目录中,并为第二次编译的 .exe 使用不同的名称)

还是您以某种方式使用 .gcno/.gcda 文件?另请阅读有关使用“基准”的内容。

问题:

在 GCC 中使用它的步骤是什么?(分步指南会有所帮助:)

0 投票
1 回答
1371 浏览

c++ - Clang++ PGO:空的 .profraw


我正在寻求有关 Clang 配置文件引导优化问题的帮助。我正在使用 clang++-3.7,但是 clang++-3.6 仍然存在问题。
如果我尝试使用虚拟代码执行 PGO,一切都很好:

  • 我用 -fprofile-instr-generate 编译:
    clang++ -o test -fprofile-instr-generate dummy.cpp
  • 可执行文件“test”在启动时会生成一个 default.profraw 文件
  • 我可以将配置文件与 llvm-profdata 合并
  • 最后,我可以使用配置文件集成进行编译,在 .profdata 上使用 -fprofile-instr-use
  • 但是对于一个更大的项目,存在一些问题。我使用 makefile 和脚本来自动化该过程,但这是操作流程:

  • 我编译包含创建目标文件的类的源代码:
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src/foo1.cpp -o obj/foo1.o
    clang++ -c -- std=c++0x -O3 -flto -fprofile-instr-generate src/foo2.cpp -o obj/foo2.o
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src /foo3.cpp -o obj/foo3.o
  • 然后我链接对象:
    clang++ -O3 -flto -fprofile-instr-generate obj/foo1.o obj/foo2.o obj/foo3.o -o foobar.out
  • 此时出现了问题:当我尝试使用训练实例执行 foobar.out 时,生成的 .profraw 始终为空(并且执行速度正常,不会像创建 pgo 时那样慢),而当我尝试使用配置文件集成进行编译(在合并 .profraw 文件之后),编译器总是为我的项目中的每个 foo*.cpp 文件提供警告“警告:没有可用于文件 foo*.cpp 的配置文件数据”。

    谁能帮助我试图了解问题出在哪里?先感谢您!

  • 0 投票
    1 回答
    267 浏览

    clang - Clang:编译时是否必须通过 -O0 覆盖 PGO

    所以我正在用clang 3.8编译一个大的C++程序。我想使用 PGO(配置文件引导优化)。我想使用在instrumentation中编译的方式来生成profile。

    目前我正在传递-fprofile-instr-generate --coverage给编译器和--coverage链接器。

    所以现在的问题是传递是否也是最优的-O0,因此编译器可以在下一次编译期间正确映射来自二进制文件的调用。或者那是不必要的?

    0 投票
    1 回答
    1474 浏览

    linux - 使用性能考虑编译 Chrome/Chromium

    我目前正在权衡运行 Chromium 本地版本的潜在利弊。

    我以前从未从源代码构建 Chromium,但我知道这是一个巨大的项目,编译要求繁重且耗时。

    我以前曾涉足过这个想法,但出于性能方面的原因。具体来说:

    • Chromium 能否从 Profile Guided Optimization 中受益匪浅?
    • 与使用通用二进制构建相比,使用 GCC 原生 CPU 优化构建 Chromium 能否提供更多的边际性能优势?(特别是 Haswell 和 Broadwell 拱门)
    • 在本地构建 Chromium 时,还有什么其他方法可以提高整体性能或内存效率吗?

    经过当时的一些研究,我最终得出的结论是,这不值得付出努力。

    我确实记得几年前运行 Firefox 的 PGO 构建,而 Firefox 似乎仍然为运行 PGO 构建提供了不错的支持。但是,对于 Chromium,它似乎要复杂得多。

    Chromium 似乎确实对 PGO 构建有一些原生支持。不幸的是,这种支持看起来完全是 Windows 特定的。不支持其他操作系统的 PGO 构建,并且由于 Chromium 的所有独特构建复杂性,在没有此帮助的情况下尝试 PGO 构建似乎不值得。

    如果其他人知道有人在 Linux 上成功地尝试过这个,我会非常有兴趣看到结果。

    关于 GCC CPU 优化,我的理解是这里提供的好处几乎总是微不足道的,但是 Chromium 是多么复杂,它比大多数应用程序从中受益更多似乎是合理的。

    仅仅 GCC 优化可能仍然不值得付出努力,但我正在考虑再次这样做的原因是我还可以利用补丁来启用 VA-API: https ://aur.archlinux.org/packages /铬-vaapi/

    最后获得对硬件加速视频解码的支持可能值得在这里付出努力。现在我很好奇的是这样做时的性能考虑是什么。

    tl;博士

    • 当使用本地编译的带有本机 CPU 优化的 Chromium 构建时,我可以预期性能上有任何明显的差异吗?
    • 在 Linux 上使用 Chromium 的 PGO 是否可行,如果可行,进行实际分析的最佳方法是什么?
    0 投票
    1 回答
    616 浏览

    ios - PGO:为什么 XCode 会生成一个空的 .profdata 文件?

    我正在尝试在 XCode 8 中使用配置文件引导优化。

    我已按照此处的说明进行操作。如文档中所述,我确保使用 XCode 中的停止按钮终止我的应用程序。

    我验证了编译和链接命令包含-fprofile-instr-generate参数。

    该过程成功生成了一个 .profdata 文件,但该文件只有 1064 字节,考虑到我的程序在配置文件生成期间执行了数万或数十万次函数调用,这似乎非常小。运行“ xcrun -sdk iphoneos llvm-profdata show <profdata file>”会产生以下输出:

    这似乎表明我的 profdata 文件是完全空的!

    在这一点上,我非常卡住,我不确定如何生成有效的 .profdata 文件。任何人都可以提供指导吗?

    0 投票
    0 回答
    798 浏览

    c++ - 如何在 CMake 3.7 中表达 PGO 依赖关系?

    我有一个使用 Clang 3.9 的配置文件引导优化功能构建的 C++ 程序。这是应该发生的事情:

    1. 我在启用检测的情况下构建程序。
    2. 我运行该程序,创建一个带有 profile-data: 的文件prof.raw
    3. llvm-profdata用来转换prof.raw为新文件,prof.data.
    4. 我为同一个程序创建了一个新版本,并进行了一些更改:
      • 将每个 .cpp 文件编译为 .o 文件时,我使用编译器标志-fprofile-use=prof.data
      • 链接可执行文件时,我还指定-fprofile-use.

    我为此有一个 Gnu Makefile,效果很好。现在我的问题出现了,因为我正在尝试将该 Makefile 移植到 CMake(3.7,但我可以升级)。我需要(至少)使用 Unix Makefiles 生成器的解决方案,但理想情况下它适用于所有生成器。

    在 CMake 中,我定义了两个可执行目标:foo-genfoo-use

    • 执行时foo-gen,它会创建prof.raw文件。
    • add_custom_command用来创建一个prof.dataprof.raw.

    我的问题是我不知道如何告诉 CMake 所依赖的每个目标文件foo-use都依赖于文件prof.data

    • 我最有希望的想法是(1)找到一种方法来枚举所有.o依赖的文件foo-use,然后(2)遍历每个.o文件,调用add_dependency每个文件。

      这种方法的问题是我在我的 CMakeLists.txt 文件中找不到一种惯用的方式来枚举可执行文件所依赖的目标文件列表。这可能是 CMake 的一个未解决问题

    • 我还考虑使用在我使用的每个文件上set_source_files_properties设置属性,并将其添加到该属性的列表中。OBJECT_DEPENDS.cppfoo-useprof.data

      这个(AFAICT)的问题是我的每个.cpp文件都用于创建两个不同的.o文件:一个foo-gen用于foo-use. 我希望.o链接到的文件在foo-use编译时依赖于prof.data; 但是.o链接到的文件foo-gen不能编译时依赖prof.data.

      而且 AFAIK,set_source_files_properties不允许我将OBJECT_DEPENDS属性设置为具有两个值之一,这取决于当前是否foo-gen感兴趣foo-use

    有什么建议可以用干净的(ish)方法来完成这项工作吗?

    0 投票
    0 回答
    148 浏览

    c++ - 为什么在 VS2015 中使用 /USEPROFILE 比使用 /GENPROFILE 慢得多?

    众所周知,我们应该先用 /GENPROFILE 构建项目并运行它进行训练,然后将命令切换到 /USEPROFILE 以构建优化的包。

    我打印了每个时间成本函数的时间,我发现它在/GENPROFILE阶段比/USEPROFILE更快,实际上前一个比后一个性能要好得多。为什么会这样?如果编译器正在使用经过训练的 pgd 文件,为什么使用经过训练的 pgd 文件的最终 .exe 速度较慢?