1


我正在寻求有关 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 的配置文件数据”。

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

  • 4

    1 回答 1

    4

    解决了。问题是配置文件仅在正常退出(返回或退出)的情况​​下生成,而在我的代码中,主要以 _exit 结束。

    于 2016-02-24T09:40:03.950 回答