Smarterasemi Profiler
Smarterasemi Profiler 是一个用于分析运行日志的 VS Code 扩展。导入包含性能日志的运行目录后,可以在 VS Code 中查看 NPU 汇总指标、各 NPU 状态、执行时间线、聚合数据表以及完整的 Perfetto Trace。
日志解析器已集成到扩展中,使用扩展时不需要安装 Python。
功能
- 导入模拟器运行目录并自动解析性能日志
- 展示 NPU 数量、执行周期、负载率和各类指令统计
- 查看 NPU Cards、执行时间线和聚合数据表
- 按需打开 Perfetto Trace Timeline,避免首次加载时占用过多资源
- 使用
spike.log 为 Trace 事件补充 PC 信息
- 通过调试信息 ELF 和
addr2line 从 PC 跳转到源码
- 支持单 die 和多 die 运行数据
- 生成可供其他工具使用的 JSON 结果
环境要求
使用扩展
- VS Code 1.90 或更高版本
- 仅在需要 PC 源码定位时,才需要 RISC-V
addr2line 和带调试信息的 ELF
快速开始
- 准备一个包含模拟器性能日志的运行目录。
- 在 VS Code 命令面板中运行
Smarterasemi Profiler: Import Run Folder;也可以在 Explorer 中右键目录并选择该命令。
- 扩展解析完成后会打开 Dashboard。
- 点击 打开 Trace Timeline 查看完整 Perfetto 时间线。
- 如果 Trace 事件包含 PC,点击 PC 可配置 ELF 并跳转到对应源码。
输入目录
最小输入只需要一个性能日志:
run-folder/
└── test.log
需要 PC 标注和源码定位时,可以同时提供 spike.log:
run-folder/
├── test.log # 模拟器性能日志
├── spike.log # 可选,用于为 Trace 事件补充 PC
└── firmware.elf # 可选,带调试信息的 RISC-V ELF
导入目录时,扩展会在目录顶层查找 .log 文件,并优先选择 test.log。如果存在多个其他 .log 文件,则按文件名排序后选择第一个,并在解析结果中给出警告。CLI 用户可以通过 --log 明确指定日志。
spike.log 必须与选中的性能日志位于同一目录,才能被扩展自动发现。ELF 可以位于其他位置,首次点击 PC 时再选择即可。
输出文件
默认情况下,扩展会在导入的运行目录中生成:
profiling-result.json
profiling-result.trace.json
profiling-result.json:Dashboard 使用的汇总指标、NPU 实例和事件数据。
profiling-result.trace.json:Perfetto Trace 数据。
将 smarterasemiProfiler.writeOutputToRunFolder 关闭后,这两个文件会写入系统临时目录。ELF 映射配置仍保存在运行目录中。
设置
| 设置 |
默认值 |
说明 |
smarterasemiProfiler.writeOutputToRunFolder |
true |
是否将结果 JSON 写入导入的运行目录;关闭后写入系统临时目录。 |
smarterasemiProfiler.addr2linePath |
"" |
addr2line 可执行文件路径;留空时从常见的 RISC-V 工具链目录和 PATH 中自动查找。 |
PC 源码定位与 ELF 映射
源码定位需要以下数据:
spike.log 中存在可匹配的 PC
- 每个 die 对应一个包含调试信息的 RISC-V ELF
- 可用的
addr2line,建议使用与 ELF 匹配的 riscv64-unknown-elf-addr2line
点击 PC 且当前没有映射时,扩展会打开 ELF 映射编辑器。多 die 运行会在同一张表中显示所有 die,可以逐项选择、按路径模式填充或将一个 ELF 应用到全部 die。自动发现的候选 ELF 只会预填,保存前仍需确认。
导入运行目录后,也可以随时运行 Smarterasemi Profiler: Configure ELF Mapping 手动打开编辑器。
映射保存在运行目录下的 profiling-elf-config.json:
{
"version": 1,
"elf_config": [
{
"die_id": 0,
"elf_path": "D:/firmware/case_die0.elf",
"load_addr": "0x4000000000",
"elf_image_base": "0x20000000"
}
]
}
die_id 对应 Trace 事件的 pid / logical core。只有共享的单 die 回退配置可以省略该字段。
elf_path 是调试信息 ELF 的路径。
load_addr 用于覆盖运行日志中的加载地址,通常不需要填写。
elf_image_base 将原始二进制偏移 0 映射到 ELF VMA。完整的 objcopy -O binary 镜像通常可以从 ELF PT_LOAD 自动推导;经过 section 过滤的镜像可能需要显式设置。
PC、加载地址和 ELF 地址在内部均使用 BigInt 计算,在 JSON 边界使用十六进制字符串。
本地开发
项目包含扩展后端和 React Dashboard 两个构建部分。首次检出后需要分别安装依赖:
npm ci
npm --prefix ui ci
npm --prefix ui run build
npm run build
构建产物分别位于:
dist/:扩展主进程和解析 Worker
ui-dist/:Dashboard 前端
构建完成后,在 VS Code 中按 F5 启动 Extension Development Host,然后运行 Smarterasemi Profiler: Import Run Folder。
修改 Dashboard 后需要重新运行 npm --prefix ui run build;修改扩展后端时可以运行:
npm run watch
测试与检查
npm test
npm run typecheck
打包 VSIX:
npx @vscode/vsce package
命令行解析
解析器也可以脱离 VS Code 使用:
npm run parse -- --run-dir <run-folder>
可用参数:
| 参数 |
必填 |
说明 |
--run-dir <path> |
是 |
运行目录。 |
--log <path> |
否 |
明确指定性能日志。 |
--spike-log <path> |
否 |
明确指定用于 PC 标注的 Spike 日志。 |
--out <path> |
否 |
指定 profiling-result.json 输出路径。 |
--trace <path> |
否 |
指定 Trace JSON 输出路径。 |
示例:
npm run parse -- \
--run-dir ./trace/demo \
--log ./trace/demo/test.log \
--spike-log ./trace/demo/spike.log \
--out ./out/result.json \
--trace ./out/result.trace.json
常见问题
提示 no .log file found
确认导入的是运行目录本身,并且性能日志位于该目录顶层。扩展不会递归查找子目录中的日志。
PC 没有显示源码位置
依次确认:
- 性能日志旁存在正确的
spike.log。
- 已为对应 die 配置正确的 ELF。
- ELF 包含 DWARF 调试信息。
smarterasemiProfiler.addr2linePath 指向与 ELF 架构匹配的 RISC-V addr2line。
- 日志中的加载地址和
elf_image_base 配置正确。
Dashboard 打不开或开发环境显示空白
先构建 React Dashboard,再重新启动 Extension Development Host:
npm --prefix ui run build
npm run build