| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(autofuse): support effective-view NDDMA models Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1792 merge fix/frontend-shape-abi-sync into develop feat(autofuse): support effective-view NDDMA models Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 本 PR 将 ATT 的 NDDMA 描述和性能模型对齐到 codegen 实际发出的 DataCopy NDDMA 参数,并补齐 effective rank 1~5 的统一建模。 | 问题 | 原有行为 | 风险/影响 | 本 PR 目标 | |---|---|---|---| | 描述口径不一致 | ATT 使用 raw view,codegen 在发出 API 前还会忽略双零 stride 轴、合并连续轴并应用 tail actual size | ATT 可能按错误 rank、dim 或 stride 选模 | NddmaDescriptorInfo 固定表示 codegen-equivalent effective view | | 模型维度不完整 | 新模型只覆盖 1D | 2D~5D 只能进入 legacy 路径 | effective rank 1 使用 1D 模型,2~5 使用统一任意维模型 | | 合轴规则重复 | ATT 与 codegen 各自判断零 stride 和连续轴 | 两侧规则容易随迭代漂移 | 仅抽取两个无状态判定 helper,保留 CalculateDmaParams 原状态机和变量 | | dtype 口径不完整 | 维度/stride 以元素为单位,公式需要字节量 | B8/B16/B32/B64 预测可能量纲错误 | 总数据量和输入 stride 修正统一乘 dtype_size | | fallback 难定位 | 选模失败缺少稳定、统一的上下文 | 设备侧难区分 rank、dtype、schema 等原因 | DEBUG 日志输出模型、raw/effective rank 和 fallback reason | 同时修复远端 ST_Test_autofuse_ascendc_api 暴露的 Broadcast/IndirectLoad 图改写一致性问题,并将 EvaluateNddmaModel 拆分到单函数 50 行以内;这些修复不改变 NDDMA 公式和 codegen 搬运行为。 ## 修改方案 ### 1. effective view 与 codegen 对齐 NddmaDescriptorInfo 只保存最终用于建模的 effective view: | 字段 | 含义 | 单位/顺序 | |---|---|---| | output_dims | 合轴并应用 full/tail actual repeat 后的搬运维度 | 元素,外轴 → 内轴 | | input_strides | effective GM stride | 元素,外轴 → 内轴 | | output_strides | effective UB vectorized stride | 元素,外轴 → 内轴 | | vectorized_axis | 每个 effective 维度对应的代表轴 | 与上述向量一一对应 | 为了控制 codegen review 风险,CalculateDmaParams 的遍历方向、状态变量、合并顺序和 SetDataCopyParams 调用均保留,仅将以下已有判断抽到 common_utils 供 ATT/codegen 共用: - ShouldIgnoreDataCopyZeroAxis:双零 stride 轴忽略条件; - IsDataCopyAxisContinuous:GM/UB 两侧连续轴合并条件。 tile-inner 边界仍由调用侧已有元数据提供,不新增 descriptor 字段或新的中间实体。 ### 2. 支持 effective rank 1~5 | effective rank | 模型 | 行为 | |---:|---|---| | 1 | NDDMA_1D_MULTICORE_V2 | 使用统一公式的单层形式 | | 2~5 | NDDMA_ND_MULTICORE_V1 | 对每个 effective 层级累加 residual | | >5 | legacy GetDmaPerf | 保留现有 outer-loop fallback | | 非法 dtype/schema/stride/cycles | legacy GetDmaPerf | 输出稳定 fallback reason,不写入无效表达式 | 统一公式按 effective rank D 计算: text B = dtype_size × Π(d_j) B_j = dtype_size × Π(d_m), m=j...D-1 s_j = min(îs_j × dtype_size, 128) g_j = min(1, ôs_j - 1) N_j = NG_j + NGU_j (block_dim <= 2) (NG_j + NGU_j) × rho_j (block_dim > 2) cycles = N_base + Σ N_j, j=0...D-1 其中 îs_j/ôs_j 由当前层 stride 与更内层覆盖范围的差值计算;动态 dim/stride 保留符号表达式。BuildNddma1DResidual 的名字表示“单个层级的 residual”,多维模型逐层调用同一公式,不是把完整 1D 模型重复叠加;N_base 只计算一次。 ### 3. 校验、日志与 fallback | 检查点 | 处理 | |---|---| | ATT data_type_size 与 dtype 映射不一致 | kDtypeUnsupported fallback | | effective rank 不在 1~5 | kRankUnsupported fallback | | dim/stride/schema 非法 | 对应稳定 reason fallback | | 静态公式得到非正 cycles | kSchemaMismatch fallback | | CV-Fusion descriptor 与默认 codegen 语义不同 | 保持 legacy 路径 | 新增两类关键 DEBUG 日志用于两侧 golden 对照: - codegen:raw/effective rank、repeats、GM/UB strides、vectorized axis; - ATT:selected/fallback、模型名、raw/effective rank、reason。 ### 4. 远端 ST 与代码告警修复 | 位置 | 修改 | 原因 | |---|---|---| | broadcast_backward_pass.cpp | Broadcast 后移时同步 compute_node->attr.sched.axis | tensor axis 已更新但 node schedule axis 未同步,后续 zero-stride 轴识别失败 | | indirect_load_schedule_case_generator.cpp | Broadcast path 折叠后再次复用 RewriteInputPreNodes | Load -> Abs -> Broadcast -> IndirectLoad 折叠后重新暴露 Abs,需要再次搬移 | | nddma_model.cpp | 抽取 BuildNddmaCoreCycles 等已有逻辑 | EvaluateNddmaModel 由 67 NBNC 行降至 44 行,计算顺序与公式不变 | | optimize_st.cpp | 接受语义等价的 scalar broadcast chain | 避免对等价节点名称作不必要的唯一性假设 | ## 代码修改流程图 ### effective descriptor 构造 mermaid flowchart LR A[raw repeats / GM strides / UB strides] --> B[从内轴向外轴遍历] B --> C{双零 stride 轴可忽略?} C -->|是| B C -->|否| D{GM 与 UB 均连续<br/>且未跨 tile-inner?} D -->|是| E[合并到当前 effective 维] D -->|否| F[新建 effective 维] E --> B F --> B B -->|结束| G[反转为外轴到内轴] G --> H[ATT 替换 full/tail actual repeat] H --> I[NddmaDescriptorInfo effective view] ### 模型选择与 fallback mermaid flowchart TD A[NDDMA NodeInfo + effective descriptor] --> B{CV-Fusion / dtype / schema 合法?} B -->|否| L[记录 fallback reason] B -->|是| C{effective rank} C -->|1| D[NDDMA_1D_MULTICORE_V2] C -->|2~5| E[NDDMA_ND_MULTICORE_V1] C -->|大于 5| L D --> F[计算一次 N_base] E --> F F --> G[逐 effective 层构造 residual] G --> H{静态 cycles > 0?} H -->|是或动态| I[写入 AIV_MTE2] H -->|否| L L --> M[沿用 legacy GetDmaPerf] ### Broadcast/IndirectLoad 修复链路 mermaid sequenceDiagram participant P as RewriteInputPreNodes participant B as RewriteBroadcastPaths participant C as CollectRewrittenRegion P->>B: 先搬移当前可见前驱 B->>B: 折叠 Broadcast path B->>P: 再搬移新暴露的前驱 P->>C: 在最终图上收集边界和 region ## 测试用例说明 ### 1. 功能与回归验证 主要构建命令: bash cmake --build build --target \ att_ut optimize_ut \ indirect_load_broadcast_axis_simt_test_codegen_v2 \ -j 8 | 验证项 | 结果 | 覆盖内容 | |---|---:|---| | NDDMA 专项 UT | **32/32 PASS** | 1D~5D、dtype、动态表达式、tail/tile-inner、非法输入与 fallback | | Optimize 全量 UT | **636 PASS / 48 SKIP / 0 FAIL** | Broadcast、IndirectLoad 及既有 optimize 回归 | | IndirectLoad codegen 矩阵 | **53/53 PASS** | Broadcast axis、SIMT 与路径改写组合 | | 目标 AscendC ST | **1/1 PASS** | indirect_load_broadcast_axis_simt_test_codegen_v2 | | Round7 analyzer UT | **12/12 PASS**(含 6 个 subtests) | 4D/5D 配置解析、参数合并与结果分析 | | Round7 配置 dry-run | **14,313/14,313 校验通过** | 4D/5D、5 种 layout 组、4 种 dtype | | CANN 9.2 package | **构建及 run 包 --check PASS** | 打包交付链路 | | 静态检查 | **PASS** | git diff --check、clang-format、pre-commit、OAT | | PR 远端 compile | **success** | Pipeline #1067944,SHA e488e759671b | ### 2. BBIT 数值、模型证据与 task duration 环境:同一 CANN 9.2 环境,warmup=2、repeat=5。speedup = baseline_median / candidate_median,大于 1 表示 candidate 更快。 | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NC018 | 495.935 | 485.037 | **1.022** | baseline/candidate PASS | | NC019 | 7400.639 | 7431.755 | **0.996** | baseline/candidate PASS | | NC020 | 2966.773 | 3022.778 | **0.981** | baseline/candidate PASS | | P0-RD-01 | 548.954 | 576.085 | **0.953** | baseline/candidate PASS | | P0-RD-02 | 793.541 | 789.034 | **1.006** | baseline/candidate PASS | | P0-RD-03 | 471.708 | 465.699 | **1.013** | baseline/candidate PASS | 验证结果: - 6/6 case 均有正的 profiler task duration,baseline/candidate 数值均 PASS; - baseline/candidate 各捕获 66 行 AIV_MTE2,candidate 捕获 30 行 NDDMA selected/model 日志; - compare_nddma_packages 在 min_speedup=0.9 下 PASS,无 regression 记录; - 严格 speedup >= 1.0 未全部满足,NC019、NC020、P0-RD-01 属于实测回退,本 PR 不修改参数掩盖该结果。 模型选择日志包含以下代表性路径: | Case/节点形态 | raw rank | effective rank | 选择结果 | |---|---:|---:|---| | NC018 transpose/load | 2 | 2 | NDDMA_ND_MULTICORE_V1 | | NC020 slice/load 合轴路径 | 2 | 1 | NDDMA_1D_MULTICORE_V2 | | P0-RD-02 多轴 reduce/load | 3 | 3 | NDDMA_ND_MULTICORE_V1 | ### 3. 5D/6D 泛化 BBIT | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NDDMA-5D | 324.156 | 319.084 | **1.016** | PASS | | NDDMA-6D | 436.204 | 279.495 | **1.561** | PASS | 5D/6D 正式设备用例证明数值和 task-duration 链路有效;该次正式 package 日志没有 AIV_MTE2/model/effective-rank 字段,因此不将它作为 rank 选择或预测误差通过的证据。 ### 4. 构造/编译耗时 六个正式 case 的 comparison.json 已记录 compile time。按 baseline / candidate 统计: | 指标 | 结果 | |---|---:| | 最小比值 | 0.934 | | 中位比值 | 0.990 | | 最大比值 | 1.051 | | 算术平均 | 0.987 | 当前数据未显示数量级回退,但这不是隔离 BuildNddmaDescriptor/EvaluateNddmaModel 的微基准;独立构造耗时 benchmark 仍保留为未完成验收项。 ### 5. Round7 预测误差 完整设备采集共 14,313 条 4D/5D 配置。以下是**不修改模型参数**、仅按 codegen effective-view 口径离线重算的结果: | 数据组 | MAPE | |---|---:| | 总体 | **188.78%** | | continuous | **23.87%** | | transpose_dim1_dim4 | **342.56%** | | transpose_dim1_dim5 | **344.60%** | 该结果说明 effective-view 对齐改善了描述一致性,但预测误差仍未达到设计目标(continuous 仍高于 10%,两个 transpose 组误差约为实测时延的 3.4 倍)。本 PR 不调整公式参数,不能将“采集完成”表述为“预测精度验收通过”。 ### 6.Slice/Split泛化用例测试 | 指标 | 原始 | v1(小尾轴) | v2(尾轴对齐) | v3(关闭打分) | **v4(Nddma+关闭打分)** | |---|---|---|---|---|---| | Pass数 | 38 | 40 | 54 | 102 | **135** | | 净增Pass | - | +2 | +16 | +64 | **+97** | | Fail→Pass | - | ~2 | ~46 | 71 | **100** | | Pass→Fail | - | ~0 | ~30 | 7 | **3** | | 迭代加速比中位数 | 0.961 | 1.060 | 1.087 | 0.992 | **0.993** | | 加速比<1用例数 | 113 | 59 | 43 | 72 | **87** | v4(Nddma(建模优化)相比v3新增34个Fail→Pass,主要集中在: - **SliceSingleGraph系列**(26个):GESlice和GEStrideSlice的小算子场景,Nddma建模优化使模板选择更准确 - **SliceSplitToElemwise系列**(6个):GEIsFinite、GENeg、GEBitwiseAnd等,算子加速比1.47~1.72 - **SelectPostFuseGraph**(1个):ratio=1.05 ### 7.ATT.泛化用例 整体性能略有劣化: | 指标 | Round1 (默认cann) | Round2 (nddma_nd fix) | 差异 | |------|-------------------|-----------------------|------| | 统计用例数 | 128 | 128 | - | | 平均加速比 | 1.9288x | 1.8945x | -0.0343x | | 加速比提升的用例 | - | - | 54 | | 加速比下降的用例 | - | - | 74 | 劣化主要原因是下面3个用例,待进一步分析原因。 | 用例名 | R1 ratio | R2 ratio | delta | |--------|----------|----------|-------| | tc_af_tf_generalization_att_0086 | 3.6214 | 1.1535 | -2.4679 | | tc_af_tf_generalization_att_0003 | 2.1284 | 1.1911 | -0.9373 | | tc_af_tf_generalization_att_0023 | 2.4499 | 1.8956 | -0.5542 | 3个用例劣化较为明显,根因分析: | 用例 | 算子 | 切换的模板 | 变化原因 | AIV_MTE2 变化 | 估值方向 | 实际影响 | |------|------|-----------|----------|--------------|---------|----------| | att_0086 | Relu_Transpose | result0_g0: case1→case0 | case1 MTE2 **膨胀 +756%** | 6755→57917 | 过高估值使case1被弃 | af 5.95→18.48us | | att_0003 | ReduceMax_BroadcastTo_Add | result0_g0: case0→case1 | case1 MTE2 **下降 -53.4%** | 9144→4257 | 过低估值使case1被选 | af 2.77→5.05us | | att_0023 | Mul_ClipByValue_ReduceSum | result0_g0: case0→case1 | case1 MTE2 **下降 -51.6%** | 8988→4353 | 过低估值使case1被选 | af 3.66→4.74us | 其中att_0086模板切换的原因: transpose双切分的场景,新建模对nddma估值偏大 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本次为内部行为调整,无需修改用户文档 - [x] 我在标题中使用了合适的类型标签(fix:) - [x] 我已经详细阅读并遵守 CONTRIBUTING.md ## 其他信息 - PR 目标分支为 cann/graph-autofusion:develop,当前 HEAD 为 e488e759671b。 - 未修改 NDDMA 模型参数或校准系数;性能与误差未通过项已明确保留。 - effective rank >5、CV-Fusion 和非法输入继续复用既有 legacy 路径。 - 工作区中的未跟踪 docs 和测试产物未纳入提交。 See merge request: cann/graph-autofusion!1792 | 1 天前 | |
【PR】:[feat] [autofuse] Migrate autofuse from ge to graph-autofusion. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !301 merge master_af into master 【PR】:[feat] [autofuse] Migrate autofuse from ge to graph-autofusion. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 从 ge 仓解耦autofuse组件,从ge仓的compiler/graph/optimize/autofuse目录迁移至本仓autofuse目录,未来在本仓独立发包和演进,ge 仓的集成方式不变。 迁移内容主要包括自动融合范围识别、自动算子代码生成、Auto Tiling优化、动态shape及混合精度等特性。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.上板验证inductor+af单片段流程pass 2.上板验证inductor+af整网流程pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!301 | 3 个月前 | |
feat: 支持 IsInf 和 MaskedFill elementwise 算子自动融合(#51) Co-authored-by: Jett_Woo<wujinteng1@huawei.com> # message auto-generated for no-merge-commit merge: !1000 merge feature/isinf-maskedfill-v3 into develop feat: 支持 IsInf 和 MaskedFill elementwise 算子自动融合(#51) Created-by: Jett_Woo Commit-by: Jett_Woo Merged-by: cann-robot Description: ## 描述 本 PR 为 graph-autofusion 项目添加 IsInf 和 MaskedFill 两个 elementwise 算子的自动融合支持,解决 Issue #51。 ### 主要变更 1. **IsInf 算子支持** - V1 实现:自定义位运算算法(参照 IsNan 实现) - V2 实现:复用 CANN SDK adv_api/math/is_inf.h - 支持 FP16、FP32(V1/V2),BF16(仅 V2) 2. **MaskedFill 算子支持** - 复用 Select 算子的 WhereApiCall 代码生成 - 新增 MaskedFillInputReorderPass 图优化 Pass - 输入重排:(x, mask, value) → (mask, value, x) - 支持 scalar value 和 tensor value 3. **自动融合** - 实现 IsInf + LogicalOr + MaskedFill 的自动融合 - 生成单个 AscBackend kernel,提升性能 ### 修复内容 相比 PR #624,本 PR 修复了以下问题: 1. **Split 算子注册错误**:恢复 REG_ASC_IR(Split) 使用正确的 SplitAscIrAttImplV2 / SplitAscIrCodegenImplV2 实现 2. **Select 算子注册缺失**:补回独立的 REG_ASC_IR(Select) 注册 3. **魔鬼数字**:在 masked_fill_input_reorder_pass.cpp 中使用命名常量替代硬编码数字 ## 变更类型 - [x] ✨ 新功能 - [x] 🐛 Bug 修复(修复 PR #624 引入的回归问题) ## 关联的 Issue Closes #51 ## 如何测试 1. 编译通过:sh build.sh --pkg -j 8 2. 单元测试通过: bash sh build.sh -u --module=autofuse_framework -j 8 ./build/autofuse/tests/ut/ascir/reg_func/test_reg_func_is_inf ./build/autofuse/tests/ut/ascir/reg_func/test_reg_func_masked_fill ./build/autofuse/tests/ut/optimize/test_masked_fill_input_reorder_pass 3. 集成测试通过: bash sh build.sh -s --module=autofuse_e2e -j 8 4. CI 流水线全部通过 5. 包含 Split 算子的融合场景(如 SASRec 模型)不再报错 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档(设计文档已添加 UML 建模和 4+1 视图) - [x] 我在标题中使用了合适的类型标签(feat:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定 ## 其他信息 ### 文件变更统计 - 新增文件:14 个 - 修改文件:22 个 - 总计:36 个文件变更 ### 关键设计决策 1. **IsInf V1 实现**:使用位运算算法,不依赖 CANN SDK 版本 2. **MaskedFill 实现**:通过 GraphPass 将节点类型转换为 Select,完全复用 Select 的 codegen 逻辑 3. **输入重排**:在 GraphPass 阶段统一处理,确保 dtype schema 正确同步 ### 设计文档 见issue [#51](https://gitcode.com/cann/graph-autofusion/issues/51) See merge request: cann/graph-autofusion!1000 | 2 个月前 | |
【PR】: [feat] [autofuse] joint debug with ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !349 merge master_joint_debug_with_ge into master 【PR】: [feat] [autofuse] joint debug with ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 1、修改autofuse后端代码,与ge仓的autofuse前端代码进行联调 2、修复硬编码以及非root用户卸载残留问题 3、适配工程禁用ASCEND_INSTALL_PATH的需求 4、新增cann包安装控制项,用于控制是否安装autofuse后端的编译产物(libaihac_codegen.so/libaihac_ir_register.so/libaihac_ir.so/pyautofuse.so等库) ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. graph-autofusion仓编译构建成功,出包验证安装卸载正常 2. 装包后autofuse红线用例验证通过 说明:此pr上库后装graph-autofusion的cann包默认是不会装autofuse产物的,故不会对现有的ge流程有影响,只有显示指定--autofuse安装选项才会安装autofuse产物,后续等ge仓代码要上库时此开关会同步放开。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!349 | 3 个月前 | |
【质量加固】显式声明部分 lambda 捕获列表 Co-authored-by: wzx_0826<wzx_0826@163.com> # message auto-generated for no-merge-commit merge: !1756 merge quality-hardening-autofuse into develop 【质量加固】显式声明部分 lambda 捕获列表 Created-by: wzx_0826 Commit-by: wzx_0826 Merged-by: cann-robot Description: ## 变更说明 本 PR 用于参与 issue #238 的“质量加固”活动。 本次在 autofuse 目录内对 10 处 C++ lambda 默认捕获进行显式捕获声明,避免使用 [&] 默认捕获模式。 See merge request: cann/graph-autofusion!1756 | 7 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 2 个月前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 1 个月前 | |
feat: add IndirectLoad fusion support Co-authored-by: xiebangrui<xiebangrui@huawei.com> # message auto-generated for no-merge-commit merge: !1463 merge IL into develop feat: add IndirectLoad fusion support Created-by: xiebangrui2025 Commit-by: xiebangrui Merged-by: cann-robot Description: ## 描述 本 PR 提供 IndirectLoad 相关能力支持,覆盖 codegen、autoschedule、Python 绑定、测试与 v35 路径的配套实现。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 已按限定文件范围执行 pre-commit,结果通过。 2. 已完成本地代码提交与推送。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 源分支:xiebangrui2025/graph-autofusion:IL - 目标分支:cann/graph-autofusion:develop See merge request: cann/graph-autofusion!1463 | 29 天前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 1 个月前 | |
【PR】: codegen infershape remove unused symbol Co-authored-by: chengyutao3<chengyutao3@huawei.com> # message auto-generated for no-merge-commit merge: !1688 merge develop into develop 【PR】: codegen infershape remove unused symbol Created-by: chengyutao3 Commit-by: chengyutao3 Merged-by: cann-robot Description: # Pull Request ## 描述 优化 InferShape 代码生成逻辑:在生成符号变量声明前,先扫描所有 shape 表达式,仅对实际被引用的符号生成 auto xxx = ... 声明,避免输出未使用的变量代码。 具体实现: - 遍历所有推断 shape 表达式,按完整单词边界匹配 shape_info 中的符号名,收集被引用的符号到 used_symbols 集合。 - 在生成变量声明时跳过未被引用的符号,减少死代码。 ## 变更类型 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 编译带 infershape 的融合子图,触发 GenInferShapeFunc 生成。 2. 检查生成的 .cpp 文件中 InferShape 函数,确认不包含未被 shape 表达式引用的符号变量声明。 ## 核对清单 <!-- [x] 表示选中 --> - [ ] 我的代码遵循了项目的代码风格 - [ ] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [ ] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [ ] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 仅修改 autofuse/codegen/codegen_infershape.cpp,新增 23 行,新增 <set> 头文件依赖。 See merge request: cann/graph-autofusion!1688 | 4 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 2 个月前 | |
feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Co-authored-by: xuyafei<xuyafei3@huawei.com> # message auto-generated for no-merge-commit merge: !1700 merge reapply-pr1657-cv-fusion into develop feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Created-by: xuyafei Commit-by: xuyf;xuyafei Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 CV tiling wrapper 重复编译 Inductor CV fusion 场景会生成主 tiling 源文件和 cube tiling wrapper 源文件。原流程在 host/device 链接链路中会随每次编译重新处理 wrapper 源文件, AutofuseDoCubeMatMulTiling 等 wrapper 实现会重复参与 host 编译,增加编译耗时。 本次将 CV tiling wrapper 编译为可复用 shared object,并按 wrapper 源码、CANN 路径、平台架构、SoC、编译选项等生成缓存 key,避免相同 wrapper 在同一缓存根目录下重复编译。 #### 1.2 非 CV 编译链路可能被 stale shared wrapper 状态污染 shared_cv_wrapper_so 是 CV wrapper 复用流程的中间状态。如果同一个编译参数对象或流程边界中残留该字段,非 CV host/device 链接不应追加 CV wrapper so,也不应切换到 CV 专用链接库。 本次补充非 CV 边界保护,确保 shared CV wrapper 只在 CVAutofuseTilingData 相关编译中生效。 #### 1.3 CV wrapper cache 目录清理策略 static_shape_kernel_proc 会清理临时目录。为了让 wrapper 编译产物可跨重编译阶段复用,需要保留 cv_tiling_wrapper_cache,避免静态 shape 重编译阶段误删缓存。 #### 1.4 CV 融合位宽/精度转换 CV fusion 场景中,Cast、RoundToInt、TruncToInt、FloorToInt 等位宽转换算子需要同时处理 float16、bfloat16、float32、int32 等不同输入/输出精度。原代码复用普通向量路径的一维 actual_size 和默认 stride,未按 CV stage 的二维 curAivM/curAivN 以及 dtype 位宽计算对齐,可能导致不同位宽转换链路中的 Cast 参数、DataCopy stride 或 RemovePad/GatherMask 处理不一致,进而影响转换精度和访存正确性。 本次补齐 CV stage 下的 dtype-aware dims/stride 生成逻辑:统一按 curAivM/curAivN 生成二维 Cast 参数,按 tensor dtype 计算 block-aligned N 方向 stride,并区分 UBFuse 与 fallback 路径处理 DataCopy。UBFuse 路径使用 dtype 对齐后的 load/store 参数并跳过不必要的 RemovePad;fallback 路径继续针对 1/2/4 字节类型生成 GatherMask 去 padding 逻辑,保证低位宽与高位宽数据在拷入、计算和拷出链路中的对齐语义一致。 #### 1.5 本次采用的性能优化手段 - **将 wrapper 编译从每次编译路径移到可复用缓存路径**:CV fusion 的主 tiling 逻辑会随图和 shape 变化重新生成,但 cube tiling wrapper 的共享实现相对稳定。将 wrapper 源文件单独编译为 libautofuse_cv_tiling_wrapper_<hash>.so 后,相同 wrapper 输入只在首次命中时编译一次,后续 host/device 链接直接复用缓存 so,减少重复 host 编译开销。 - **使用内容相关 cache key 保证复用正确性**:缓存 key 覆盖 wrapper 源码内容、CANN 安装路径、机器架构、SoC、编译选项和 stage。只有这些会影响 wrapper ABI 或编译结果的输入完全一致时才复用缓存,避免为了性能牺牲正确性。 - **split wrapper 独立编译,减少主 tiling 重编译体量**:识别 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp,将 wrapper 从普通 host source 列表中剥离。主 tiling 文件继续按图编译,wrapper 走共享 so 链接,降低单次 host 编译需要处理的源码规模。 - **文件锁串行化首次编译,避免并发重复构建**:多个编译任务同时命中同一 wrapper cache key 时,通过 .lock 文件保护首次构建流程。只有一个任务负责编译并原子替换最终 so,其他任务等待后复用结果,避免并发场景下重复编译和部分写入风险。 - **清理流程保留缓存目录,支持静态 shape 重编译复用**:静态 shape 重编译会清理临时目录并重新处理 device/host 产物。保留 cv_tiling_wrapper_cache 可以让首次编译生成的 wrapper so 在后续重编译阶段继续复用,避免 recompile 阶段再次构建相同 wrapper。 - **CV-only gating 避免非 CV 路径额外链接开销**:prepare_shared_cv_wrapper 和 append_shared_cv_wrapper_so 都以 is_cv_fusion_compile(args) 为边界。非 CV 编译不扫描、不编译、不链接 shared CV wrapper so,也不切换到 nnopbase 链接库,避免对普通 Autofuse 编译路径引入额外负担。 ### 二、修改方案 #### 2.1 抽离并复用 CV tiling wrapper 编译产物 - 新增 CV wrapper 源文件识别,覆盖 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp。 - 新增 get_shared_cv_wrapper_so_path,基于 wrapper 源码内容、CANN 安装路径、平台架构、SoC、编译选项、stage 生成稳定缓存文件名。 - 新增 ensure_shared_cv_wrapper_so,首次编译生成 libautofuse_cv_tiling_wrapper_<hash>.so,后续命中缓存直接复用。 - 使用文件锁保护并发首次编译,避免多个编译进程同时写同一个缓存 so。 - wrapper so 链接时使用 CV_HOST_LINK_LIBRARIES,包含 nnopbase。 #### 2.2 收敛 CV wrapper 对非 CV 流程的影响范围 - prepare_shared_cv_wrapper 仅在 is_cv_fusion_compile(args) 为 true 时拆出 wrapper 源文件。 - append_shared_cv_wrapper_so 仅在 CV 编译中追加 shared wrapper so。 - 非 CV host/device 链接保持原有 object 列表和 HOST_LINK_LIBRARIES。 #### 2.3 补齐 opbase 头文件路径 - host 编译 include 选项补充 pkg_inc 根目录和 machine-specific pkg_inc 根目录。 - machine-specific pkg_inc/base 优先于 generic pkg_inc/base,优先使用当前架构安装态头文件。 #### 2.4 保留 wrapper cache 目录 - clean_before_modify 保留 cv_tiling_wrapper_cache,避免静态 shape 重编译清理缓存。 ### 三、代码修改流程图 mermaid flowchart LR A[host_files 输入] ==> B{是否 CV fusion} B ==>|否| C[按原流程编译全部 host 源文件] B ==>|是| D[识别 cube wrapper 源文件] D ==> E{缓存 so 是否存在} E ==>|是| F[复用 libautofuse_cv_tiling_wrapper_<hash>.so] E ==>|否| G[文件锁保护首次编译 wrapper so] F ==> H[主 tiling object + wrapper so 链接] G ==> H C ==> I[非 CV host/device 链接不追加 wrapper so] ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 ## 如何测试 ### 一、测试用例说明 #### 1.1 Python 单元测试 - test_compile_host_objs_skips_shared_cv_wrapper_source:验证 CV wrapper 源文件不再作为普通 host object 编译,改为生成 shared wrapper so。 - test_compile_host_objs_skips_split_shared_cv_wrapper_source:验证 split 文件名 BCubeKernelTilingWrapperCpp 也会走 shared wrapper 复用流程。 - test_ensure_shared_cv_wrapper_so_reuses_existing_so:验证命中缓存时不重复编译 wrapper。 - test_ensure_shared_cv_wrapper_so_serializes_concurrent_first_compile:验证并发首次编译通过文件锁串行化,只生成一次 wrapper so。 - test_build_device_so_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV device 链接不会追加 stale shared CV wrapper so。 - test_link_host_target_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV host 链接不会追加 stale shared CV wrapper so。 - test_clean_before_modify_keeps_shared_cv_wrapper_cache:验证静态 shape 重编译清理流程保留 wrapper cache。 - host include 相关用例验证新增 pkg_inc 路径和 include 优先级。 #### 1.2 C++ codegen 单元测试 - GenerateForInductorCvFusionShouldEmitCvTilingAndCubeWrapper:验证 CV fusion 仍生成主 tiling 和 cube wrapper 文件。 - GenerateForInductorCvFusionShouldCacheActualMatmulTilingBytes:验证 CV tiling 主流程仍保留 matmul tiling bytes 缓存逻辑。 - CubeWrapper*:验证 wrapper 源码结构、cache key、compile info、runtime shape fallback、tiling scratch 复用等关键行为。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已确认本次变更无需更新相关文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 影响范围 - 影响 Autofuse Python 编译辅助脚本中的 host 编译、host/device 链接和临时目录清理流程。 - 影响 Inductor CV fusion codegen 生成的 cube tiling wrapper 复用方式。 - 非 CV 编译流程保持原有 object/link library 行为,不追加 CV wrapper so。 - 不影响 SuperKernel、Runtime、Python/C++ 对外 API、ABI 或打包布局。 ### 注意事项 See merge request: cann/graph-autofusion!1700 | 11 天前 | |
【PR】: [feat] 支持设置L2CacheHint Co-authored-by: xchu42<chuxing@huawei.com> # message auto-generated for no-merge-commit merge: !1538 merge devel into develop 【PR】: [feat] 支持设置L2CacheHint Created-by: xchu42 Commit-by: xchu42 Merged-by: cann-robot Description: # Pull Request ## 描述 为 Autofuse 融合算子自动生成 L2 Cache Hint 配置代码,根据 GM tensor 总大小动态决定是否禁用 L2 Cache。 当前仅在inductor场景生效 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1538 | 21 天前 | |
feat: 完善 IndirectLoad 广播融合、Reduce 后融合及 SIMT 地址处理 Co-authored-by: xiebangrui<xiebangrui@huawei.com> # message auto-generated for no-merge-commit merge: !1783 merge IL into develop feat: 完善 IndirectLoad 广播融合、Reduce 后融合及 SIMT 地址处理 Created-by: xiebangrui2025 Commit-by: xiebangrui Merged-by: cann-robot Description: ## 描述 本 PR 完善 IndirectLoad 在 SIMD/SIMT 模板下的广播、前置融合与后融合 Reduce,并补充 embedding 相关场景覆盖。 - 修复 SIMT 双输入前置算子与后融合 Reduce 的 codegen 生命周期:IndirectLoad 的输入不再进入通用 Wait/Free,输出生命周期保持独立管理,避免生成阶段出现 GetTensor not found 或空指针。 - 完善 SIMD/SIMT Broadcast 重写:支持直连 outer Broadcast,区分 SK 与 SIMD/SIMT 的前置节点搬移策略,并补充 Broadcast 前 Abs 场景。 - 扩展 embedding 图处理:覆盖 INT32 索引到 INT64 的 Cast 链路、后融合 Add/Mul/ReduceSum,以及 SIMD 模板下带正索引行步长的整行搬运路径。 - 修正 zero-stride-compact 窗口的物理向量 stride 派生,避免 producer bitwidth 变化引入 padding 后视图 stride 错误。 - 精简重复的 IndirectLoad 测试矩阵及 CI 构建清单,保留 SIMD、SIMT、SK 和后融合 Reduce 的代表性覆盖。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 1. 构建 IL backend codegen/E2E 用例。 2. 运行 embedding、Broadcast、add-il-reduce 及 SIMD/SIMT/SK 代表性用例,验证 codegen 选择和模拟器执行结果。 3. 对目标修改执行 pre-commit 与 OAT 增量检查,检查通过。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档(本次无文档变更) - [x] 我在标题中使用了合适的类型标签(如:feat:、fix:) - [x] 我已经详细阅读并遵守贡献指南,包括提交信息和合并要求 ## 其他信息 无。 ## 本次提交补充 - 修正 SIMT IndirectLoad 的 evaluator 索引语义:index 分支 GM Load 使用 index_offset,普通 output 分支 GM Load 使用 output_index,并同时向 Output evaluator 传递两类偏移,避免 IndirectLoad → index-dependent Mul → Reduce 场景的 GM 越界。 - 新增最小 IndirectLoad + Mul + Reduce SIMT E2E 复现用例,覆盖该地址计算链路。 - 已完成目标 E2E、IndirectLoad codegen UT、限定目标文件 pre-commit 与 OAT 增量检查。 See merge request: cann/graph-autofusion!1783 | 4 天前 | |
【fix】: 修复重复声明output/dim_a && 修复Reduce多同输入节点断图逻辑问题 && 断图后group按照依赖关系重新排序 Co-authored-by: wang-yan-male<wangyan220@huawei.com> # message auto-generated for no-merge-commit merge: !1736 merge develop into develop 【fix】: 修复重复声明output/dim_a && 修复Reduce多同输入节点断图逻辑问题 && 断图后group按照依赖关系重新排序 Created-by: WangYanMale Commit-by: wang-yan-male Merged-by: cann-robot Description: # Pull Request ## 描述 1、修复重复声明output/dim_a; 2、修复Reduce多同输入节点断图逻辑问题; 3、断图后group按照依赖关系重新排序。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue NA ## 如何测试 构造reduce场景需要断图的结构,其断开的节点为多同输出节点(比如Mul的两个输入为同一个)。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 NA See merge request: cann/graph-autofusion!1736 | 8 天前 | |
fix: reduce tiling function max expression compile cost Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1806 merge fix/tf-pgo-tiling-max-inline into develop fix: reduce tiling function max expression compile cost Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 - 开启 PGO 时,多 Group tiling function 会生成深层嵌套的 Max/Min/Abs 宏表达式。宏参数重复展开会导致预处理和 AST 规模膨胀,增加 host compile 耗时,并可能触发编译超时或失败。 ## 2. 修改方案 - 在生成的 solver header 和 fallback solver 中,将 Max、Min、Abs 从宏改为 inline 模板函数,保留原有 double 比较语义。 - 将 PGO 多 Group block_dim 的左深 Max 表达式改为逐步累积;空 graph 信息保留原有 block dimension。 - 在优化 ST fixture 的前后重置 PlatformContext,避免测试间平台状态残留。 - 对缺少调度轴的广播/source view 按零 stride 处理,并保留其他 stride 边界校验。 - SIMT 折叠输入 Broadcast 后再次重写输入前置链,确保输入边界仍为原始 GM Load。 ## 3. 代码修改流程图 mermaid flowchart TD A[PGO 生成 tiling function] --> B[inline Max/Min/Abs] A --> C[逐步累积多 Group block_dim] D[IndirectLoad SIMT 广播] --> E[广播缺轴按零 stride 分析] D --> F[折叠后恢复 GM Load 边界] B --> G[降低 host compile 预处理和 AST 成本] C --> G E --> H[保持零 stride 分析正确] F --> I[保持 SIMT 模板可选] ## 4. 测试用例说明 ### 4.1 LLT - cmake --build build --target indirect_load_broadcast_axis_simt_test_codegen_v2 -j 8:通过。 - 原失败用例 indirect_load_broadcast_axis_simt_test_codegen_v2:修复前稳定失败,修复后 1/1 通过。 - IndirectLoad 广播相关 ST:15/15 通过。 - cmake --build build --target optimize_st -j 8:通过。 - optimize_st:206/217 通过,11 个跳过,0 个失败。 - clang-format --dry-run --Werror、git diff --check:通过;提交钩子中的 clang-format、codespell、OAT 检查通过。 - 远端流水线 #1070125(HEAD 7da369c2):compile、static-check、llt 和后处理阶段全部通过,PR 已添加 ci-pipeline-passed 标签。 ### 4.2 BBIT tc_af_TF1xv3_SliceSplitToElemwise2_GESplit_GEBitwiseAnd_72ea37d09304adda9eeb6b369e875a64 使能PGO后,编译失败->编译成功 ## 5. 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具 - [ ] 文档内容更新 ## 6. 关联的 Issue - 暂无。 ## 7. 核对清单 - [x] 修改范围与 PGO tiling function、IndirectLoad 广播修复及相关测试一致。 - [x] 已完成当前 HEAD 的构建和定向/回归测试。 - [x] 已执行 clang-format 和 git diff --check。 - [x] 已执行提交钩子检查。 - [x] 远端 compile/UT/ST 已通过。 ## 8. 其他信息 - 当前提交:7da369c2 fix: handle indirect load broadcast simt st。 - 当前 patch 相对 upstream/develop 涉及 6 个文件:PGO tiling 生成、codegen、优化 ST/ATT generator UT,以及 IndirectLoad 优化和 task generator;不包含 Split/Slice score 修改。 - 工作区中原有的 .gitignore 修改和调试/性能产物未纳入提交。 See merge request: cann/graph-autofusion!1806 | 1 天前 | |
feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Co-authored-by: xuyafei<xuyafei3@huawei.com> # message auto-generated for no-merge-commit merge: !1700 merge reapply-pr1657-cv-fusion into develop feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Created-by: xuyafei Commit-by: xuyf;xuyafei Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 CV tiling wrapper 重复编译 Inductor CV fusion 场景会生成主 tiling 源文件和 cube tiling wrapper 源文件。原流程在 host/device 链接链路中会随每次编译重新处理 wrapper 源文件, AutofuseDoCubeMatMulTiling 等 wrapper 实现会重复参与 host 编译,增加编译耗时。 本次将 CV tiling wrapper 编译为可复用 shared object,并按 wrapper 源码、CANN 路径、平台架构、SoC、编译选项等生成缓存 key,避免相同 wrapper 在同一缓存根目录下重复编译。 #### 1.2 非 CV 编译链路可能被 stale shared wrapper 状态污染 shared_cv_wrapper_so 是 CV wrapper 复用流程的中间状态。如果同一个编译参数对象或流程边界中残留该字段,非 CV host/device 链接不应追加 CV wrapper so,也不应切换到 CV 专用链接库。 本次补充非 CV 边界保护,确保 shared CV wrapper 只在 CVAutofuseTilingData 相关编译中生效。 #### 1.3 CV wrapper cache 目录清理策略 static_shape_kernel_proc 会清理临时目录。为了让 wrapper 编译产物可跨重编译阶段复用,需要保留 cv_tiling_wrapper_cache,避免静态 shape 重编译阶段误删缓存。 #### 1.4 CV 融合位宽/精度转换 CV fusion 场景中,Cast、RoundToInt、TruncToInt、FloorToInt 等位宽转换算子需要同时处理 float16、bfloat16、float32、int32 等不同输入/输出精度。原代码复用普通向量路径的一维 actual_size 和默认 stride,未按 CV stage 的二维 curAivM/curAivN 以及 dtype 位宽计算对齐,可能导致不同位宽转换链路中的 Cast 参数、DataCopy stride 或 RemovePad/GatherMask 处理不一致,进而影响转换精度和访存正确性。 本次补齐 CV stage 下的 dtype-aware dims/stride 生成逻辑:统一按 curAivM/curAivN 生成二维 Cast 参数,按 tensor dtype 计算 block-aligned N 方向 stride,并区分 UBFuse 与 fallback 路径处理 DataCopy。UBFuse 路径使用 dtype 对齐后的 load/store 参数并跳过不必要的 RemovePad;fallback 路径继续针对 1/2/4 字节类型生成 GatherMask 去 padding 逻辑,保证低位宽与高位宽数据在拷入、计算和拷出链路中的对齐语义一致。 #### 1.5 本次采用的性能优化手段 - **将 wrapper 编译从每次编译路径移到可复用缓存路径**:CV fusion 的主 tiling 逻辑会随图和 shape 变化重新生成,但 cube tiling wrapper 的共享实现相对稳定。将 wrapper 源文件单独编译为 libautofuse_cv_tiling_wrapper_<hash>.so 后,相同 wrapper 输入只在首次命中时编译一次,后续 host/device 链接直接复用缓存 so,减少重复 host 编译开销。 - **使用内容相关 cache key 保证复用正确性**:缓存 key 覆盖 wrapper 源码内容、CANN 安装路径、机器架构、SoC、编译选项和 stage。只有这些会影响 wrapper ABI 或编译结果的输入完全一致时才复用缓存,避免为了性能牺牲正确性。 - **split wrapper 独立编译,减少主 tiling 重编译体量**:识别 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp,将 wrapper 从普通 host source 列表中剥离。主 tiling 文件继续按图编译,wrapper 走共享 so 链接,降低单次 host 编译需要处理的源码规模。 - **文件锁串行化首次编译,避免并发重复构建**:多个编译任务同时命中同一 wrapper cache key 时,通过 .lock 文件保护首次构建流程。只有一个任务负责编译并原子替换最终 so,其他任务等待后复用结果,避免并发场景下重复编译和部分写入风险。 - **清理流程保留缓存目录,支持静态 shape 重编译复用**:静态 shape 重编译会清理临时目录并重新处理 device/host 产物。保留 cv_tiling_wrapper_cache 可以让首次编译生成的 wrapper so 在后续重编译阶段继续复用,避免 recompile 阶段再次构建相同 wrapper。 - **CV-only gating 避免非 CV 路径额外链接开销**:prepare_shared_cv_wrapper 和 append_shared_cv_wrapper_so 都以 is_cv_fusion_compile(args) 为边界。非 CV 编译不扫描、不编译、不链接 shared CV wrapper so,也不切换到 nnopbase 链接库,避免对普通 Autofuse 编译路径引入额外负担。 ### 二、修改方案 #### 2.1 抽离并复用 CV tiling wrapper 编译产物 - 新增 CV wrapper 源文件识别,覆盖 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp。 - 新增 get_shared_cv_wrapper_so_path,基于 wrapper 源码内容、CANN 安装路径、平台架构、SoC、编译选项、stage 生成稳定缓存文件名。 - 新增 ensure_shared_cv_wrapper_so,首次编译生成 libautofuse_cv_tiling_wrapper_<hash>.so,后续命中缓存直接复用。 - 使用文件锁保护并发首次编译,避免多个编译进程同时写同一个缓存 so。 - wrapper so 链接时使用 CV_HOST_LINK_LIBRARIES,包含 nnopbase。 #### 2.2 收敛 CV wrapper 对非 CV 流程的影响范围 - prepare_shared_cv_wrapper 仅在 is_cv_fusion_compile(args) 为 true 时拆出 wrapper 源文件。 - append_shared_cv_wrapper_so 仅在 CV 编译中追加 shared wrapper so。 - 非 CV host/device 链接保持原有 object 列表和 HOST_LINK_LIBRARIES。 #### 2.3 补齐 opbase 头文件路径 - host 编译 include 选项补充 pkg_inc 根目录和 machine-specific pkg_inc 根目录。 - machine-specific pkg_inc/base 优先于 generic pkg_inc/base,优先使用当前架构安装态头文件。 #### 2.4 保留 wrapper cache 目录 - clean_before_modify 保留 cv_tiling_wrapper_cache,避免静态 shape 重编译清理缓存。 ### 三、代码修改流程图 mermaid flowchart LR A[host_files 输入] ==> B{是否 CV fusion} B ==>|否| C[按原流程编译全部 host 源文件] B ==>|是| D[识别 cube wrapper 源文件] D ==> E{缓存 so 是否存在} E ==>|是| F[复用 libautofuse_cv_tiling_wrapper_<hash>.so] E ==>|否| G[文件锁保护首次编译 wrapper so] F ==> H[主 tiling object + wrapper so 链接] G ==> H C ==> I[非 CV host/device 链接不追加 wrapper so] ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 ## 如何测试 ### 一、测试用例说明 #### 1.1 Python 单元测试 - test_compile_host_objs_skips_shared_cv_wrapper_source:验证 CV wrapper 源文件不再作为普通 host object 编译,改为生成 shared wrapper so。 - test_compile_host_objs_skips_split_shared_cv_wrapper_source:验证 split 文件名 BCubeKernelTilingWrapperCpp 也会走 shared wrapper 复用流程。 - test_ensure_shared_cv_wrapper_so_reuses_existing_so:验证命中缓存时不重复编译 wrapper。 - test_ensure_shared_cv_wrapper_so_serializes_concurrent_first_compile:验证并发首次编译通过文件锁串行化,只生成一次 wrapper so。 - test_build_device_so_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV device 链接不会追加 stale shared CV wrapper so。 - test_link_host_target_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV host 链接不会追加 stale shared CV wrapper so。 - test_clean_before_modify_keeps_shared_cv_wrapper_cache:验证静态 shape 重编译清理流程保留 wrapper cache。 - host include 相关用例验证新增 pkg_inc 路径和 include 优先级。 #### 1.2 C++ codegen 单元测试 - GenerateForInductorCvFusionShouldEmitCvTilingAndCubeWrapper:验证 CV fusion 仍生成主 tiling 和 cube wrapper 文件。 - GenerateForInductorCvFusionShouldCacheActualMatmulTilingBytes:验证 CV tiling 主流程仍保留 matmul tiling bytes 缓存逻辑。 - CubeWrapper*:验证 wrapper 源码结构、cache key、compile info、runtime shape fallback、tiling scratch 复用等关键行为。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已确认本次变更无需更新相关文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 影响范围 - 影响 Autofuse Python 编译辅助脚本中的 host 编译、host/device 链接和临时目录清理流程。 - 影响 Inductor CV fusion codegen 生成的 cube tiling wrapper 复用方式。 - 非 CV 编译流程保持原有 object/link library 行为,不追加 CV wrapper so。 - 不影响 SuperKernel、Runtime、Python/C++ 对外 API、ABI 或打包布局。 ### 注意事项 See merge request: cann/graph-autofusion!1700 | 11 天前 | |
fix: replace deprecated Cube tiling SoC query (#251) Co-authored-by: ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !1780 merge fix/cube-tiling-aclrt-socname-251 into develop fix: replace deprecated Cube tiling SoC query (#251) Created-by: ling-DT Commit-by: ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 将 autofuse/codegen/codegen_tiling_cube.cpp 中通过旧 runtime 头文件调用的 rtGetSocSpec("version", "SoC_version", ...),按 GE 仓正式先例替换为 acl/acl_rt.h 的 aclrtGetSocName()。同步补充 acl_rt 链接依赖、Runtime stub 和 Cube codegen UT,保留 SoC 查询失败后的平台架构 fallback。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 关联 #251:Cube tiling 使用已日落的 rtGetSocSpec 查询 SoC 版本。 ## 如何测试 1. source /workspace/lingxing/0805/ascend-toolkit/set_env.sh && cmake --build build --target aihac_codegen pyautofuse -j8 2. cmake --build build --target test_main -j8,运行 Cube SoC 正常值和 nullptr fallback UT,2 tests passed。 3. TORCHINDUCTOR_COMPILE_THREADS=1 python3 /workspace/lingxing/tests/inductor-tests/test_network_fragments.py --shape-mode static --fragment 16_fp16_lhs_transpose_mm_mul,通过。 4. TORCHINDUCTOR_COMPILE_THREADS=1 python3 /workspace/lingxing/tests/inductor-tests/test_network_fragments.py --shape-mode dynamic --fragment 16_fp16_lhs_transpose_mm_mul,通过。 5. compare_inductor_matmul_fuse.py synthetic_fp32_mm_mul_1022x128 --profile --profile-warmup 5 --profile-iters 20,matmul_on 相比 matmul_off 为 -17.359%,判定 OK。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 仅迁移 Cube tiling 的 SoC 版本查询;platform_context.cpp 等其他规格查询路径未在本次范围内修改。 See merge request: cann/graph-autofusion!1780 | 6 天前 | |
feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Co-authored-by: xuyafei<xuyafei3@huawei.com> # message auto-generated for no-merge-commit merge: !1700 merge reapply-pr1657-cv-fusion into develop feat: reuse cv tiling wrapper compilation & support dtype-aware cv fusion Created-by: xuyafei Commit-by: xuyf;xuyafei Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 CV tiling wrapper 重复编译 Inductor CV fusion 场景会生成主 tiling 源文件和 cube tiling wrapper 源文件。原流程在 host/device 链接链路中会随每次编译重新处理 wrapper 源文件, AutofuseDoCubeMatMulTiling 等 wrapper 实现会重复参与 host 编译,增加编译耗时。 本次将 CV tiling wrapper 编译为可复用 shared object,并按 wrapper 源码、CANN 路径、平台架构、SoC、编译选项等生成缓存 key,避免相同 wrapper 在同一缓存根目录下重复编译。 #### 1.2 非 CV 编译链路可能被 stale shared wrapper 状态污染 shared_cv_wrapper_so 是 CV wrapper 复用流程的中间状态。如果同一个编译参数对象或流程边界中残留该字段,非 CV host/device 链接不应追加 CV wrapper so,也不应切换到 CV 专用链接库。 本次补充非 CV 边界保护,确保 shared CV wrapper 只在 CVAutofuseTilingData 相关编译中生效。 #### 1.3 CV wrapper cache 目录清理策略 static_shape_kernel_proc 会清理临时目录。为了让 wrapper 编译产物可跨重编译阶段复用,需要保留 cv_tiling_wrapper_cache,避免静态 shape 重编译阶段误删缓存。 #### 1.4 CV 融合位宽/精度转换 CV fusion 场景中,Cast、RoundToInt、TruncToInt、FloorToInt 等位宽转换算子需要同时处理 float16、bfloat16、float32、int32 等不同输入/输出精度。原代码复用普通向量路径的一维 actual_size 和默认 stride,未按 CV stage 的二维 curAivM/curAivN 以及 dtype 位宽计算对齐,可能导致不同位宽转换链路中的 Cast 参数、DataCopy stride 或 RemovePad/GatherMask 处理不一致,进而影响转换精度和访存正确性。 本次补齐 CV stage 下的 dtype-aware dims/stride 生成逻辑:统一按 curAivM/curAivN 生成二维 Cast 参数,按 tensor dtype 计算 block-aligned N 方向 stride,并区分 UBFuse 与 fallback 路径处理 DataCopy。UBFuse 路径使用 dtype 对齐后的 load/store 参数并跳过不必要的 RemovePad;fallback 路径继续针对 1/2/4 字节类型生成 GatherMask 去 padding 逻辑,保证低位宽与高位宽数据在拷入、计算和拷出链路中的对齐语义一致。 #### 1.5 本次采用的性能优化手段 - **将 wrapper 编译从每次编译路径移到可复用缓存路径**:CV fusion 的主 tiling 逻辑会随图和 shape 变化重新生成,但 cube tiling wrapper 的共享实现相对稳定。将 wrapper 源文件单独编译为 libautofuse_cv_tiling_wrapper_<hash>.so 后,相同 wrapper 输入只在首次命中时编译一次,后续 host/device 链接直接复用缓存 so,减少重复 host 编译开销。 - **使用内容相关 cache key 保证复用正确性**:缓存 key 覆盖 wrapper 源码内容、CANN 安装路径、机器架构、SoC、编译选项和 stage。只有这些会影响 wrapper ABI 或编译结果的输入完全一致时才复用缓存,避免为了性能牺牲正确性。 - **split wrapper 独立编译,减少主 tiling 重编译体量**:识别 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp,将 wrapper 从普通 host source 列表中剥离。主 tiling 文件继续按图编译,wrapper 走共享 so 链接,降低单次 host 编译需要处理的源码规模。 - **文件锁串行化首次编译,避免并发重复构建**:多个编译任务同时命中同一 wrapper cache key 时,通过 .lock 文件保护首次构建流程。只有一个任务负责编译并原子替换最终 so,其他任务等待后复用结果,避免并发场景下重复编译和部分写入风险。 - **清理流程保留缓存目录,支持静态 shape 重编译复用**:静态 shape 重编译会清理临时目录并重新处理 device/host 产物。保留 cv_tiling_wrapper_cache 可以让首次编译生成的 wrapper so 在后续重编译阶段继续复用,避免 recompile 阶段再次构建相同 wrapper。 - **CV-only gating 避免非 CV 路径额外链接开销**:prepare_shared_cv_wrapper 和 append_shared_cv_wrapper_so 都以 is_cv_fusion_compile(args) 为边界。非 CV 编译不扫描、不编译、不链接 shared CV wrapper so,也不切换到 nnopbase 链接库,避免对普通 Autofuse 编译路径引入额外负担。 ### 二、修改方案 #### 2.1 抽离并复用 CV tiling wrapper 编译产物 - 新增 CV wrapper 源文件识别,覆盖 cube_kernel_tiling_wrapper.cpp 和 split 后的 *_tiling_func_BCubeKernelTilingWrapperCpp.cpp。 - 新增 get_shared_cv_wrapper_so_path,基于 wrapper 源码内容、CANN 安装路径、平台架构、SoC、编译选项、stage 生成稳定缓存文件名。 - 新增 ensure_shared_cv_wrapper_so,首次编译生成 libautofuse_cv_tiling_wrapper_<hash>.so,后续命中缓存直接复用。 - 使用文件锁保护并发首次编译,避免多个编译进程同时写同一个缓存 so。 - wrapper so 链接时使用 CV_HOST_LINK_LIBRARIES,包含 nnopbase。 #### 2.2 收敛 CV wrapper 对非 CV 流程的影响范围 - prepare_shared_cv_wrapper 仅在 is_cv_fusion_compile(args) 为 true 时拆出 wrapper 源文件。 - append_shared_cv_wrapper_so 仅在 CV 编译中追加 shared wrapper so。 - 非 CV host/device 链接保持原有 object 列表和 HOST_LINK_LIBRARIES。 #### 2.3 补齐 opbase 头文件路径 - host 编译 include 选项补充 pkg_inc 根目录和 machine-specific pkg_inc 根目录。 - machine-specific pkg_inc/base 优先于 generic pkg_inc/base,优先使用当前架构安装态头文件。 #### 2.4 保留 wrapper cache 目录 - clean_before_modify 保留 cv_tiling_wrapper_cache,避免静态 shape 重编译清理缓存。 ### 三、代码修改流程图 mermaid flowchart LR A[host_files 输入] ==> B{是否 CV fusion} B ==>|否| C[按原流程编译全部 host 源文件] B ==>|是| D[识别 cube wrapper 源文件] D ==> E{缓存 so 是否存在} E ==>|是| F[复用 libautofuse_cv_tiling_wrapper_<hash>.so] E ==>|否| G[文件锁保护首次编译 wrapper so] F ==> H[主 tiling object + wrapper so 链接] G ==> H C ==> I[非 CV host/device 链接不追加 wrapper so] ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 ## 如何测试 ### 一、测试用例说明 #### 1.1 Python 单元测试 - test_compile_host_objs_skips_shared_cv_wrapper_source:验证 CV wrapper 源文件不再作为普通 host object 编译,改为生成 shared wrapper so。 - test_compile_host_objs_skips_split_shared_cv_wrapper_source:验证 split 文件名 BCubeKernelTilingWrapperCpp 也会走 shared wrapper 复用流程。 - test_ensure_shared_cv_wrapper_so_reuses_existing_so:验证命中缓存时不重复编译 wrapper。 - test_ensure_shared_cv_wrapper_so_serializes_concurrent_first_compile:验证并发首次编译通过文件锁串行化,只生成一次 wrapper so。 - test_build_device_so_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV device 链接不会追加 stale shared CV wrapper so。 - test_link_host_target_ignores_shared_cv_wrapper_so_for_non_cv_compile:验证非 CV host 链接不会追加 stale shared CV wrapper so。 - test_clean_before_modify_keeps_shared_cv_wrapper_cache:验证静态 shape 重编译清理流程保留 wrapper cache。 - host include 相关用例验证新增 pkg_inc 路径和 include 优先级。 #### 1.2 C++ codegen 单元测试 - GenerateForInductorCvFusionShouldEmitCvTilingAndCubeWrapper:验证 CV fusion 仍生成主 tiling 和 cube wrapper 文件。 - GenerateForInductorCvFusionShouldCacheActualMatmulTilingBytes:验证 CV tiling 主流程仍保留 matmul tiling bytes 缓存逻辑。 - CubeWrapper*:验证 wrapper 源码结构、cache key、compile info、runtime shape fallback、tiling scratch 复用等关键行为。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已确认本次变更无需更新相关文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 影响范围 - 影响 Autofuse Python 编译辅助脚本中的 host 编译、host/device 链接和临时目录清理流程。 - 影响 Inductor CV fusion codegen 生成的 cube tiling wrapper 复用方式。 - 非 CV 编译流程保持原有 object/link library 行为,不追加 CV wrapper so。 - 不影响 SuperKernel、Runtime、Python/C++ 对外 API、ABI 或打包布局。 ### 注意事项 See merge request: cann/graph-autofusion!1700 | 11 天前 | |
【质量加固】style: autofuse 仅补齐10处 const 规范 Co-authored-by: QWH456123<qqh6662022@163.com> # message auto-generated for no-merge-commit merge: !1787 merge quality-hardening/issue-238-const-only10 into develop 【质量加固】style: autofuse 仅补齐10处 const 规范 Created-by: QWH456123 Commit-by: QWH456123 Merged-by: cann-robot Description: # Pull Request ## 描述 对应 [Issue #238](https://gitcode.com/cann/graph-autofusion/issues/238)「质量加固」。 本 PR **仅做 const 相关规范修复,共 10 处**;不改参数名、不改非 const 相关逻辑;仅 autofuse/,无 CI / super_kernel 变更。 ## 变更类型 - [x] 代码风格更新(格式化,局部变量) ## 关联的Issue Issue 地址:https://gitcode.com/cann/graph-autofusion/issues/238 ## 修改清单(10处,均为 const) | # | 规则 | 改动 | |---|------|------| | 1 | 规则1 | NameGenerator::GetNameMapping() 加 const | | 2 | 规则1 | TilingData::GenConstGenResultReplace() 加 const | | 3 | 规则1 | TilingData::GenTingDataField() 加 const | | 4 | 规则1 | GetNameOfGenTilingDataFieldConstDefFunc() 加 const | | 5 | 规则1 | GetNameOfGenTilingDataFieldConstDefFuncSimple() 加 const | | 6 | 规则1 | GetNameOfGenTilingDataFieldConstValueFuncSimple() 加 const | | 7 | 规则3 | IrAttrHandleMap 改为 const,查找改用 .at() | | 8 | 规则3 | GetOutputName 循环改为 const auto & | | 9 | 规则3 | binary_api_tmp_call.cpp:x1_idx/x2_idx 加 const | | 10 | 规则3 | pad_api_call.cpp:axis_num 加 const | ## 刻意未改(降风险) - 不做规则4参数名重命名 - 不修改 const AscNode & 一类易触发 outputs 非 const 接口的改动 ## 如何测试 1. 代码检视确认无行为变更 2. PR 评论区触发 compile ## 核对清单 - [x] 基于 develop - [x] 标题含【质量加固】 - [x] 正好 10 处 const 相关 - [x] 仅 autofuse See merge request: cann/graph-autofusion!1787 | 5 天前 | |
【质量加固】style: autofuse 仅补齐10处 const 规范 Co-authored-by: QWH456123<qqh6662022@163.com> # message auto-generated for no-merge-commit merge: !1787 merge quality-hardening/issue-238-const-only10 into develop 【质量加固】style: autofuse 仅补齐10处 const 规范 Created-by: QWH456123 Commit-by: QWH456123 Merged-by: cann-robot Description: # Pull Request ## 描述 对应 [Issue #238](https://gitcode.com/cann/graph-autofusion/issues/238)「质量加固」。 本 PR **仅做 const 相关规范修复,共 10 处**;不改参数名、不改非 const 相关逻辑;仅 autofuse/,无 CI / super_kernel 变更。 ## 变更类型 - [x] 代码风格更新(格式化,局部变量) ## 关联的Issue Issue 地址:https://gitcode.com/cann/graph-autofusion/issues/238 ## 修改清单(10处,均为 const) | # | 规则 | 改动 | |---|------|------| | 1 | 规则1 | NameGenerator::GetNameMapping() 加 const | | 2 | 规则1 | TilingData::GenConstGenResultReplace() 加 const | | 3 | 规则1 | TilingData::GenTingDataField() 加 const | | 4 | 规则1 | GetNameOfGenTilingDataFieldConstDefFunc() 加 const | | 5 | 规则1 | GetNameOfGenTilingDataFieldConstDefFuncSimple() 加 const | | 6 | 规则1 | GetNameOfGenTilingDataFieldConstValueFuncSimple() 加 const | | 7 | 规则3 | IrAttrHandleMap 改为 const,查找改用 .at() | | 8 | 规则3 | GetOutputName 循环改为 const auto & | | 9 | 规则3 | binary_api_tmp_call.cpp:x1_idx/x2_idx 加 const | | 10 | 规则3 | pad_api_call.cpp:axis_num 加 const | ## 刻意未改(降风险) - 不做规则4参数名重命名 - 不修改 const AscNode & 一类易触发 outputs 非 const 接口的改动 ## 如何测试 1. 代码检视确认无行为变更 2. PR 评论区触发 compile ## 核对清单 - [x] 基于 develop - [x] 标题含【质量加固】 - [x] 正好 10 处 const 相关 - [x] 仅 autofuse See merge request: cann/graph-autofusion!1787 | 5 天前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 20 天前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 20 天前 | |
fix:【 ABI约束】保证后端生成AutofuseTiling时使用前端的符号和顺序 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1753 merge fix/frontend-shape-abi-sync into develop fix:【 ABI约束】保证后端生成AutofuseTiling时使用前端的符号和顺序 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 动态 shape 场景下,前端调用 AutofuseTiling(s0, s1, ...) 获取 tiling 解。后端经过 ASC 图序列化、优化和 impl graph 生成后,可能丢失原始前端 shape symbol,导致前后端对动态/静态 shape 的判断和 AutofuseTiling ABI 不一致: - 后端 impl graph 残留符号较少,可能生成无 shape 参数或参数不完整的 AutofuseTiling; - 前端仍按原始 ASC 图的完整符号列表调用; - 前端按照数字后缀自然排序,后端按照字符串排序,对于ks0, ks1, ks2, ks10的符号,前后端的顺序就会出现不一致; - host 调用时函数参数布局错位,最终触发 coredump/SegFault。 此外,ASC 图可能通过 CreateAxis(..., Symbol("s0")) 直接保存 shape symbol,而不注册到 GetAllSizeVar()。如果只读取 GetAllSizeVar(),会错误生成零动态参数的接口。 ## 2. 修改方案 ### 2.1 前端 ABI 符号捕获与排序 - 在图优化、RemoveDanglingNodes 等可能改写或丢失符号之前,从原始 ASC 图捕获前端 shape symbol; - 同时收集显式 SizeVar 以及轴、repeat、stride 等表达式中的自由符号,覆盖 Symbol("sN") 直存场景; - 对 ksN 按数字后缀自然排序:ks0, ks1, ks2, ks10;非 ksN 符号保持确定性字符串排序; - 通过 frontend_shape_vars_collected 区分“前端确实没有动态符号”和“旧结果未采集元数据”。 ### 2.2 对外接口与内部 tiling data 分离 - 对外 AutofuseTiling、Inductor/Pgo 入口、shape 参数、缓存 key 和静态 shape 接口使用完整前端 symbol 列表; - GetFrontendShapeVars() 作为兼容访问入口,旧结果回退到 origin_vars; - 内部 tiling data 生成仍保持原有逻辑:IsStaticSchedResult() 继续基于 impl graph 的 origin_vars 判断,避免因前端额外 symbol 生成过多 tiling data; - IsFrontendStaticSchedResult() 仅用于对外 ABI 的静态/动态接口判断,保证函数签名与前端调用一致。 ### 2.3 代码流程图 mermaid flowchart TD A[原始 ASC 图] --> B[收集 SizeVar 和表达式自由符号] B --> C[ksN 自然排序/去重] C --> D[frontend_shape_vars] D --> E[对外 AutofuseTiling ABI 和静态判定] D --> F[shape 参数、Pgo、cache key] G[优化后的 impl graph origin_vars] --> H[内部 tiling data 静态/动态判定] ## 3. 代码修改流程 - autofuse/common/ascgraph_info_complete.* - 增加原始 ASC 图 frontend symbol 捕获、ksN 排序和直接表达式 symbol 恢复; - autofuse/optimize/optimize.cpp - 在优化前保存 frontend symbol metadata; - autofuse/common/schedule_result.h、common_utils.* - 增加 frontend symbol 字段、兼容访问器和 frontend ABI 静态判定; - autofuse/codegen/codegen_tiling*.cpp - 对外接口相关代码使用 frontend symbol;内部 tiling data 静态逻辑保持 origin_vars; - 测试文件 - 增加 frontend symbol 优先级、回退、自然排序、ASC 表达式 symbol 恢复及端到端 ABI 顺序验证。 ## 4. 测试用例说明 ### 本地验证 - cmake --build build --target optimize_ut -j 8:通过; - cmake --build build --target pgo_add_abs_inductor_test_codegen -j 8:通过; - 相关 E2E 目标代码编译通过;本地直接运行受已有 CANN 动态库混装影响,出现 libascir.so 未定义符号,非本次代码编译错误。 ### 远端流水线 - 流水线:#1044214; - 提交:694862c4; - 结果:success; - ST_Test_autofuse_ascendc_api:通过; - PR 当前已恢复 ci-pipeline-passed label。 ### 新增/覆盖用例 - FrontendShapeVarsTakePrecedenceOverImplVars:impl graph 丢失符号时仍保持前端完整列表; - FrontendShapeVarsFallbackToOriginVars:旧结果兼容回退; - NormalizeKsNamesUsesNaturalOrder:验证 ks10/ks2/ks0/ks1 排序; - CollectsOriginalAscGraphSymbolsBeforeOptimization:验证原始 ASC 图符号捕获; - CollectsSymbolsEmbeddedInAxisExpressions:验证轴表达式直接使用 Symbol("s0"); - FrontendShapeAbiKeepsNaturalKsOrderWhenImplDropsSymbols:端到端验证 AutofuseTiling 签名和顺序。 ## 5. 核对清单 - [x] 已定位动态 shape 前后端 ABI 不一致根因 - [x] 已保持内部 tiling data 生成逻辑不变 - [x] 已补充符号恢复、排序和 ABI 回归测试 - [x] 已执行 clang-format、pre-commit 和 OAT 检查 - [x] 远端 ST_Test_autofuse_ascendc_api 已通过 - [ ] 未执行 /workspace/CANN-DevTool/att_gene bbit 验证:该路径不存在,实际目录为 /workspace/CANN-DevTools/att_generalization ## 6. 其他信息 - 本次修复不需要修改前端调用约定;后端从原始 ASC 图恢复完整 symbol 并统一顺序。 - 未修改 /workspace/CANN-DevTools 工作区中的既有用户改动。 - 未新增 tiling data,只修正对外接口使用的 shape symbol 集合和顺序。 See merge request: cann/graph-autofusion!1753 | 7 天前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 20 天前 | |
fix:【 ABI约束】保证后端生成AutofuseTiling时使用前端的符号和顺序 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1753 merge fix/frontend-shape-abi-sync into develop fix:【 ABI约束】保证后端生成AutofuseTiling时使用前端的符号和顺序 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 动态 shape 场景下,前端调用 AutofuseTiling(s0, s1, ...) 获取 tiling 解。后端经过 ASC 图序列化、优化和 impl graph 生成后,可能丢失原始前端 shape symbol,导致前后端对动态/静态 shape 的判断和 AutofuseTiling ABI 不一致: - 后端 impl graph 残留符号较少,可能生成无 shape 参数或参数不完整的 AutofuseTiling; - 前端仍按原始 ASC 图的完整符号列表调用; - 前端按照数字后缀自然排序,后端按照字符串排序,对于ks0, ks1, ks2, ks10的符号,前后端的顺序就会出现不一致; - host 调用时函数参数布局错位,最终触发 coredump/SegFault。 此外,ASC 图可能通过 CreateAxis(..., Symbol("s0")) 直接保存 shape symbol,而不注册到 GetAllSizeVar()。如果只读取 GetAllSizeVar(),会错误生成零动态参数的接口。 ## 2. 修改方案 ### 2.1 前端 ABI 符号捕获与排序 - 在图优化、RemoveDanglingNodes 等可能改写或丢失符号之前,从原始 ASC 图捕获前端 shape symbol; - 同时收集显式 SizeVar 以及轴、repeat、stride 等表达式中的自由符号,覆盖 Symbol("sN") 直存场景; - 对 ksN 按数字后缀自然排序:ks0, ks1, ks2, ks10;非 ksN 符号保持确定性字符串排序; - 通过 frontend_shape_vars_collected 区分“前端确实没有动态符号”和“旧结果未采集元数据”。 ### 2.2 对外接口与内部 tiling data 分离 - 对外 AutofuseTiling、Inductor/Pgo 入口、shape 参数、缓存 key 和静态 shape 接口使用完整前端 symbol 列表; - GetFrontendShapeVars() 作为兼容访问入口,旧结果回退到 origin_vars; - 内部 tiling data 生成仍保持原有逻辑:IsStaticSchedResult() 继续基于 impl graph 的 origin_vars 判断,避免因前端额外 symbol 生成过多 tiling data; - IsFrontendStaticSchedResult() 仅用于对外 ABI 的静态/动态接口判断,保证函数签名与前端调用一致。 ### 2.3 代码流程图 mermaid flowchart TD A[原始 ASC 图] --> B[收集 SizeVar 和表达式自由符号] B --> C[ksN 自然排序/去重] C --> D[frontend_shape_vars] D --> E[对外 AutofuseTiling ABI 和静态判定] D --> F[shape 参数、Pgo、cache key] G[优化后的 impl graph origin_vars] --> H[内部 tiling data 静态/动态判定] ## 3. 代码修改流程 - autofuse/common/ascgraph_info_complete.* - 增加原始 ASC 图 frontend symbol 捕获、ksN 排序和直接表达式 symbol 恢复; - autofuse/optimize/optimize.cpp - 在优化前保存 frontend symbol metadata; - autofuse/common/schedule_result.h、common_utils.* - 增加 frontend symbol 字段、兼容访问器和 frontend ABI 静态判定; - autofuse/codegen/codegen_tiling*.cpp - 对外接口相关代码使用 frontend symbol;内部 tiling data 静态逻辑保持 origin_vars; - 测试文件 - 增加 frontend symbol 优先级、回退、自然排序、ASC 表达式 symbol 恢复及端到端 ABI 顺序验证。 ## 4. 测试用例说明 ### 本地验证 - cmake --build build --target optimize_ut -j 8:通过; - cmake --build build --target pgo_add_abs_inductor_test_codegen -j 8:通过; - 相关 E2E 目标代码编译通过;本地直接运行受已有 CANN 动态库混装影响,出现 libascir.so 未定义符号,非本次代码编译错误。 ### 远端流水线 - 流水线:#1044214; - 提交:694862c4; - 结果:success; - ST_Test_autofuse_ascendc_api:通过; - PR 当前已恢复 ci-pipeline-passed label。 ### 新增/覆盖用例 - FrontendShapeVarsTakePrecedenceOverImplVars:impl graph 丢失符号时仍保持前端完整列表; - FrontendShapeVarsFallbackToOriginVars:旧结果兼容回退; - NormalizeKsNamesUsesNaturalOrder:验证 ks10/ks2/ks0/ks1 排序; - CollectsOriginalAscGraphSymbolsBeforeOptimization:验证原始 ASC 图符号捕获; - CollectsSymbolsEmbeddedInAxisExpressions:验证轴表达式直接使用 Symbol("s0"); - FrontendShapeAbiKeepsNaturalKsOrderWhenImplDropsSymbols:端到端验证 AutofuseTiling 签名和顺序。 ## 5. 核对清单 - [x] 已定位动态 shape 前后端 ABI 不一致根因 - [x] 已保持内部 tiling data 生成逻辑不变 - [x] 已补充符号恢复、排序和 ABI 回归测试 - [x] 已执行 clang-format、pre-commit 和 OAT 检查 - [x] 远端 ST_Test_autofuse_ascendc_api 已通过 - [ ] 未执行 /workspace/CANN-DevTool/att_gene bbit 验证:该路径不存在,实际目录为 /workspace/CANN-DevTools/att_generalization ## 6. 其他信息 - 本次修复不需要修改前端调用约定;后端从原始 ASC 图恢复完整 symbol 并统一顺序。 - 未修改 /workspace/CANN-DevTools 工作区中的既有用户改动。 - 未新增 tiling data,只修正对外接口使用的 shape symbol 集合和顺序。 See merge request: cann/graph-autofusion!1753 | 7 天前 | |
fix: ensure deterministic codegen and reliable PGO fallback Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1662 merge fix/codegen-determinism-p0 into develop fix: ensure deterministic codegen and reliable PGO fallback Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 跨进程 codegen 产物不确定 相同静态图在独立进程中可能生成不同的源码和缓存 hash,导致 Inductor PGO 无法稳定复用 codegen 结果。根因包括: - VF 并行节点和边界锚点排序依赖节点 ID、插入顺序。 - VF 拓扑排序只考虑数据边,未纳入控制依赖。 - 临时 Buffer 分配顺序受裸指针地址影响。 #### 1.2 PGO skip 场景未可靠回退 - fallback 程序返回 0,调用方将 no-op 误判为调优成功。 - PGO 搜索结果文件缺失时直接抛出 OSError,中断正常回退流程。 ### 二、问题解决前后对比 | 场景 | 解决前 | 解决后 | 效果 | |------|--------|--------|------| | VF 并行节点排序 | 使用节点 ID,同级节点顺序受插入顺序影响 | 使用节点名作为稳定主键,入口校验节点名唯一 | 跨进程节点顺序一致 | | VF 依赖建模 | 仅统计数据边 | 数据边、控制边共同参与拓扑排序,并对相同后继去重 | 保留执行顺序约束 | | VF 边界锚点 | 沿节点和 peer 遍历顺序收集 | 按节点名、anchor index 排序 | 输入输出 tensor 编号稳定 | | 临时 Buffer 分配 | 按指针地址或不完整的生命期键排序 | 按生命期、allocation_order、group_id 排序 | Buffer ID 和源码稳定 | | PGO skip 返回码 | 返回 0,被误判为成功 | 返回 1 | 正确回退原始解 | | 搜索文件缺失 | 抛出 OSError | 返回失败三元组 | 编译流程不中断 | | optimize_ut 编译 | 缺少 AscGraphBuilder 声明 | 显式包含 asc_graph_builder.h | 阻塞编译恢复 | | NBNC 告警 | MergeTensorByGroupId 为 51 | 删除一次性类型别名,等价表达后为 50 | 满足 codecheck 门限 | mermaid flowchart LR subgraph Before[解决前] B1[VF 顺序受 ID 和插入顺序影响] --> B2[边界顺序不稳定] B2 -->|影响| B3[Buffer ID 受指针地址影响] B3 -->|导致| B4[源码和缓存 hash 波动] B5[PGO skip 返回 0] --> B6[误判调优成功] B7[测试缺少直接 include] --> B8[optimize_ut 编译失败] end subgraph After[解决后] A1[节点名和控制依赖稳定拓扑] --> A2[稳定边界锚点] A2 -->|保证| A3[稳定生命期分配] A3 -->|实现| A4[源码和缓存 hash 一致] A5[PGO skip 返回 1] --> A6[回退原始解] A7[显式 include] --> A8[optimize_ut 编译通过] end B4 -.修复.-> A4 B6 -.修复.-> A6 B8 -.修复.-> A8 ### 三、修改方案 #### 3.1 VF 排序稳定化 - Partition 入口校验节点名唯一,避免稳定排序键产生歧义。 - 并行节点优先按节点名排序;拓扑依赖从 GetOutDataNodes 改为 GetOutAllNodes。 - VF 输入输出边界按节点名和 anchor index 排序。 #### 3.2 Buffer 分配稳定化 - TensorInfo、TensorGroup 增加 allocation_order,并按图遍历顺序赋值。 - TensorGroupLifeLess 以 merged_life_start 为主键,以 allocation_order、group_id 为稳定次键。 - AllocTmpBuff 将指针 map 内容收集到 vector 后稳定排序,再分配 Buffer。 #### 3.3 PGO 回退可靠化 - PGO fallback 生成代码返回值从 0 改为 1,使 pgo_program_exec 进入失败回退路径。 - pgo_get_top_result 捕获 OSError,结果文件缺失时返回 (None, None, None)。 #### 3.4 Review 阻塞项修复 - test_vf_partition.cpp 显式包含 asc_graph_builder.h,消除传递 include 依赖。 - MergeTensorByGroupId 直接使用 int64_t map key,并用 const auto 保存 group_id;不改变分组逻辑,NBNC 从 51 降至 50。 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的 Issue 无。 ## 如何测试 ### 一、本地验证 | 验证项 | 命令或范围 | 结果 | |--------|------------|------| | optimize UT 构建 | cmake --build build --target optimize_ut -j 8 | 通过,生成最新 optimize_ut | | 定向回归 | Buffer 分配 1 项、VF 分区 4 项 | 5/5 通过 | | Python UT | test_compile_adapter.py | 41 项通过 | | Codegen UT | PgoTilingKeyCountOverflowShouldFallbackTfAndPgoRunner | 1 项通过 | | 格式与补丁 | git diff --check、git clang-format --diff | 通过 | | 提交门禁 | pre-commit | clang-format、codespell、OAT 等全部通过 | | NBNC | MergeTensorByGroupId | 50 | 定向回归覆盖: - 临时 Buffer 按生命期稳定分配。 - VF 控制依赖保序。 - 重复节点名在改图前被拒绝。 - VF 输出和 tensor 顺序不受并行节点插入顺序影响。 ### 二、远端 compile - 流水线 #1004745,HEAD 1cac68b542f8:success。 - static-check、compile、llt 均完成;X86、ARM、Ubuntu 24 构建及 API_Check、PreSmoke 通过。 - ci-pipeline-passed label 已回写,结果对应最新提交。 ### 三、系统与上板验证 - Ascend 950 环境下,SR001、SR007、SR012 多进程重复生成的 cache hash 均唯一。 - NC018 静态 shape 场景中,baseline Top1 与 PGO Top3 的 prepare、profile 均通过,cache_reused=True。 - 验证时成套加载同一次构建的 Graph-autofusion 动态库,避免新旧组件混用。 ## 核对清单 - [x] 代码遵循项目代码风格 - [x] 已完成针对性自测 - [x] 本变更不涉及公开文档更新 - [x] PR 标题使用合适的类型标签 - [x] 已阅读并遵守 CONTRIBUTING.md ## 其他信息 ### 兼容性与影响 - 不修改公开 API/ABI、Python/C++ 绑定、构建打包或 runtime 接口。 - 图优化只固定同级节点和边界锚点顺序,并补全既有控制依赖,不引入新 pass。 - Buffer 变更只消除非确定性遍历顺序;PGO 返回码调整是既有失败语义修正。 - 未新增高频日志、额外 runtime 调用或显著复杂度,性能影响可忽略。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | b71a34a0 | ensure deterministic codegen across processes | 7 | | 58571b25 | preserve control dependencies in VF ordering | 2 | | 269b71d9 | fallback when TF PGO search is skipped | 5 | | 1cac68b5 | address review build and codecheck issues | 2 | ### 修改文件清单 | 文件路径 | 说明 | |----------|------| | autofuse/v35/optimize/partition/vector_func_partitioner.cpp | VF 拓扑与边界锚点稳定排序,纳入控制依赖 | | autofuse/v35/optimize/partition/vector_func_partitioner.h | 声明节点名唯一性校验 | | autofuse/optimize/buffer_allocate/buf_que_allocator.cpp | 记录临时 Buffer allocation_order | | autofuse/optimize/buffer_allocate/mem_reuse_manager.cpp | 稳定分配顺序并修复 NBNC 告警 | | autofuse/optimize/buffer_allocate/mem_reuse_manager.h | 声明单组临时 Buffer 分配函数 | | autofuse/optimize/buffer_allocate/tensor_mem_defs.h | 增加 allocation_order | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 修正 PGO fallback 返回码 | | autofuse/compiler/python/compile_adapter.py | 处理 PGO 搜索文件缺失 | | autofuse/tests/v35/ut/optimize/test_vf_partition.cpp | VF 稳定性、控制依赖和重复名 UT;补直接 include | | autofuse/tests/ut/optimize/test_buf_que_allocator.cpp | Buffer 稳定分配 UT | | autofuse/tests/ut/python/test_compile_adapter.py | 搜索文件缺失 UT | | autofuse/tests/ut/codegen/test_codegen_tiling.cpp | 适配 PGO fallback 返回码 | | autofuse/tests/st/backend_e2e/pgo_add_abs_inductor_test/pgo_add_abs_inductor_backend_generate.cpp | 适配 fallback 生成代码 | See merge request: cann/graph-autofusion!1662 | 15 天前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 20 天前 | |
refactor: split tiling codegen implementations(Inductor支持PGO的前置PR) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1633 merge refactor/split-tiling-codegen into develop refactor: split tiling codegen implementations(Inductor支持PGO的前置PR) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 autofuse/codegen/codegen_tiling.cpp 同时承载通用 tiling、Cube、Inductor TopN、TF PGO、内存管理和搜索逻辑,文件接近 5K 行,后续功能修改难以独立审查,也会放大冲突范围。 本 PR 仅做前置职责拆分,不引入 Inductor PGO 新能力,不修改 TF PGO、Inductor TopN、Cube 或通用 tiling 的既有行为。 ### 二、修改方案 - 保留通用 tiling 生成入口和 fallback 逻辑在 codegen_tiling.cpp。 - 按职责拆出 Cube、Inductor TopN、PGO 公共生成、PGO 内存、PGO 运行入口、PGO 搜索和公共工具实现。 - 在 codegen_tiling.h 标注各声明对应的实现文件,接口声明和可见性不变。 - CV 跨翻译单元辅助函数使用 hidden visibility,避免新增动态导出符号。 拆分后 codegen_tiling.cpp 由 4868 行降至约 1915 行。整体差异为 3350 行新增、3146 行删除,净增 204 行;净增内容主要是新文件 License、include、namespace 和职责注释,主体实现为原代码搬移。 ### 三、代码修改流程图 mermaid graph LR H[codegen_tiling.h<br/>统一类声明与实现文件索引] C[codegen_tiling.cpp<br/>通用入口与 fallback] CU[codegen_tiling_cube.cpp<br/>Cube 与 CV tiling] IT[codegen_tiling_inductor_topn.cpp<br/>Inductor TopN] PC[codegen_tiling_pgo_common.cpp<br/>PGO 公共代码生成] PM[codegen_tiling_pgo_memory.cpp<br/>PGO Tensor 与内存] PR[codegen_tiling_pgo_runtime.cpp<br/>TF PGO 入口] PS[codegen_tiling_pgo_search.cpp<br/>PGO 搜索] U[codegen_tiling_utils.cpp<br/>跨模块公共工具] H -->|实现| C H -->|实现| CU H -->|实现| IT H -->|实现| PC H -->|实现| PM H -->|实现| PR H -->|实现| PS C -->|复用| U CU -->|复用| U IT -->|复用| U PC -->|复用| U ## 变更类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 后续 Inductor MSPTI PGO 功能 PR #1541 将基于本 PR 重整,以缩小功能 PR 的搬移噪声。 ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - TestCodegenTiling.*:88/88 PASS。 - 拆分前后 TilingLib:: 方法引用均为 139,方法名及出现次数无差异。 #### 1.2 系统测试 - Codegen C++ ST:47/47 PASS。 - Python ST:124 PASS,8 SKIP。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本 PR 不涉及文档更新 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 - aihac_codegen、test_main 构建成功,构建并行度为 -j 8。 - clang-format --dry-run --Werror:PASS。 - pre-commit:PASS。 - OAT:PASS。 - git diff --check:PASS。 - nm -D 检查确认 CV helper 未新增动态导出符号。 ### 注意事项 - 目标分支为 develop,PR 不包含 docs/、runner、proxy 或 Inductor PGO IPC 功能代码。 - 本 PR 不改变未开启 PGO 时的路径,也不改变原 TF PGO 和 Inductor TopN 路径。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | c94e406b | refactor: split tiling codegen implementations | 10 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/codegen/codegen_tiling.cpp | 修改 | 保留通用入口、基础生成及 fallback | | autofuse/codegen/codegen_tiling.h | 修改 | 标注声明对应的实现模块 | | autofuse/codegen/codegen_tiling_cube.cpp | 新增 | Cube/CV tiling 生成 | | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 新增 | Inductor TopN 生成 | | autofuse/codegen/codegen_tiling_pgo_common.cpp | 新增 | PGO 公共代码生成 | | autofuse/codegen/codegen_tiling_pgo_memory.cpp | 新增 | PGO Tensor 参数与内存管理生成 | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 新增 | TF PGO 生成入口 | | autofuse/codegen/codegen_tiling_pgo_search.cpp | 新增 | PGO 候选搜索生成 | | autofuse/codegen/codegen_tiling_utils.cpp | 新增 | 跨模块公共工具实现 | | autofuse/codegen/codegen_tiling_utils.h | 新增 | 跨模块公共工具声明 | See merge request: cann/graph-autofusion!1633 | 21 天前 | |
refactor: split tiling codegen implementations(Inductor支持PGO的前置PR) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1633 merge refactor/split-tiling-codegen into develop refactor: split tiling codegen implementations(Inductor支持PGO的前置PR) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 autofuse/codegen/codegen_tiling.cpp 同时承载通用 tiling、Cube、Inductor TopN、TF PGO、内存管理和搜索逻辑,文件接近 5K 行,后续功能修改难以独立审查,也会放大冲突范围。 本 PR 仅做前置职责拆分,不引入 Inductor PGO 新能力,不修改 TF PGO、Inductor TopN、Cube 或通用 tiling 的既有行为。 ### 二、修改方案 - 保留通用 tiling 生成入口和 fallback 逻辑在 codegen_tiling.cpp。 - 按职责拆出 Cube、Inductor TopN、PGO 公共生成、PGO 内存、PGO 运行入口、PGO 搜索和公共工具实现。 - 在 codegen_tiling.h 标注各声明对应的实现文件,接口声明和可见性不变。 - CV 跨翻译单元辅助函数使用 hidden visibility,避免新增动态导出符号。 拆分后 codegen_tiling.cpp 由 4868 行降至约 1915 行。整体差异为 3350 行新增、3146 行删除,净增 204 行;净增内容主要是新文件 License、include、namespace 和职责注释,主体实现为原代码搬移。 ### 三、代码修改流程图 mermaid graph LR H[codegen_tiling.h<br/>统一类声明与实现文件索引] C[codegen_tiling.cpp<br/>通用入口与 fallback] CU[codegen_tiling_cube.cpp<br/>Cube 与 CV tiling] IT[codegen_tiling_inductor_topn.cpp<br/>Inductor TopN] PC[codegen_tiling_pgo_common.cpp<br/>PGO 公共代码生成] PM[codegen_tiling_pgo_memory.cpp<br/>PGO Tensor 与内存] PR[codegen_tiling_pgo_runtime.cpp<br/>TF PGO 入口] PS[codegen_tiling_pgo_search.cpp<br/>PGO 搜索] U[codegen_tiling_utils.cpp<br/>跨模块公共工具] H -->|实现| C H -->|实现| CU H -->|实现| IT H -->|实现| PC H -->|实现| PM H -->|实现| PR H -->|实现| PS C -->|复用| U CU -->|复用| U IT -->|复用| U PC -->|复用| U ## 变更类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 后续 Inductor MSPTI PGO 功能 PR #1541 将基于本 PR 重整,以缩小功能 PR 的搬移噪声。 ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - TestCodegenTiling.*:88/88 PASS。 - 拆分前后 TilingLib:: 方法引用均为 139,方法名及出现次数无差异。 #### 1.2 系统测试 - Codegen C++ ST:47/47 PASS。 - Python ST:124 PASS,8 SKIP。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本 PR 不涉及文档更新 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 - aihac_codegen、test_main 构建成功,构建并行度为 -j 8。 - clang-format --dry-run --Werror:PASS。 - pre-commit:PASS。 - OAT:PASS。 - git diff --check:PASS。 - nm -D 检查确认 CV helper 未新增动态导出符号。 ### 注意事项 - 目标分支为 develop,PR 不包含 docs/、runner、proxy 或 Inductor PGO IPC 功能代码。 - 本 PR 不改变未开启 PGO 时的路径,也不改变原 TF PGO 和 Inductor TopN 路径。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | c94e406b | refactor: split tiling codegen implementations | 10 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/codegen/codegen_tiling.cpp | 修改 | 保留通用入口、基础生成及 fallback | | autofuse/codegen/codegen_tiling.h | 修改 | 标注声明对应的实现模块 | | autofuse/codegen/codegen_tiling_cube.cpp | 新增 | Cube/CV tiling 生成 | | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 新增 | Inductor TopN 生成 | | autofuse/codegen/codegen_tiling_pgo_common.cpp | 新增 | PGO 公共代码生成 | | autofuse/codegen/codegen_tiling_pgo_memory.cpp | 新增 | PGO Tensor 参数与内存管理生成 | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 新增 | TF PGO 生成入口 | | autofuse/codegen/codegen_tiling_pgo_search.cpp | 新增 | PGO 候选搜索生成 | | autofuse/codegen/codegen_tiling_utils.cpp | 新增 | 跨模块公共工具实现 | | autofuse/codegen/codegen_tiling_utils.h | 新增 | 跨模块公共工具声明 | See merge request: cann/graph-autofusion!1633 | 21 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 2 个月前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 2 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 天前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 3 个月前 | ||
| 7 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 29 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 2 个月前 | ||
| 11 天前 | ||
| 21 天前 | ||
| 4 天前 | ||
| 8 天前 | ||
| 1 天前 | ||
| 11 天前 | ||
| 6 天前 | ||
| 11 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 20 天前 | ||
| 20 天前 | ||
| 7 天前 | ||
| 20 天前 | ||
| 7 天前 | ||
| 15 天前 | ||
| 20 天前 | ||
| 21 天前 | ||
| 21 天前 | ||
| 2 个月前 | ||
| 2 个月前 |