PyPTO Pass 编译性能优化实战:从 perf 热点定位到数据驱动优化的完整方法论
2026/9/19 4:12:16 网站建设 项目流程

PyPTO Pass 编译性能优化实战:从 perf 热点定位到数据驱动优化的完整方法论

【免费下载链接】pyptoPyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto

PyPTO(Parallel Tensor/Tile Operation 编程范式)的编译链路由大量 IR Pass 组成,当算子规模达到 20 万 Op 级别时,单个 Pass 的平均耗时上限为 20 秒,任何超时的 Pass 都会拖慢整个编译流程。本文基于 pypto-pass-perf-optimizer 技能文档 及其配套脚本,系统讲解一套"日志量化 → Debug 构建 → perf 采样 → 数据驱动优化 → UT 验证 → 火焰图对比"的闭环优化流程,读者可据此定位 PyPTO 中任意 Pass 模块的编译瓶颈并完成可验证的优化交付。

一、优化前必须建立的性能基准

1.1 性能目标与关键术语

PyPTO Pass 编译性能优化以"单 Pass 平均耗时"为核心指标,基准目标定义如下:

  • Op 数量:单个 Function 中的 Operation 总数,从ExpandFunctionPass 的日志行Function[...] operation size is: N after expansion.中获取,对应源码 expand_function.cpp;
  • 平均耗时:Pass 在所有 Function 上执行的平均时间(总耗时 / 执行次数);
  • 线性关系:目标耗时与 Op 数量呈线性关系,即 Op 数量翻倍,目标耗时同步翻倍。

目标时间计算公式

目标平均耗时 = (实际Op数量 / 200,000) × 20s

示例:100,000 Op 对应目标 10s,200,000 Op 对应 20s,300,000 Op 对应 30s。

性能判断标准:实际平均耗时 ≤ 目标平均耗时即"达标",否则进入优化流程。

该动态阈值逻辑在配套脚本中真实生效:parse_pass_perf.py中的get_status()会按(avg_ops / 200000) × time_threshold计算每个 Pass 的动态目标,并输出WARNING (>{threshold}s for {ops} ops)OK状态,见 parse_pass_perf.py。

1.2 为什么必须用 perf 数据而非代码审查

优化纪律的核心是"禁止凭猜测优化":

  1. 精确定位热点:仅靠代码审查无法确定实际热点函数;
  2. 量化分析:需要 cycles、cache-misses 等量化指标;
  3. 调用栈分析perf -g可显示完整调用栈,找出真正的性能瓶颈;
  4. 避免盲目优化:基于实际数据而非猜测进行优化。

同时必须编译Debug 版本:Debug 版本包含完整调试符号,perf 才能正确显示函数名和调用栈;Release 版本优化后可能丢失符号信息。最终性能验证则必须使用 Release 版本,保证性能数据真实准确。

二、阶段一:环境准备与 Pass 耗时日志采集

2.1 指定算子脚本并设置日志环境

用户需指定用于触发 Pass 编译流程的算子脚本(含参数)。随后设置日志环境:

# 开启 info 级别日志 export ASCEND_GLOBAL_LOG_LEVEL=1 # 设置日志落盘路径(默认为算子脚本同目录下的 logs 文件夹) export ASCEND_PROCESS_LOG_PATH=$(dirname {user_specified_script})/logs # 创建日志目录 mkdir -p $ASCEND_PROCESS_LOG_PATH # 日志文件将落盘到:$ASCEND_PROCESS_LOG_PATH/debug/plog/pypto-log-{pid}-{timestamp}.log # 注意:单个日志文件超过 20M 会自动拆分为多个文件 # 拆分文件命名:每个文件都有独立的时间戳(pypto-log-{pid}-{timestamp}.log) # 同一次执行的所有拆分文件具有相同的 pid,可通过 pid 识别

2.2 编译并安装 Release 版本(性能测量用)

# 编译 Python 包(Release 版本,用于性能测试) python3 build_ci.py -f=python3 --build_type Release --disable_auto_execute # 安装到 Python 环境 pip install ./build_out/pypto-*.whl --force-reinstall

2.3 执行算子脚本采集 Pass 耗时

# 执行用户指定的算子脚本(日志自动落盘) # 使用超时控制,默认 5 分钟,超时后自动中断并继续后续步骤 bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 300 python3 {user_specified_script}.py # 自定义超时时间(例如 10 分钟) # bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 600 python3 {user_specified_script}.py

日志文件位于$ASCEND_PROCESS_LOG_PATH/debug/plog/pypto-log-*.log,同一次执行的所有文件具有相同 pid。

2.4 解析日志生成 Pass 耗时排序报告

# 查找最新的日志文件 latest_log=$(find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-) echo "使用日志文件: $latest_log" python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l $latest_log

parse_pass_perf.py的核心解析逻辑基于两条日志正则:

  • Pass 耗时:The Runtime of pass (\S+) for program\s+function \S+ is (\d+) us.
  • Op 数量:Function\[([^\]]+)\] operation size is: (\d+) after expansion.

这两条日志分别来自源码 pass_log.cpp 的LogPassRuntime()(高精度时钟计时,微秒级输出)和 expand_function.cpp 的 ExpandFunction 完成日志。Pass 耗时统计的触发开关是dump_pass_time_cost配置项,默认开启,见 tile_fwk_config.json,在 pass_manager.cpp 中通过passDfxCfg.dumpPassTimeCost控制是否调用LogPassRuntime

2.5 脚本的完整命令行参数

参数说明默认值
-l, --log待分析日志文件路径(必填)
--compare用于对比的优化前日志
--time-threshold时间阈值(秒)20
--ops-thresholdOp 数量基准200000
-q, --quiet静默模式,仅输出分析结果
--log-dir分析日志输出目录./perf_logs
# 对比两个日志文件 python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l pypto-log-after.log --compare pypto-log-before.log # 指定 Op 数量阈值(默认 200000) python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l pypto-log-*.log --ops-threshold 200000 # 指定时间阈值(默认 20s) python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l pypto-log-*.log --time-threshold 20

脚本输出包括:各 Function 的 Op 数量统计、每个 Pass 的执行次数(Count)、平均耗时(Avg)、动态目标阈值(Target)、总耗时(Total)、时间占比(Time%)、对比模式下的提升幅度(Improve%)与达标状态(Status),以及超阈值 Pass 清单和汇总信息(总 Pass 数、超阈值数、总执行次数、总耗时、总提升幅度)。

2.6 超时控制:为什么算子运行超时不影响 Pass 分析

某些算子在运行阶段可能执行超过 1 小时,但对 Pass 编译性能分析而言:

  • Pass 编译信息在编译完成后就已保存在日志中;
  • 运行阶段的长时间执行对 Pass 性能分析没有帮助;
  • 超时中断不会影响 Pass 性能分析结果。

默认配置:超时 300 秒(5 分钟);中断信号为 SIGINT(Ctrl+C);中断后返回退出码 0 并继续后续分析步骤。

自定义超时

bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 600 python3 test.py # 10 分钟 bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 900 python3 test.py # 15 分钟 bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 120 python3 test.py # 2 分钟

技术细节run_with_timeout.sh通过set -m启用作业控制,使后台命令运行在独立进程组(PGID == PID),超时后向整个进程组发送信号,保证 Python 父进程和 fork 出来的 C++ 子进程都能收到;信号采用三级升级策略:SIGINT(等待 10 秒优雅退出)→ SIGTERM(等待 5 秒)→ SIGKILL(最终手段)。退出码约定:0表示成功完成或超时中断(允许继续后续步骤);非 0 表示执行失败(停止后续步骤)。详见 run_with_timeout.sh。

三、阶段二:perf 热点分析与内存分析

3.1 编译 Debug 版本(perf 采样必需)

# 编译 Python 包(Debug 版本带完整调试符号,用于 perf 采样) python3 build_ci.py -f=python3 --build_type Debug # 安装到 Python 环境 pip install ./build_out/pypto-*.whl --force-reinstall

3.2 选项 A:火焰图方式(推荐)

# 生成火焰图(默认 5 分钟超时) # 参数:超时时间(秒) 输出目录 命令... bash "$PASS_PERF_SCRIPTS_DIR/generate_flamegraph.sh" \ 300 ./flamegraphs python3 {user_specified_script}.py # 火焰图将保存到 ./flamegraphs/flamegraph_{timestamp}.svg # 同时生成折叠数据文件 folded_{timestamp}.txt(用于后续对比) # 使用浏览器打开查看 firefox ./flamegraphs/flamegraph_*.svg # 或 google-chrome ./flamegraphs/flamegraph_*.svg

generate_flamegraph.sh内部流程:先用perf record -F 99 -g -e cycles采样(由 run_with_timeout.sh 控制超时),再用perf script输出 +stackcollapse-perf.pl生成折叠数据,最后用flamegraph.pl生成 SVG;若本机无 FlameGraph 工具会自动git clone下载。产出三类文件:flamegraph_{ts}.svgfolded_{ts}.txtperf_{ts}.data,详见 generate_flamegraph.sh。

火焰图解读指南

  • 结构:X 轴表示函数调用栈的样本占比(宽度越大占用 CPU 越多),Y 轴表示调用栈深度(底部是入口,顶部是叶子函数),颜色随机分配仅用于区分函数;
  • 识别热点:顶部宽大的"宽平台"是性能热点优先优化;"高塔尖"调用栈很深,检查过度封装或递归;同一函数反复出现说明被频繁调用,考虑缓存或批处理;"细长条"可能是单线程瓶颈;
  • 交互操作:鼠标悬停显示函数名与样本占比;点击函数放大查看调用栈;Ctrl+F搜索函数名;点击空白处或刷新重置视图。

常见热点模式与优化方向

热点函数问题类型优化方向
_malloc/_free频繁内存分配预分配内存、使用对象池
std::unordered_map::find哈希表查找优化哈希函数、预分配 bucket
std::vector扩容动态扩容使用reserve()预分配
memcpy/memmove大量数据拷贝减少拷贝、使用引用
字符串操作字符串拼接/转换使用std::string_view、预分配
循环内函数调用过度循环循环展开、提前计算

3.3 选项 B:传统 perf report

# 使用 perf 采样 bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 300 \ perf record -g -e cycles,instructions,cache-misses -- python3 {user_specified_script}.py # 查看报告 perf report

perf report 快捷键:+展开调用栈,-折叠调用栈,Enter进入函数详情,/搜索函数名。

分析输出要求:完成火焰图分析后,必须记录热点函数 Top 5(函数名、CPU 占比、所属模块、可能原因)、性能瓶颈类型(计算密集型 / 内存密集型 / IO 密集型)以及优化方向清单。

3.4 内存分析(可选)

# 使用超时控制执行内存分析,默认 5 分钟 bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 300 \ valgrind --tool=massif -- python3 {user_specified_script}.py massif-visualizer massif.out.*

四、阶段三:理解 Pass 功能后再动手

优化前必须充分理解目标 Pass 的功能和业务逻辑,可通过pypto-pass-module-analyzerskill 深入分析,需要弄清:

  • Pass 的整体功能是什么;
  • Pass 的主要处理流程;
  • Pass 的核心数据结构;
  • Pass 的关键算法;
  • Pass 的输入输出。

理解 Pass 功能的好处:知道哪些数据结构可以优化、哪些算法可以改进、哪些步骤是性能瓶颈,从而避免优化破坏功能正确性。该环节为后续优化方案的正确性提供保障。

五、阶段四:基于 perf 数据的性能分析

  • 分析热点函数(步骤 10):从 perf report 中识别 CPU 密集函数(cycles 占比高)、Cache miss 严重函数、内存分配热点;
  • 分析数据结构(步骤 11):检查容器选择是否合理(vector/set/unordered_map/map)、是否有频繁的内存分配/释放、是否有不必要的拷贝操作、是否有可以预分配的容器;
  • 分析算法复杂度(步骤 12):评估时间复杂度(O(n)/O(n²)/O(n³)/O(n log n))、检查重复计算、分析循环嵌套层数、检查可提前终止的循环;
  • 识别瓶颈类型(步骤 13):
瓶颈类型症状描述典型原因
计算密集型CPU 利用率高,cycles 占比高算法复杂度过高、重复计算
内存密集型cache miss 多,内存访问频繁数据结构不合理、缓存不友好
IO 密集型文件读写、日志输出多过多的日志、文件操作

六、阶段五:优化实施与常用代码模式

6.1 添加关键步骤耗时统计

在 Pass 的RunOnFunction或关键函数中添加分步计时,辅助定位 Pass 内部热点:

#include <chrono> // 在 Pass 的 RunOnFunction 或关键函数中添加 auto stepStart = std::chrono::high_resolution_clock::now(); // ... 关键步骤代码 ... auto stepEnd = std::chrono::high_resolution_clock::now(); auto stepDuration = std::chrono::duration_cast<std::chrono::microseconds>(stepEnd - stepStart); PASS_LOGI("[{PassName}] Step {step_name} cost %ld us", stepDuration.count());

建议添加耗时统计的场景:主要循环遍历、图遍历/搜索、数据结构构建、排序/查找操作、内存密集操作。

6.2 算法优化示例

// 优化前:O(n²) 查找 for (auto& op1 : operations) { for (auto& op2 : operations) { if (op1.id == op2.parentId) { ... } } } // 优化后:O(n) 使用哈希表 std::unordered_map<int, Operation*> idToOp; for (auto& op : operations) { idToOp[op.id] = &op; } for (auto& op : operations) { auto it = idToOp.find(op.parentId); if (it != idToOp.end()) { ... } }

6.3 数据结构与内存优化

容器选择指南

场景推荐容器原因
顺序访问std::vector连续内存,缓存友好
频繁查找std::unordered_mapO(1) 查找
需要排序std::set/std::map自动排序
频繁插入删除std::listO(1) 插入删除

内存优化

// 预分配内存 std::vector<Operation*> ops; ops.reserve(expected_size); // 避免多次重新分配 // 使用引用避免拷贝 for (const auto& op : operations) { ... } // 而不是 for (auto op : ...) // 使用 emplace_back 避免临时对象 ops.emplace_back(newOp); // 而不是 ops.push_back(newOp) // 使用 std::move 转移所有权 auto result = std::move(tempVector);

6.4 缓存与数据局部性优化

// 改善数据局部性 struct OpInfo { int id; int parentId; Operation* op; }; std::vector<OpInfo> opInfos; // 连续内存,缓存友好 // 避免"指针追逐" // 优化前:多层指针 for (auto& op : ops) { for (auto& consumer : op->consumers) { for (auto& child : consumer->children) { ... } } } // 优化后:预计算索引 std::vector<std::vector<int>> opToChildren; // 直接索引访问

七、阶段六:UT 验证与优化效果对比

7.1 运行 UT 确保功能正确(优化后第一步)

⚠️ 功能正确性优先于性能优化:性能优化可能引入功能 bug,必须确保 UT 全部通过才能接受优化。

# 查找 Pass 相关 UT 测试文件 # 路径:framework/tests/ut/passes/src/test_{pass_name}.cpp # 运行指定 Pass 的所有 UT(UT 是 C++ 测试,必须使用 -f=cpp 参数) python3 build_ci.py -f=cpp -u="{PassName}Test.*" -j=24 # 示例:运行 AssignMemoryType 的 UT python3 build_ci.py -f=cpp -u="AssignMemoryTypeTest.*" -j=24 # 运行单个测试用例 python3 build_ci.py -f=cpp -u="AssignMemoryTypeTest.AddReshape" -j=24 # 如果 UT 失败: # 1. 检查优化代码是否引入 bug # 2. 必要时回退修改 # 3. 重新优化

7.2 重新编译 Release 并采集优化后数据

# 最终性能验证必须使用 Release 版本,确保性能数据准确 python3 build_ci.py -f=python3 --build_type Release pip install ./build_out/pypto-*.whl --force-reinstall # 重新采集性能数据(日志自动落盘) bash "$PASS_PERF_SCRIPTS_DIR/run_with_timeout.sh" 300 python3 {user_specified_script}.py # 查找最新的日志文件 latest_log=$(find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-) # 与优化前日志对比 python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l $latest_log --compare {优化前日志}

7.3 生成并对比差异火焰图

# 生成优化后的火焰图和折叠数据 bash "$PASS_PERF_SCRIPTS_DIR/generate_flamegraph.sh" \ 300 ./flamegraphs python3 {user_specified_script}.py # 对比优化前后的火焰图(folded 文件) bash "$PASS_PERF_SCRIPTS_DIR/compare_flamegraphs.sh" \ ./flamegraphs/folded_20260313_143022.txt \ ./flamegraphs/folded_20260313_150335.txt # 差异火焰图将保存到 ./flamegraphs/diff_flamegraph_{timestamp}.svg

差异火焰图颜色说明

颜色含义解读
🔴红色/橙色优化后增加的热点⚠️ 需要关注,可能是新引入的性能问题
🔵蓝色/青色优化后减少的热点✅ 优化有效,这些函数耗时减少
灰色基本不变优化对该函数影响不大

对比分析要点:关注红色区域(新出现或增加的热点)、确认蓝色区域(验证优化是否对目标函数有效)、量化对比主要函数优化前后的占比变化。若性能未达标,则重新生成火焰图进行瓶颈分析(不要盲目优化),重复"Debug 编译 → perf 分析 → 优化 → UT 验证"直至达标。

八、阶段七:生成优化总结报告

性能达标后必须生成优化总结报告,记录所有优化措施及其性能影响。先收集数据:

# 1. 查看所有代码变更 git diff --stat HEAD~{n} # n 为优化过程中的 commit 数量 git log --oneline HEAD~{n}..HEAD # 2. 查找优化前后的日志文件 ls -lh $ASCEND_PROCESS_LOG_PATH/debug/plog/pypto-log-*.log | head -5 # 优化前 ls -lh $ASCEND_PROCESS_LOG_PATH/debug/plog/pypto-log-*.log | tail -5 # 优化后 # 3. 查找火焰图文件 ls -lh ./flamegraphs/*.svg ./flamegraphs/*.txt

基于模板生成报告并保存到$ASCEND_PROCESS_LOG_PATH/perf_optimization_report.md

template_path="$PASS_PERF_SCRIPTS_DIR/../templates/perf_optimization_report.md" report_path="$ASCEND_PROCESS_LOG_PATH/perf_optimization_report.md" cp "$template_path" "$report_path"

模板文件为 perf_optimization_report.md,替换占位符后必须保留以下必填章节:## 基本信息## 优化概览## 优化详情## 性能数据汇总## 经验总结## 附录

验证报告完整性:

grep -q "## 基本信息" "$report_path" && \ grep -q "## 优化概览" "$report_path" && \ grep -q "## 优化详情" "$report_path" && \ grep -q "## 性能数据汇总" "$report_path" && \ grep -q "## 经验总结" "$report_path" && \ echo "✅ 报告结构完整" || echo "❌ 报告缺少必填章节"

报告质量检查清单:基本信息完整(Pass 名称、Op 数量、目标耗时计算正确);优化概览准确(前后数据来自实际测量,提升幅度计算正确);每项优化详情完整(问题描述、优化方案、代码变更、性能影响);火焰图路径有效(所有 SVG 路径指向实际存在的文件);perf 数据真实(函数名和占比来自实际 perf report);性能汇总一致(各优化项贡献之和 ≈ 总提升幅度);经验总结有价值(可复用模式清晰、后续建议具体可行)。

九、日志文件管理技巧

9.1 查找最新日志文件

# 方法 1:使用 find 命令查找最新日志文件 latest_log=$(find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-) # 方法 2:使用 ls 按时间排序查找 latest_log=$(find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f | xargs ls -t | head -1)

9.2 处理拆分的日志文件(单文件超 20M 自动拆分)

# 拆分文件命名:pypto-log-{pid}-{timestamp1}.log、pypto-log-{pid}-{timestamp2}.log ... # 同一次执行的所有文件具有相同的 pid # 方法 1:手动提取 pid 查找 log_file="pypto-log-1051473-20260312202107387.log" pid=$(echo "$log_file" | sed 's/pypto-log-\([0-9]*\)-.*/\1/') ls -lh pypto-log-${pid}-*.log # 方法 2:自动分析(推荐) # parse_pass_perf.py 会自动检测并处理所有拆分文件(find_split_log_files 按 pid 聚合) python3 "$PASS_PERF_SCRIPTS_DIR/parse_pass_perf.py" -l pypto-log-1051473-20260312202107387.log

parse_pass_perf.pyfind_split_log_files()会依据文件名中的 pid 正则(pypto-log-(\d+)_\d+\.log)自动聚合同一次执行的所有拆分文件并排序解析,见 parse_pass_perf.py。

9.3 按进程或时间筛选日志

# 查看所有日志文件(按时间/大小排序) find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f | xargs ls -lht find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f -exec ls -lh {} \; | sort -k5 -h # 查找特定进程ID的所有日志文件 find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-1051473-*.log" -type f # 查找特定日期的日志文件(2026年3月12日) find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*-20260312*.log" -type f # 统计每次执行产生的日志文件数量(按 pid 分组) find $ASCEND_PROCESS_LOG_PATH/debug/plog -name "pypto-log-*.log" -type f | \ sed 's/pypto-log-\([0-9]*\)-.*/\1/' | sort | uniq -c

十、历史优化案例与通用模式沉淀

10.1 仓库内的真实优化案例

案例Pass优化方法
案例1DynAttrToStatic引用语义消除冗余拷贝(auto&替代auto)+ 短路求值,条件不满足立即break终止遍历
案例2ReplaceTensor空间换时间:预构建tensorToOrderIndex索引映射,将 O(n²) 降为 O(1) 查找
案例3SplitReshape记忆化搜索添加 Cache 避免重复计算 + 两层嵌套哈希扁平化为map<pair<K1,K2>, V>
案例4SplitLargeFanoutTensor零拷贝设计:提取核心计算逻辑直接传递 offset/shape 参数,消除临时对象构造开销
案例5OoOschedulerCopy-on-Write 策略:shared_ptr实现数据共享,仅在修改时触发深拷贝

10.2 通用优化模式总结

模式适用场景示例案例
提前终止条件检查类遍历案例1
避免拷贝遍历容器时案例1
预计算索引重复遍历同一数据案例2
添加缓存重复计算相同结果案例3
数据结构简化多层嵌套容器案例3
避免临时对象频繁创建销毁对象案例4
Copy-on-Write大数据频繁复制案例5

十一、参考资料索引

类别文件路径
技能文档.agents/skills/pypto-pass-perf-optimizer/SKILL.md
Pass 耗时解析脚本.agents/skills/pypto-pass-perf-optimizer/scripts/parse_pass_perf.py
超时控制脚本.agents/skills/pypto-pass-perf-optimizer/scripts/run_with_timeout.sh
火焰图生成脚本.agents/skills/pypto-pass-perf-optimizer/scripts/generate_flamegraph.sh
火焰图对比脚本.agents/skills/pypto-pass-perf-optimizer/scripts/compare_flamegraphs.sh
优化报告模板.agents/skills/pypto-pass-perf-optimizer/templates/perf_optimization_report.md
Pass 日志机制framework/src/passes/pass_mgr/pass_manager.cpp
耗时统计函数LogPassRuntime()framework/src/passes/pass_log/pass_log.cpp
Op 数量日志expand_function.cppframework/src/passes/tensor_graph_pass/expand_function.cpp
Pass 耗时开关配置framework/src/interface/configs/tile_fwk_config.json
UT 测试目录framework/tests/ut/passes/

整套方法论的要点可以浓缩为一句话:先量化(日志)再定位(perf),先验证(UT)再交付(报告)。任何跳过 perf 分析的"代码审查式优化",或跳过 UT 的"性能优先式优化",都在技能文档中被明确列为必须避免的错误路径。

【免费下载链接】pyptoPyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询