MLIR的Profiling(性能分析)与Timing(计时)Pass
上周帮团队调一个AI推理引擎的算子性能问题,模型跑在自研NPU上,某个卷积算子的延迟比预期高了3倍。常规手段——插桩、打印时间戳、甚至用perf去抓——都试了,结果发现瓶颈不在计算本身,而在MLIR编译后的IR调度上。那个调度循环展开得过于激进,导致指令缓存频繁miss。这时候我才意识到,MLIR的Profiling和Timing Pass不是锦上添花,而是调试利器。
为什么MLIR需要自己的计时机制
很多人觉得性能分析有perf、gprof就够了,何必在MLIR层面再搞一套?这里有个关键点:MLIR的Pass流水线是分阶段执行的,每个Pass可能对IR做不同粒度的变换。你没法用perf去测量“某个Pattern匹配替换花了多少时间”,因为那是编译期行为,不是运行时行为。MLIR的Timing Pass解决的是编译期性能分析——哪个Pass慢、哪个Pattern匹配耗时、哪个Dialect转换卡住了。
另一个场景是运行时Profiling:你生成的代码跑在目标硬件上,但你想知道IR中某个特定Operation的执行时间。这时候需要把计时指令插入到生成的代码里,而不是事后用外部工具去猜。
Timing Pass:编译期的“秒表”
MLIR自带了一个-mlir-timing选项,开启后会在每个Pass执行前后打时间戳。用法很简单:
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/m0_50546716/article/details/166785361




