PyPTO 性能调优环境变量 PYPTO_PROF_PMU_EVENT_TYPE 详解:AI Core PMU 事件组选择与采集流程
PyPTO 性能调优环境变量 PYPTO_PROF_PMU_EVENT_TYPE 详解AI Core PMU 事件组选择与采集流程【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pyptoPYPTO_PROF_PMU_EVENT_TYPE 是 CANN PyPTO 用于选择 PMUPerformance Monitoring Unit性能监控单元数据采集模式的环境变量通过指定不同的事件组编号开发者可以采集 AI Core 上不同类型的硬件性能事件用于算子性能瓶颈分析。本文基于该环境变量的官方说明文档结合 pmu_common.cpp、tilefwk_pmu_to_csv.py 等仓库源码完整介绍其取值含义、两种芯片架构下的事件组差异、从环境变量设置到 msprof 采集再到 CSV 解析的完整实操流程帮助开发者在算子调优中快速定位计算利用率、流水线占用、访存带宽等瓶颈。功能概述PMU 数据采集模式的选择入口PMU 是现代处理器中关键的硬件模块专门用于监控和分析处理器的运行性能。在 AI Core 上PMU 内部有多个可编程计数器每个计数器可监控一种或多种事件例如指令执行周期、缓存命中/缺失、存储体读写请求等。由于可编程计数器数量有限PyPTO 将常用事件预定义为多组事件组每个事件组对应一种采集主题。PYPTO_PROF_PMU_EVENT_TYPE 环境变量即用于选择具体的事件组类型整数取值范围1、2、4、5、6、7、8默认值2从源码 pmu_common.cpp 可以看到各取值的语义定义如下取值源码常量采集主题1ARITHMETIC_UTILIZATION算数算术单元利用率如 Cube/Vector 各类指令执行计数2PIPE_UTILIZATION流水线Pipe利用率如 Vector/Cube/Scalar/MTE 各流水线忙碌周期、ICache 命中率4MEMORY内存访问如 UB/L1/L2/主存Main Memory的读请求、写请求5MEMORY_L0L0 级缓存L0A/L0B/L0C的读/写请求6RESOURCE_CONFLICT_RATION资源冲突率如 Bank 冲突、Vector 资源竞争导致的停顿周期7MEMORY_UBUBUnified Buffer读写带宽类事件8L2_CACHEL2 缓存命中/未命中及 victim 替换等事件两种芯片架构下的事件组映射同一事件组编号在不同芯片架构上对应不同的硬件事件 ID 集合。从 pmu_common.cpp 的SetPmuEventTypeDAV2201与SetPmuEventTypeDAV3510两个函数可以看出DAV2201 与 DAV3510 使用完全不同的寄存器事件编码十六进制事件 ID且事件数量上限也不同PMU_EVENT_TYPE_MAX_DAV2201 8、PMU_EVENT_TYPE_MAX_DAV3510 10。例如算数利用率组取值为1DAV2201 对应 7 个事件0x49~0x4fDAV3510 对应 2 个事件0x323、0x324流水线利用率组取值为2默认DAV2201 为 8 个事件0x08、0x0a、0x09、0x0b、0x0c、0x0d、0x55、0x54DAV3510 为 9 个事件0x501、0x301、0x1、0x701、0x202、0x203、0x34、0x35、0x714L2 缓存组取值为8DAV2201 为 6 个事件0x500~0x50aDAV3510 为 6 个事件0x424、0x425、0x426、0x42a、0x42b、0x42c。因此环境变量的取值决定了采集哪个主题而具体采集哪些寄存器事件由运行时根据当前芯片架构自动映射开发者无需关心底层事件 ID。事件组的语义列名解析结果对应列PMU 数据解析脚本 tilefwk_pmu_to_csv.py 中维护了两套事件组列名表table_pmu_header_2201与table_pmu_header_3510可供开发者对照理解每个事件组输出的数据含义取值dav_2201 列名dav_3510 列名1算数利用率cube_fp16_exec、cube_int8_exec、vec_fp32_exec、vec_fp16_128lane_exec、vec_fp16_64lane_exec、vec_int32_exec、vec_misc_execcube_fp_instr_busy、cube_int_instr_busy2流水线利用率vec_busy_cycles、cube_busy_cycles、scalar_busy_cycles、mte1_busy_cycles、mte2_busy_cycles、mte3_busy_cycles、icache_miss、icache_reqpmu_idc_aic_vec_busy_o、cube_instr_busy、scalar_instr_busy、mte1_instr_busy、mte2_instr_busy、mte3_instr_busy、icache_req、icache_miss、pmu_fix_instr_busy4内存访问ub_read_req、ub_write_req、l1_read_req、l1_write_req、l2_read_req、l2_write_req、main_read_req、main_write_reqbif_sc_pmu_read_main_instr_core、bif_sc_pmu_write_main_instr_core、pmu_aiv_ext_rd_ub_instr、ub_pmu_vec_rd_ub_acc、pmu_aiv_ext_wr_ub_instr、ub_pmu_vec_wr_ub_acc、pmu_rd_l1_instr、pmu_wr_l1_instr5L0 内存访问l0a_read_req、l0a_write_req、l0b_read_req、l0b_write_req、l0c_read_req、l0c_write_reqcube_sc_pmu_read_l0a_instr、pmu_wr_l0a_instr、cube_sc_pmu_read_l0b_instr、pmu_wr_l0b_instr、fixp_rd_l0c_instr、cube_sc_pmu_read_l0c_instr、cube_sc_pmu_write_l0c_instr6资源冲突率bankgroup_stall_cycles、bank_stall_cycles、vec_resc_conflict_cyclesstu_pmu_wctl_ub_cflt、ldu_pmu_ib_ub_cflt、pmu_idc_aic_vec_instr_vf_busy_o、idu_pmu_ins_iss_cnt7UB 带宽ub_read_bw_mte、l2_write_bw、main_mem_write_bw、ub_write_bw_mte、ub_read_bw_vector、ub_write_bw_vector、ub_read_bw_scalar、ub_write_bw_scalarpmu_rd_acc_ub_instr_p、pmu_wr_acc_ub_instr_p、pmu_fix_wr_ub_instr、mte_sc_pmu_write_acc_ub_instr_0、mte_sc_pmu_read_acc_ub_instr_0、ub_pmu_vec_rd_ub_acc、ub_pmu_vec_wr_ub_acc8L2 缓存write_cache_hit、write_cache_miss_allocate、r0_read_cache_hit、r0_read_cache_miss_allocate、r1_read_cache_hit、r1_read_cache_miss_allocatebif_sc_pmu_ar_close_l2_hit_core、bif_sc_pmu_ar_close_l2_miss_core、bif_sc_pmu_ar_close_l2_victim_core、bif_sc_pmu_aw_close_l2_hit_core、bif_sc_pmu_aw_close_l2_miss_core、bif_sc_pmu_aw_close_l2_victim_core注意上表中 dav_2201 的5号事件组在解析脚本中存在 l0a_read_req 重复列名的写法实际含义分别为 L0A 读请求与 L0A 写请求解析结果以脚本实际输出列名为准。环境变量的生效机制与默认值回退从 pmu_common.cpp 的PmuCommon::InitPmuEventType可以看到环境变量的处理逻辑通过GetEnvVar(PYPTO_PROF_PMU_EVENT_TYPE)读取环境变量若环境变量未设置字符串为空打印告警日志 Dont support PYPTO_PROF_PMU_EVENT_TYPE env, use default pmu event type PIPE_UTILIZATION.并回退使用默认事件组PIPE_UTILIZATION取值为2若环境变量值无法被解析为整数std::stoi抛出异常同样打印告警并回退到默认事件组2若解析出的整数不在[1, 2, 4, 5, 6, 7, 8]范围内SetPmuEventTypeDAV2201/SetPmuEventTypeDAV3510的 default 分支会打印告警 Invalid profPmuType %d, only support [1,2,4,5,6,7,8].此时pmuEvtType保持全0x0初始值事件组长度依据架构确定DAV2201 固定 8 个事件槽位、DAV3510 固定 10 个事件槽位未用到的事件槽位以0x0填充。因此在实际使用中建议显式设置环境变量为受支持取值避免依赖默认回退或产生无效事件组。完整实操流程配置、采集与解析步骤 1选择采集模式设置环境变量export PYPTO_PROF_PMU_EVENT_TYPE2将取值替换为1、2、4、5、6、7、8中的任意一个即可切换采集主题。以下图片展示了各取值对应的事件组模式图片来源PMU_event.pngPMU支持的模式步骤 2使用 msprof 采集 PMU 数据设置环境变量后在运行 PyPTO 算子脚本时通过msprof命令开启采集# 采集PMU数据 msprof --task-timel3 --output./prof_data python xxx.py其中--task-timel3开启 PMU 采集开关l3表示任务级Task Time三级采集--output指定 PROF 产物的输出路径默认落盘在当前工作目录下。PMU 数据采集完成后会落盘在output/PROF*/device_*/data/目录下PROF_xxx/device_x/data。步骤 3解析 PMU 数据为 CSV# 解析数据 python tools/profiling/tilefwk_pmu_to_csv.py -p PROF_xxx/device_x/data -pe$PYPTO_PROF_PMU_EVENT_TYPE --arch dav_3510解析脚本 tilefwk_pmu_to_csv.py 支持的参数如下参数说明默认值-p, --path待解析的绝对路径即包含aicpu.data*文件的 data 目录必填-pe, --pmuEventPMU 事件组编号choices[1, 2, 4, 5, 6, 7, 8]与PYPTO_PROF_PMU_EVENT_TYPE保持一致2--arch芯片架构类型choices[dav_2201, dav_3510]决定使用哪套事件列名表与事件数dav_2201--outputPMU 数据 CSV 存储路径为空时生成到当前目录下的tilefwk_prof_pmu.csv当前目录解析完成后会在指定的输出目录默认项目根目录下生成tilefwk_prof_pmu.csv文件其中包含thread id、task id、stream id、core id、seqNo、sub task id、total cycle等公共列以及所选事件组对应的各 PMU 计数列。架构参数与事件数匹配解析脚本在 tilefwk_pmu_to_csv.py 中根据--arch与-pe选择事件列名并依据二进制记录中实际携带的计数器数量截断/补充列头。因此--arch必须与实际运行芯片架构一致否则列名与数据无法正确对应。步骤 4分析 CSV 结果生成的 CSV 可通过任意表格工具或 pandas 打开。以默认事件组2流水线利用率为例dav_3510 架构下会输出各任务的cube_instr_busy、scalar_instr_busy、mte1/2/3_instr_busy等列开发者可以据此判断 AI Core 上各硬件流水线的忙碌程度找出计算密集或搬运等待的瓶颈阶段。测试与工具链中的典型用法仓库中已有对该环境变量的自动化使用与验证test_profiling.py 在 ST 测试中通过int(os.environ.get(PYPTO_PROF_PMU_EVENT_TYPE, 2))读取事件组并依据pypto.platform.npuarch自动选择dav_3510/dav_2201架构随后调用 tilefwk_pmu_to_csv.py 完成解析并校验 CSV 中 PMU 计数值非全零test_device_runner.cpp 在单元测试中循环设置PYPTO_PROF_PMU_EVENT_TYPE并断言事件组初始化符合预期work_flow.py 在 PMU 数据工作流脚本中会将PYPTO_PROF_PMU_EVENT_TYPE注入子进程环境变量用于配套的 Profiling 数据解析与绘图流程。这些示例印证了设置环境变量 → 采集 → 解析 → 分析的标准链路也便于开发者将 PMU 采集能力集成到自己的脚本或 CI 流程中。使用约束完整的 PMU 采集流程详见性能调优文档中采集PMU数据章节该章节还介绍了泳道图采集、PMU Trace 核内流水分析等其他性能调优手段建议配合使用环境变量只在支持 PMU 采集的硬件与 Profiling 组件环境下生效msprof工具需随 CANN 环境正常配置事件组编号与硬件架构强相关跨架构移植脚本时请同步核对--arch参数与事件列名含义若需针对核内流水做深度分析MTE2/MTE3/Vector/Cube 时序排布可进一步开启 PMU Traceenable_pmu_trace其与本文的 PMU 事件组采集属于不同能力详见性能调优文档。产品支持情况PYPTO_PROF_PMU_EVENT_TYPE 支持的产品如下Ascend 950PR / Ascend 950DT支持Atlas A3训练系列产品 / Atlas A3推理系列产品支持Atlas A2训练系列产品 / Atlas A2推理系列产品支持小结PYPTO_PROF_PMU_EVENT_TYPE 以极简的整数取值抽象了 AI Core 上复杂的 PMU 寄存器事件配置覆盖算数利用率、流水线利用率、内存访问、L0 缓存、资源冲突、UB 带宽、L2 缓存七大主题并通过运行时按架构自动映射事件 ID使开发者只需选主题、设变量、跑 msprof、解析 CSV即可获得结构化的硬件性能数据。结合 pmu_common.cpp 的事件组定义与 tilefwk_pmu_to_csv.py 的列名映射开发者可以快速定位算子在 AI Core 上的瓶颈所在为后续 TileShape、Stitch、合图等调优手段提供数据依据。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

EMBOSS安装与实战:Linux下序列分析工具集的完整指南

EMBOSS安装与实战:Linux下序列分析工具集的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 18:15:12 阅读更多 →
Visio下载安装全指南:版本选择、激活激活与高频问题排查

Visio下载安装全指南:版本选择、激活激活与高频问题排查

Visio这个软件,很多人是到了要画流程图、画网络拓扑、画UML类图的时候才想起来去下载安装。但真到下载这一步,遇到的问题往往比用起来还多:搜索引擎一翻全是下载站,点进去全是高速下载器;装到一半报错;装完…

2026/9/19 18:15:12 阅读更多 →
UE5+Cesium真实湖泊效果制作:波纹参数调优实战解析

UE5+Cesium真实湖泊效果制作:波纹参数调优实战解析

做过数字孪生和GIS可视化项目的人应该都遇到过这个尴尬:Cesium for Unreal把真实地形、影像、倾斜摄影加载得非常好,全世界都在引擎里,但一到水域就翻车。河流缺失、湖泊扁平、水面像一块反光塑料板,波纹完全没有生命力。这篇文章…

2026/9/19 18:14:12 阅读更多 →

最新新闻

Preact Table 的 AppGroupColumnDef:预绑定组件的增强分组列定义

Preact Table 的 AppGroupColumnDef:预绑定组件的增强分组列定义

前端UI组件 【免费下载链接】table 🤖 Headless UI for building powerful tables & datagrids for TS/JS - React-Table, Vue-Table, Solid-Table, Svelte-Table 项目地址: https://gitcode.com/gh_mirrors/ta/table 点击查看 免费下载 导读 AppG…

2026/9/20 20:39:04 阅读更多 →
用 ChatTTS-ui 在本地跑通离线语音合成:从部署到出声的完整路径

用 ChatTTS-ui 在本地跑通离线语音合成:从部署到出声的完整路径

用 ChatTTS-ui 在本地跑通离线语音合成:从部署到出声的完整路径 【免费下载链接】ChatTTS-ui 一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesiz…

2026/9/20 20:39:04 阅读更多 →
快速备份QQ空间历史说说:GetQzonehistory 新手完整指南

快速备份QQ空间历史说说:GetQzonehistory 新手完整指南

快速备份QQ空间历史说说:GetQzonehistory 新手完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一个把你自己QQ空间里的历史说说抓取下来&#xf…

2026/9/20 20:39:04 阅读更多 →
ChatTTS-ui AMD显卡加速:ROCm全链路配置与实测数据

ChatTTS-ui AMD显卡加速:ROCm全链路配置与实测数据

ChatTTS-ui AMD显卡加速:ROCm全链路配置与实测数据 【免费下载链接】ChatTTS-ui 一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into …

2026/9/20 20:39:04 阅读更多 →
三步装好、三种场景调好:华硕笔记本 GHelper 完整指南

三步装好、三种场景调好:华硕笔记本 GHelper 完整指南

三步装好、三种场景调好:华硕笔记本 GHelper 完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Ex…

2026/9/20 20:39:04 阅读更多 →
OpenCode + DeepSeek API 自配路线,Base URL 填 TaoToken

OpenCode + DeepSeek API 自配路线,Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 20:38:03 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →