You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:06:04