如何在基于CMake的项目中集成使用llvm-mca工具
基于CMake集成llvm-mca的可行实现方案
下面提供3种不同适用场景的落地方案,可根据项目需求选择:
方案1:单文件粒度自定义分析目标
适用于只需要对指定核心源文件做性能分析的场景,不会额外增加常规构建的耗时。
第一步:全局工具与参数配置
在项目根目录的CMakeLists.txt中添加如下配置,先定位所需工具:
# 查找clang和llvm-mca可执行文件,可指定版本适配你的环境 find_program(CLANG_EXECUTABLE NAMES clang clang-16 clang-15 REQUIRED) find_program(LLVM_MCA_EXECUTABLE NAMES llvm-mca llvm-mca-16 llvm-mca-15 REQUIRED) # 可配置的llvm-mca分析参数 set(LLVM_MCA_MCPU "btver2" CACHE STRING "llvm-mca 目标CPU型号") set(LLVM_MCA_OPTIMIZATION_LEVEL "-O2" CACHE STRING "分析使用的优化等级") set(LLVM_MCA_TARGET_TRIPLE "x86_64-unknown-unknown" CACHE STRING "分析使用的目标三元组")
第二步:定义mca目标生成函数
封装通用函数,避免每个文件重复写逻辑:
function(add_llvm_mca_target SRC_FILE) # 生成不冲突的目标名和报告路径 get_filename_component(SRC_NAME ${SRC_FILE} NAME_WE) set(MCA_TARGET_NAME "mca_${SRC_NAME}") set(MCA_REPORT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${SRC_NAME}.mca.report") add_custom_target(${MCA_TARGET_NAME} COMMAND ${CLANG_EXECUTABLE} ${LLVM_MCA_OPTIMIZATION_LEVEL} -target ${LLVM_MCA_TARGET_TRIPLE} # 传入当前源文件所属目标的编译参数、头文件路径和宏定义 $<TARGET_PROPERTY:${ARGV1},COMPILE_FLAGS> $<TARGET_PROPERTY:${ARGV1},INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:${ARGV1},COMPILE_DEFINITIONS> -S ${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILE} -o - | ${LLVM_MCA_EXECUTABLE} -mcpu=${LLVM_MCA_MCPU} > ${MCA_REPORT_PATH} DEPENDS ${SRC_FILE} COMMENT "生成 ${SRC_FILE} 的llvm-mca分析报告: ${MCA_REPORT_PATH}" VERBATIM ) endfunction()
第三步:给指定文件添加分析目标
在对应模块的CMakeLists.txt中调用函数即可,假设你的业务目标名为my_app,要分析foo.c:
add_executable(my_app foo.c bar.c main.c) # 第一个参数为源文件名,第二个参数为所属的业务目标名,用于自动获取编译参数 add_llvm_mca_target(foo.c my_app)
使用时执行构建命令make mca_foo或者ninja mca_foo即可在构建目录生成对应的分析报告。
方案2:全项目批量分析
适用于需要对项目所有源文件做批量扫描的场景,可一次性生成全量报告。
在方案1的基础上添加如下配置即可:
# 遍历当前目录所有C/C++源文件,可根据项目结构调整匹配规则 file(GLOB ALL_PROJECT_SOURCES *.c *.cpp) set(ALL_MCA_TARGETS "") foreach(SRC ${ALL_PROJECT_SOURCES}) get_filename_component(SRC_NAME ${SRC} NAME_WE) set(MCA_TARGET "mca_${SRC_NAME}") list(APPEND ALL_MCA_TARGETS ${MCA_TARGET}) add_llvm_mca_target(${SRC} my_app) endforeach() # 定义总目标,执行一次即可生成所有报告 add_custom_target(mca_all DEPENDS ${ALL_MCA_TARGETS})
使用时执行make mca_all或者ninja mca_all即可。
方案3:绑定常规构建流程自动分析
适用于需要持续监控核心代码性能的场景,每次构建业务目标时自动生成分析报告。
只需要给业务目标添加mca目标作为依赖即可:
# 每次构建my_app时自动生成foo.c的mca报告 add_dependencies(my_app mca_foo)
注意事项
- 分析C++代码时,把
CLANG_EXECUTABLE的查找目标替换为clang++即可 - 务必传入业务目标的编译相关参数,否则生成的汇编和实际构建结果不一致,分析结果无参考价值
- 可根据需求给llvm-mca添加额外参数,比如
-iterations=200调整模拟迭代次数、-output-asm-variant=1调整汇编输出格式
内容的提问来源于stack exchange,提问作者user6574932
相关产品推荐
相关产品推荐

