如何读懂 NPUSim 指令流水图:Perfetto 可视化操作与关键字段全解
【免费下载链接】npu-simulatorNPUSim(全称NPU Simulator)是一款面向算子开发场景的SoC级芯片仿真工具,用于分析运行在AI仿真器上的AI任务在各阶段的精度和性能数据(如指令执行情况等)。该工具有助于用户进行深度性能调优,使研发人员在无法获取或芯片资源紧缺的情况下,也能获得与真实芯片几乎一致的验证效果和性能反馈。项目地址: https://gitcode.com/cann/npu-simulator
NPUSim(NPU Simulator)是一款面向算子开发的SoC 级芯片仿真工具,它能还原 AI 任务在各阶段的精度与性能数据,其中最有价值的产物之一就是指令流水图(Trace)。本文带你用Perfetto打开并读懂 NPUSim 生成的trace_core*.json,一次性搞懂泳道结构、关键指令字段和快速定位瓶颈的方法,让新手也能像老手一样分析性能。
为什么指令流水图是性能调优的核心
指令流水图以指令维度还原每条指令在 AI Core 上的执行时序,并关联调用栈帮助快速定位瓶颈。它比一个汇总数字更直观:
- 看并行:计算与搬运流水是否重叠,是否存在空泡
- 看延迟:某条指令在流水线里停留多久,卡在哪一级
- 看分布:向量、标量、矩阵指令各自占比与耗时
生成指令流水图的完整流程见 使用指南 · 指令流水图,其报告目录结构大致如下:
report/ └── results/ └── kernel_*_reports/ ├── summary.json # 性能分析汇总 ├── aicore_utilization.json # AI Core 利用率 └── core_0/ └── trace_core0.json # 指令流水图(Chrome Tracing JSON)用 Perfetto 三步打开指令流水图
trace_core*.json是标准 Chrome Tracing JSON,推荐优先用 Perfetto 打开(也支持 Chrome 浏览器):
- 导入文件:访问 Perfetto 网页版,点击 "Open trace file",选择
trace_core*.json导入。 - 缩放浏览:用滚轮/快捷键放大缩放到感兴趣的 kernel 时间区间,观察各泳道(轨道)的指令块分布。
- 点击切片:单击任意一个指令块,底部会自动展开Details面板,显示该指令的
Name / Category / Start time / Duration / Thread与Arguments参数。
Perfetto 支持大文件加载、多泳道筛选与 SQL 查询,体验优于 Chrome 内置 tracing。下面是导入后的实际效果,可以看到RVECEX_SL000到RVECEX_SL031一条条向量轨道上,RV_VADD、RV_VMUL等执行块密集排布:
💡小提示:浏览器单页运行时内存上限通常约2GB,超大 trace 可能加载失败;此时可用
report -n指定少数核(如单核)先生成,减小文件体积。
看懂轨道(泳道)命名规律
流水图里每个轨道(泳道)的名字都由核心类型_流水线分组 + 区段_指令类型组合而成,例如AIC_CUBEINSTR_CUBE表示 AIC 核 Cube 流水线。掌握这套命名规律,就能快速定位到目标子核心。常见轨道前缀含义:
| 前缀 | 含义 |
|---|---|
AIC | 矩阵计算核 |
AIV0/AIV1 | 向量核 0 / 向量核 1 |
RVECEX | vector 寄存器 EXECUTE(执行)指令 |
RVECLD | vector 寄存器 LOAD(加载)指令 |
RVECST | vector 寄存器 SET/STORE 指令 |
WARP00/WARP01… | SIMT 模式下按 warp 划分的向量轨道 |
完整轨道名对照表见 使用指南 · 表 2 轨道名说明。
关键字段全解:从指令块到 Arguments
单击指令块后,底部Details面板会给出结构化字段。以图中RV_VADD为例,关键字段解读如下:
| 字段 | 示例值 | 含义 |
|---|---|---|
Name | RV_VADD | 指令名称(如 RV_VLD、RV_PLT、RV_VADD) |
Category | inst | 事件类别,指令为 inst |
Start time | 00:00:00.045… | 指令起始时间 |
Duration | 22ns | 指令执行耗时 |
Thread | AIV0_A2_RVECEX[4] | 所属子核心 / 流水线 / 单元 |
Arguments | unit / task_id / ps / inst_id / exec_ipc | 附加参数,含 IPC 等性能分量 |
其中Arguments里的exec_ipc非常关键:它反映向量执行算力的利用率,理论上限为 2(双发射)。IPC 分量越接近上限,说明算力利用越充分,这一点在 VF 报告里被系统化利用,详见 VF 报告指南。
图中还展示了底部Slices统计视图:框选一段区间后,Perfetto 会汇总该区间内各指令(RV_VLD、RV_VST、RV_VADD等)的Count与Wall Duration,方便你一眼判断哪类指令占了最多时间:
从流水图到瓶颈定位的分析套路
结合流水图与配套报告,建议按下面这条链路排查:
- 看整体:先在 性能分析汇总
summary.json里确认top_level_diagnosis的主导流水线与利用率,判断瓶颈方向。 - 看并行:在流水图上比对计算轨(
CUBE/RVECEX)与搬运轨(MTE1/MTE2)是否重叠,重叠率低说明存在空泡。 - 看单核:用
report -n <core>聚焦可疑核,放大到具体 kernel 区间。 - 看指令:单击耗时最长的指令块,读
Arguments的 IPC、task_id,定位到代码调用栈。
📊 若还想看各类型指令的耗时分布与统计(Min/Max/Mean ticks),可参考指令耗时分布报告,直观呈现
PUSHQ / SCALAR / RVECEX / RVECLD等的分布曲线:
常见问题速查
- 加载失败?:文件过大触发浏览器内存上限,用
report -n减少核数重新生成,或换更大的 trace 可视化后端。 - 轨道太多看不懂?:先认准核心前缀
AIC/AIV0/AIV1,再按指令类型缩放到感兴趣子集。 - IPC 低怎么办?:优先看
exec_ipc与主导流水线利用率,必要时结合 VF 报告 定位最慢的 VF 函数。
一句话总结:指令流水图 = 打开trace_core*.json→ 用Perfetto导入 → 读泳道命名 → 点指令看Arguments/IPC → 结合summary.json定位瓶颈。掌握这套方法,你就能在没有真实芯片的情况下,获得与实芯几乎一致的性能反馈。
📚 延伸阅读:
- 数据采集与报告生成全流程:使用指南
- 使用场景(Kernel 直调 / PyTorch 调用):使用场景
- VF 性能 JSON 字段详解:VF 报告指南
- 报告生成实现源码:report 模块
【免费下载链接】npu-simulatorNPUSim(全称NPU Simulator)是一款面向算子开发场景的SoC级芯片仿真工具,用于分析运行在AI仿真器上的AI任务在各阶段的精度和性能数据(如指令执行情况等)。该工具有助于用户进行深度性能调优,使研发人员在无法获取或芯片资源紧缺的情况下,也能获得与真实芯片几乎一致的验证效果和性能反馈。项目地址: https://gitcode.com/cann/npu-simulator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考