Pull Request已成功合入, 合并人@ascend-robot
(感谢 shijingchang 的贡献)变更摘要
此 PR 为 bishengir-compile 引入编译级 MLIR 计时上下文,通过新增 CompileTiming、ScopedCompileTimingContext 和 ExternalToolProfiler 等基础设施,使内部 BiShengHIR 管线执行与外部工具调用均纳入统一的计时树中。同时通过 LLVM patch 为 MLIR 计时框架新增 sort 显示模式,支持按 self time 降序排列并保留路径嵌套信息,便于快速定位编译耗时瓶颈。
主要改动
- 新增编译计时基础设施:在
Utils.h/Utils.cpp中定义CompileTiming结构体(封装DefaultTimingManager与根TimingScope)、线程局部的ScopedCompileTimingContextRAII 上下文管理,以及ExternalToolProfiler::run()用于在嵌套计时作用域中执行外部工具并采集耗时。 - 管线执行嵌套计时:在
RetriablePassManager::runOnce()中通过getCurrentCompileTimingScope()获取当前编译计时根作用域,嵌套以管线名称为标签的子作用域,并调用passManager.enableTiming()将其传递给 PassManager。 - 根计时上下文启用:在
BiShengIRCompileMain.cpp的runBiShengIRPipeline()入口处创建CompileTiming timing实例,建立整个编译流程的顶层计时上下文。 - CLI 选项注册:在
bishengir-compile.cpp中调用mlir::registerDefaultTimingManagerCLOptions()注册 MLIR 默认计时管理器的命令行选项。 - LLVM 补丁:sort 显示模式:为 MLIR 计时框架新增
DisplayMode::Sort,实现printAsSort()(按 self time 降序排列计时条目)、getSelfTimeRecord()(计算自身耗时 = 总耗时 − 子节点耗时),并在OutputTextStrategy和OutputJsonStrategy中实现printSortEntry()输出方法,新增 CLI 选项--mlir-timing-display=sort。


代码审查
我已对所有 6 个变更文件进行了全面审查。以下是详细分析:
文件 1: bishengir/include/bishengir/Tools/Utils/Utils.h
- 新增了
CompileTiming、ScopedCompileTimingContext、ExternalToolProfiler结构体和getCurrentCompileTimingScope()函数声明 - 前向声明 + 完整定义的顺序正确:
ScopedCompileTimingContext先被前向声明(第43行),被CompileTiming的unique_ptr成员使用(第48行),然后在第56行给出完整定义。这是正确的 C++ 循环依赖处理模式。 - 无问题。
文件 2: bishengir/lib/Tools/RetriablePassManager/RetriablePassManager.cpp
- 新增了
#include "bishengir/Tools/Utils/Utils.h"以使用getCurrentCompileTimingScope() - 在
runOnce中添加了 timing scope 逻辑(第105-110行):通过getCurrentCompileTimingScope()检查 timing 是否启用,若启用则创建嵌套 scope 并调用passManager.enableTiming()。scope 生命周期正确——在passManager.run()期间有效,函数返回时销毁。 BiShengIRPassManager继承自mlir::PassManager,enableTiming方法可用。- 无问题。
文件 3: bishengir/lib/Tools/Utils/Utils.cpp
thread_local CompileTiming *currentCompileTiming = nullptr用于线程安全的 TLS 指针,正确。ScopedCompileTimingContext构造/析构函数正确地保存/恢复currentCompileTiming,遵循 RAII。CompileTiming::CompileTiming()在 timing 禁用时跳过rootScope创建,context始终创建(允许后续getCurrentCompileTimingScope()返回 null 来跳过 timing)。ExternalToolProfiler::run正确检查 null timing scope。execute()中profilerName的生命周期覆盖ExternalToolProfiler::run调用,StringRef不会悬空。- 无问题。
文件 4: bishengir/lib/Tools/bishengir-compile/BiShengIRCompileMain.cpp
- 在
runBiShengIRPipeline开头添加CompileTiming timing;(第260行),为整个编译流程建立 timing 上下文。 CompileTiming在所有返回路径上通过 RAII 正确销毁。- include 重排序仅为整理,无功能性影响。
- 无问题。
文件 5: bishengir/tools/bishengir-compile/bishengir-compile.cpp
- 新增
mlir::registerDefaultTimingManagerCLOptions();注册--mlir-timing、--mlir-timing-display等 CLI 选项。 - 与已有的
mlir::registerPassManagerCLOptions()不冲突(分别管理不同的选项集)。 - 无问题。
文件 6: build-tools/patches/llvm-project/0078-[Huawei][LLVM]-Enable-timing-sort.patch
- 为 MLIR timing 系统新增
Sort显示模式。 printHeader签名变更为增加bool printColumnHeader参数,Sort 模式下抑制列头(由printSortEntry自行打印)。OutputTextStrategy和OutputJsonStrategy的printSortEntry实现正确。collectSortEntries正确递归构建路径字符串,使用/分隔。printAsSort按 self wall time 降序排列。- JSON 输出的逗号处理正确:所有 sort entry + "Rest" 均带逗号,"Total" 不带,JSON 数组格式有效。
printListEntry("Rest", ...)显式传递lastEntry=false,语义与默认值一致,仅提高可读性。getSelfTimeRecord()中的std::max(0.0, ...)防止计时精度导致的负值。- 无问题。
总结
| 优先级 | 发现数量 |
|---|---|
| P0 | 0 |
| P1 | 0 |
| P2 | 0 |
| P3 | 0 |
总体风险判断:此变更安全,未发现任何 correctness、security、reliability 或 breaking change 问题。 代码遵循 RAII 原则,正确处理了 timing 未启用的边界情况,thread_local 指针使用正确,析构顺序保证了数据一致性。LLVM patch 的 sort 模式实现与现有的 list/tree 模式一致,JSON 和文本输出均正确。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


libing-pipeline创建中,请等待……


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Compile | ✅ | >>> |
| 开发者测试 | CVOps | ✅ | >>> |
| 流水线 | PR-pipeline_npuir-smoke | ✅ | >>> |


Summary
bishengir-compile.bishengir-compile.--mlir-timing-display=sort, sorted by self time with timer paths.Motivation
This change makes
bishengir-compiletiming output more useful for locating compile-time bottlenecks across internal pipelines and external compiler invocations.The new timing context allows individual pipeline runs and external tools to appear under one compile timing tree, while the added sort display mode helps identify high self-time regions without losing nesting
context.