與Timing(計時)Pass)
MLIR的Profiling(性能分析)與Timing(計時)Pass上周幫團(tuán)隊調(diào)一個AI推理引擎的算子性能問題,模型跑在自研NPU上,某個卷積算子的延遲比預(yù)期高了3倍。常規(guī)手段——插樁、打印時間戳、甚至用perf去抓——都試了,結(jié)果發(fā)現(xiàn)瓶頸不在計算本身,而在MLIR編譯后的IR調(diào)度上。那個調(diào)度循環(huán)展開得過于激進(jìn),導(dǎo)致指令緩存頻繁miss。這時候我才意識到,MLIR的Profiling和Timing Pass不是錦上添花,而是調(diào)試?yán)?。為什么MLIR需要自己的計時機(jī)制很多人覺得性能分析有perf、gprof就夠了,何必在MLIR層面再搞一套?這里有個關(guān)鍵點:MLIR的Pass流水線是分階段執(zhí)行的,每個Pass可能對IR做不同粒度的變換。你沒法用perf去測量“某個Pattern匹配替換花了多少時間”,因為那是編譯期行為,不是運行時行為。MLIR的Timing Pass解決的是編譯期性能分析——哪個Pass慢、哪個Pattern匹配耗時、哪個Dialect轉(zhuǎn)換卡住了。另一個場景是運行時Profiling:你生成的代碼跑在目標(biāo)硬件上,但你想知道IR中某個特定Operation的執(zhí)行時間。這時候需要把計時指令插入到生成的代碼里,而不是事后用外部工具去猜。Timing Pass:編譯期的“秒表”MLIR自帶了一個-mlir-timing選項,開啟后會在每個Pass執(zhí)行前后打時間戳。用法很簡單: