G++/CMake Profile Guided Optimization 找不到生成的 .gcda 文件
G++/CMake Profile Guided Optimization cannot find generated .gcda files
我正在 Ubuntu 20.04 上使用 CMake 3.16.3 和 G++ 9.3 编译应用程序。这是当前源目录:
. (this is called MyApp)
├── src
│ ├── /* source files */
│ └── CMakeLists.txt
├── tests
│ ├── /* source files */
│ └── CMakeLists.txt
├── build-release
│ └── pgo /* folder for .gcda files */
├── build_release.sh
└── CMakeLists.txt*
我在 CMakeLists.txt 中设置标志(根标志也标有星号)如下:
set(MYAPP_PGO "-fprofile-dir=${MYAPP_PGO} -fprofile-generate=${MYAPP_PGO}")
// apply flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -march=native -flto ${MYAPP_PGO}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MYAPP_PGO}")
add_subdirectory(src)
add_subdirectory(tests)
src/CMakeLists.txt
和 tests/CMakeLists.txt
中没有设置标志。
MYAPP_PGO
设置在bash中,是build-release/pgo
的绝对路径。我有一个构建程序的脚本 (build_release.sh
):
# excluded other lines and flags for brevity
cd build-release
cmake -DMYAPP_PGO="$(pwd)/pgo/" ..
make -j1
配置文件 运行 后,我看到 build-release/pgo
中有多个文件,src
和 test
中每个 cpp
文件一个,比如
#home#johndoe#MyApp#build-release#src#CMakeFiles#MYAPPLICATION_myapp.dir#sample_source.cpp.gcda
然而,再次编译时
// this is a multithreaded program
set(MYAPP_PGO "-fprofile-dir=${MYAPP_PGO} -fprofile-use=${MYAPP_PGO} -fprofile-correction")
// apply flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -march=native -flto ${MYAPP_PGO}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MYAPP_PGO}")
add_subdirectory(src)
add_subdirectory(tests)
我收到一条警告,指出缺少配置文件:
/home/johndoe/MyApp/src/sample_source.cpp: In function ‘_GLOBAL__sub_I_sample_source.cpp’:
/home/johndoe/MyApp/src/sample_source.cpp:215:1: warning: ‘/home/johndoe/MyApp/src/sample_source.cpp/build-release/pgo//#home#johndoe#MyApp#build-release#src#CMakeFiles#MYAPPLICATION_myapp.dir#sample_source.cpp.gcda’ profile count data file not found [-Wmissing-profile]
215:1
指的是这个源文件中的最后一个字符。
我测试了使用和不使用 PGO 的程序速度,没有发现任何改进。虽然不能保证 PGO 会带来任何加速,但我倾向于认为 PGO 在这里没有达到预期的效果。我做错了什么吗?
对于任何想知道...
我没有写项目的原始构建系统。我发现它从同一来源编译了一个可执行文件和一个库。虽然可执行文件已成功分析和重新编译(PGO 完美完成),但该库并未在任何地方使用。因此缺少配置文件。因为探查器输出非常长的名称,我认为错误来自可执行文件。谢谢大家的帮助。
我正在 Ubuntu 20.04 上使用 CMake 3.16.3 和 G++ 9.3 编译应用程序。这是当前源目录:
. (this is called MyApp)
├── src
│ ├── /* source files */
│ └── CMakeLists.txt
├── tests
│ ├── /* source files */
│ └── CMakeLists.txt
├── build-release
│ └── pgo /* folder for .gcda files */
├── build_release.sh
└── CMakeLists.txt*
我在 CMakeLists.txt 中设置标志(根标志也标有星号)如下:
set(MYAPP_PGO "-fprofile-dir=${MYAPP_PGO} -fprofile-generate=${MYAPP_PGO}")
// apply flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -march=native -flto ${MYAPP_PGO}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MYAPP_PGO}")
add_subdirectory(src)
add_subdirectory(tests)
src/CMakeLists.txt
和 tests/CMakeLists.txt
中没有设置标志。
MYAPP_PGO
设置在bash中,是build-release/pgo
的绝对路径。我有一个构建程序的脚本 (build_release.sh
):
# excluded other lines and flags for brevity
cd build-release
cmake -DMYAPP_PGO="$(pwd)/pgo/" ..
make -j1
配置文件 运行 后,我看到 build-release/pgo
中有多个文件,src
和 test
中每个 cpp
文件一个,比如
#home#johndoe#MyApp#build-release#src#CMakeFiles#MYAPPLICATION_myapp.dir#sample_source.cpp.gcda
然而,再次编译时
// this is a multithreaded program
set(MYAPP_PGO "-fprofile-dir=${MYAPP_PGO} -fprofile-use=${MYAPP_PGO} -fprofile-correction")
// apply flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -march=native -flto ${MYAPP_PGO}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MYAPP_PGO}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MYAPP_PGO}")
add_subdirectory(src)
add_subdirectory(tests)
我收到一条警告,指出缺少配置文件:
/home/johndoe/MyApp/src/sample_source.cpp: In function ‘_GLOBAL__sub_I_sample_source.cpp’:
/home/johndoe/MyApp/src/sample_source.cpp:215:1: warning: ‘/home/johndoe/MyApp/src/sample_source.cpp/build-release/pgo//#home#johndoe#MyApp#build-release#src#CMakeFiles#MYAPPLICATION_myapp.dir#sample_source.cpp.gcda’ profile count data file not found [-Wmissing-profile]
215:1
指的是这个源文件中的最后一个字符。
我测试了使用和不使用 PGO 的程序速度,没有发现任何改进。虽然不能保证 PGO 会带来任何加速,但我倾向于认为 PGO 在这里没有达到预期的效果。我做错了什么吗?
对于任何想知道...
我没有写项目的原始构建系统。我发现它从同一来源编译了一个可执行文件和一个库。虽然可执行文件已成功分析和重新编译(PGO 完美完成),但该库并未在任何地方使用。因此缺少配置文件。因为探查器输出非常长的名称,我认为错误来自可执行文件。谢谢大家的帮助。