| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: 优化 Reduce RA 未对齐尾部开销和 tile reorder 轴优先级 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1006 merge fix/reduce-tail-vf-head-cost-v2 into develop fix: 优化 Reduce RA 未对齐尾部开销和 tile reorder 轴优先级 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 描述 ### 一、主要解决的问题 #### 1.1 Reduce RA Unaligned Tail 性能模型重复计算 VF Head Cost Reduce 算子在 RA(Reduce-Axis)非对齐 tail 场景下,性能模型将 VF Head Cost(向量函数头部开销)按 tail 迭代次数重复计算,导致性能评估偏大。实际硬件执行时 VF Head 仅执行一次,不随 tail 迭代重复。此问题同时影响 AR(Axis-Reduce)tail inplace 路径和 RA tree reduce 路径。 #### 1.2 Reduce Tile Reorder 缺少参数化阈值和运行时动态选择 原有 Reduce tile reorder 逻辑使用硬编码阈值判断是否交换 tail/reduce 轴顺序,无法适配不同架构的 cache_line_size 和 vector_len_size。同时,对于动态 shape 场景(编译期无法确定轴大小),缺少运行时 reorder 规则下发机制,导致无法在运行时根据实际 shape 动态选择最优轴序。 #### 1.3 架构硬件参数硬编码分散 V1/V2 架构的 cache_line_size 和 vector_len_size 分散在多个文件中以硬编码常量形式使用,维护不便且容易不一致。 ### 二、修改方案 #### 2.1 拆分 Reduce Tail VF Head Cost - 新增 BuildRepeatedVfGroupCost 函数,将 VF Head Cost(常量 64 cycles)与 body cost 分离:cost = min(repeats, 1) * kReduceVfHeadCost + repeats * body_cost - 新增 BuildVfGroupBodyCost / BuildB64VfGroupBodyCost 仅计算 body 部分(load + binary + store)的指令开销,不含 head - 引入 TailInplaceCostBuilder 回调类型,使 tree reduce 路径可为 unaligned tail 指定专用的 inplace cost builder - 修改 BuildTreeBodyCost 支持 tail_builder 回调,对 unaligned 场景使用专用 tail cost(如 4 load + 1 binary + 2 store),避免统一使用通用路径 #### 2.2 Reduce Tile Reorder 参数化与运行时规则 - 新增 arch_param.h,定义 ArchHardwareConfig 结构体和 V1/V2 架构常量(kV1ArchHardwareConfig{512, 256}、kV2ArchHardwareConfig{128, 256}) - TilingScheduleConfig 新增 vector_len_size 字段,TilingScheduleConfigTable 新增 GetVectorLenSize() 虚方法 - PerfParamTable / PerfParamTableV1 / PerfParamTableV2 的 GetMicroApiLen() 统一从 arch_param 获取 - 新增 RuntimeReorderRule 结构体,描述运行时 reorder 条件(preferred_axis、fallback_axis、condition_axis、compare_axis 及阈值) - arg_list_reorder.cpp 新增 reduce tile reorder 逻辑: - 编译期常量 shape:基于阈值(condition_threshold=64, compare_threshold=128)直接交换单模板内轴序 - 动态 shape:生成 RuntimeReorderRule 下发至 solver codegen,使用原始轴(orig_axis)大小作为判断条件 - axes_reorder_solver_gen.cpp 新增 GenRuntimeReorderRules() 方法,生成运行时 reorder 的 C++ 代码(条件判断 + local_buffer_vars 交换) - solver_pass_manager.cpp 将 runtime_reorder_rules 传递到 solver gen #### 2.3 架构参数统一收归 - V1/V2 的 TilingScheduleConfigTable 子类使用 arch_param::kV1ArchHardwareConfig / kV2ArchHardwareConfig 替代硬编码 - TilingScheduleConfig 默认值使用 arch_param::kDefaultCacheLineSize / kDefaultVectorLenSize ### 三、代码修改流程图 #### 3.1 多文件调用关系图 mermaid graph TD A[arch_param.h<br/>新增: 架构硬件参数] B[model_info.h<br/>新增: RuntimeReorderRule<br/>新增: vector_len_size] C[perf_param.h / v1 / v2<br/>GetMicroApiLen 参数化] D[arg_list_reorder.cpp<br/>Reduce tile reorder 逻辑<br/>生成 RuntimeReorderRule] E[axes_reorder_solver_gen.cpp<br/>GenRuntimeReorderRules<br/>生成运行时 reorder 代码] F[solver_pass_manager.cpp<br/>传递 runtime_reorder_rules] G[reduce_api_perf_v2.cpp<br/>拆分 VF Head/Body Cost] A --> B A --> C B --> D B --> F D -->|生成 RuntimeReorderRule| F F -->|设置到 solver_gen| E E -->|codegen 输出| H[运行时 reorder C++ 代码] style A fill:#90EE90,stroke:#006400,stroke-width:2px style B fill:#FFD700,stroke:#B8860B,stroke-width:2px style D fill:#FFD700,stroke:#B8860B,stroke-width:2px style E fill:#FFD700,stroke:#B8860B,stroke-width:2px style G fill:#FFD700,stroke:#B8860B,stroke-width:2px #### 3.2 Reduce Tile Reorder 决策流程 mermaid flowchart TD Start(["FindSpecialArgs 遍历节点"]) --> CheckBlock{"Reduce 轴<br/>Block Split?"} CheckBlock -->|"是"| SetTilingR["tiling_R_ = true<br/>保持 Tiling_R 排序"] CheckBlock -->|"否"| CheckTile{"Reduce 轴<br/>Tile Split?"} CheckTile -->|"否"| Default["保持默认轴顺序"] CheckTile -->|"是"| CheckThreshold{"tail < cache_line<br/>且 reduce > vector_len?"} CheckThreshold -->|"不满足"| Default CheckThreshold -->|"满足"| CheckStatic{"shape 静态可知?"} CheckStatic -->|"是"| StaticReorder["prefer_reduce_tile_ = true<br/>编译期提升 Tail 轴优先级"] CheckStatic -->|"否"| DynamicRule["记录 RuntimeReorderRule<br/>传递给 codegen"] DynamicRule --> Codegen["solver 函数中生成<br/>运行时条件交换代码"] style Start fill:#90EE90,stroke:#006400,stroke-width:2px style StaticReorder fill:#e1f5ff,stroke:#0288d1,stroke-width:2px style DynamicRule fill:#e1f5ff,stroke:#0288d1,stroke-width:2px style Codegen fill:#e1f5ff,stroke:#0288d1,stroke-width:2px style SetTilingR fill:#FFD700,stroke:#B8860B,stroke-width:2px #### 3.3 Reduce Tail VF Cost 拆分流程 mermaid flowchart TD Start([BuildTreeBodyCost]) --> HasTail{tail_builder != nullptr?} HasTail -->|Yes| TailBuild[调用 tail_builder<br/>BuildNormalUnalignedInplaceCost] HasTail -->|No| DefaultBuild[BuildRepeatedVfGroupCost<br/>head + repeats * body] TailBuild --> RepeatedCost[BuildRepeatedVfGroupCost] DefaultBuild --> RepeatedCost RepeatedCost --> HeadCost[min repeats 1 * kReduceVfHeadCost 64] RepeatedCost --> BodyCost[repeats * body_cost] HeadCost --> Total[cost = head + body + main_fold + tail_fold] BodyCost --> Total Total --> Return([返回总 cost]) style Start fill:#90EE90,stroke:#006400,stroke-width:2px style RepeatedCost fill:#e1f5ff,stroke:#0066cc,stroke-width:2px style HeadCost fill:#FFD700,stroke:#B8860B,stroke-width:2px ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - test_arg_list_reorder.cpp:新增 7 个测试用例 - keep_tiling_r_arg_list_when_reduce_block_split:验证 reduce 分核场景保持 tiling_R_arg_list 顺序 - keep_tiling_r_arg_list_when_reduce_block_split_without_threshold_match:验证阈值不匹配时不触发 reorder - reorder_single_template_for_reduce_tile_small_tail_large_reduce:验证小 tail 大 reduce 单模板 reorder - keep_default_single_template_for_reduce_tile_without_threshold_match:验证多种阈值不匹配场景 - record_runtime_reorder_for_dynamic_reduce_tile:验证动态 shape 生成 RuntimeReorderRule - v2_micro_api_len_equals_schedule_vector_len:验证 V2 MicroApi 长度与 vector_len_size 一致 - v1_micro_api_len_equals_schedule_vector_len:验证 V1 MicroApi 长度与 vector_len_size 一致 - test_axes_reorder_gen.cpp:新增 3 个测试用例 - GenRuntimeReorderRuleForDynamicReduceTile:验证运行时 reorder 代码生成 - GenRuntimeReorderRuleUsesOriginalAxesForDynamicReduceTile:验证使用原始轴生成条件 - GenRuntimeReorderRuleUsesOriginalAxisProductForDynamicReduceTile:验证多轴乘积场景 - test_reduce_min_max_api_perf_v2.cpp:新增 5 个测试用例 - ReduceSumRaUnalignedTailRDoesNotRepeatVfHead:验证 RA 非对齐 tail 不重复 VF head - ReduceSumRaAlignedTailRDoesNotRepeatVfHead:验证 RA 对齐 tail 不重复 VF head - ReduceSumRaSymbolicAlignedTailDoesNotRepeatVfHead:验证符号表达式对齐场景 - ReduceRaB64TailRDoesNotRepeatVfHead:验证 B64 特化路径 - ReduceArTailRDoesNotRepeatVfHead:验证 AR tail 路径 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 运行相关 UT: bash sh build.sh -u --module=autofuse_framework -j 8 ### 注意事项 - VF Head Cost 拆分为 min(repeats, 1) * 64 + repeats * body,对 repeats=0 的边界场景无影响(cost=0) - Runtime reorder 仅在动态 shape 且满足 orig_axis 阈值条件时生成,不影响编译期可确定的场景 - arch_param.h 中的硬件参数为 inline constexpr,不引入额外链接依赖 ### 提交记录 | Commit | 描述 | 修改文件数 | 修改行数 | |--------|------|-----------|----------| | 89aa3f2 | perf: parameterize att tiling reorder thresholds | 9 | +303/-79 | | ade509a | perf: adjust att reduce tile reorder | 2 | +63/-18 | | a1f1458 | fix: resolve att warning issues | 4 | +284/-280 | | 36a00ca | fix: add reduce tile reorder selection logs | 4 | +46/-12 | | f8651e5 | fix: use original axes for reduce tile reorder | 5 | +148/-9 | | 2fa5eb0 | fix(att): adjust reduce ra unaligned tail cost | 2 | +63/-18 | | 050018e | fix(att): split reduce tail vf head cost | 2 | +139/-40 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/att/base/arch_param.h | 新增 | 架构硬件参数定义(V1/V2 cache_line_size, vector_len_size) | | autofuse/att/base/model_info.h | 修改 | 新增 RuntimeReorderRule、vector_len_size、GetVectorLenSize() | | autofuse/att/gen_model_info/api_perf_register/perf_param.h | 修改 | GetMicroApiLen() 使用 arch_param 常量 | | autofuse/att/gen_model_info/api_perf_register/v1/perf_param_v1.h | 修改 | V1 GetMicroApiLen/CacheLineSize/VectorLenSize 参数化 | | autofuse/att/gen_model_info/expr_gen/arg_list_reorder.cpp | 修改 | 新增 reduce tile reorder 逻辑、RuntimeReorderRule 生成 | | autofuse/att/gen_model_info/expr_gen/arg_list_reorder.h | 修改 | SortArgList 新增 runtime_reorder_rules 参数 | | autofuse/att/gen_model_info/gen_model_info.cpp | 修改 | 传递 runtime_reorder_rules 到 SortArgList | | autofuse/att/generator/solver_pass_gen/axes_reorder_solver/axes_reorder_solver_gen.cpp | 修改 | 新增 GenRuntimeReorderRules() 代码生成 | | autofuse/att/generator/solver_pass_gen/axes_reorder_solver/axes_reorder_solver_gen.h | 修改 | 新增 RuntimeReorderRule 相关成员和方法 | | autofuse/att/generator/solver_pass_gen/solver_pass_manager.cpp | 修改 | 传递 runtime_reorder_rules 到 solver_gen | | autofuse/tests/common/stub/stub_solver_model_info.h | 修改 | stub 补充 vector_len_size | | autofuse/tests/ut/att/testcase/gen_model_info/expr_gen/test_arg_list_reorder.cpp | 修改 | 新增 7 个 reduce tile reorder 和 vector_len 测试 | | autofuse/tests/ut/att/testcase/solver_pass_gen/axes_reorder_gen/test_axes_reorder_gen.cpp | 修改 | 新增 3 个 runtime reorder codegen 测试 | | autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_reduce_min_max_api_perf_v2.cpp | 修改 | 新增 5 个 VF head cost 拆分验证测试 | | autofuse/v35/att/api_perf_register/ascendc_api_perf/reduce_api_perf_v2.cpp | 修改 | 拆分 VF Head/Body Cost、新增 BuildRepeatedVfGroupCost | | autofuse/v35/att/api_perf_register/perf_param_v2.h | 修改 | V2 GetMicroApiLen/CacheLineSize/VectorLenSize 参数化 | See merge request: cann/graph-autofusion!1006 | 2 个月前 | |
feat: 新增 Transpose/IsNan/IsFinite V2 性能公式及参数优化 Co-authored-by: gcw_V3YyYBt1<gaoxin32@huawei.com> # message auto-generated for no-merge-commit merge: !1764 merge perf/transpose-isnan-isfinite-att-v2 into develop feat: 新增 Transpose/IsNan/IsFinite V2 性能公式及参数优化 Created-by: gcw_V3YyYBt1 Commit-by: gcw_V3YyYBt1 Merged-by: cann-robot Description: # Pull Request ## 描述 新增 Transpose、IsNan、IsFinite 三个算子的 V2 ATT 性能建模公式,替换原有的 GetPerfFunc(kUnitVector) 通用评估,提升性能评估精度。 **Transpose**:按 total_dim / inner_dim 分场景(Dim2Inner1、Dim3Inner1/2、Dim4Inner1/2/3、Fallback)构建索引生成与扩展搬运公式,支持 1-3 个内层维度的索引序列生成建模及多层外层循环的 Gather/Store 搬运建模。 **IsNan/IsFinite**:提取 UnaryBitWidthChange 通用公式,call_count 放在最外层乘法;各算子类型统一 dtype(Duplicate→kInt8、Ne→kUInt8、Select/Store→kFloat32、MaskPack→kUInt8)。 ## 背景 当前 IsNan、IsFinite、Transpose 在 V2 性能注册中使用 GetPerfFunc(kUnitVector) 通用评估,无法反映实际 AscendC codegen 的指令序列,导致性能公式精度不足。 ## 修改方案 1. **新增参数结构**:UnaryBitWidthChangeNodeParams、TransposeNodeParams 及对应的构建和填充逻辑 2. **新增 TransposePerf**:按维度组合分 7 个场景构建索引生成 + 扩展搬运公式 3. **新增 IsNanPerf/IsFinitePerf**:共享 AddUnaryBitWidthChangeCommonPerf,公式为 (vfhead + max_latency + all_cost) * call_count 4. **参数优化**:移除未使用的 tail_repeat 参数,补充 kSymFive/kSymFour 常量,GetUnaryBitWidthChangeCallCount fallback 使用 input_dims 全量乘积 5. **补充注册**:新增 CompareScalarGE 性能表项 6. **切换注册入口**:IsNan/IsFinite/Transpose 注册切换至专用 V2 性能函数 ## 测试 合入前: |总共 |成功 |失败 | |--|--|--| | 307 |83 | 224 | 合入后: |总共 |成功 |失败 | |--|--|--| | 307 |127 | 180 | 回正44条 ## 变更类型 - [x] ✨ 新功能 - [x] ♻️ 重构(移除未使用参数) ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我在标题中使用了合适的类型标签 ## 其他信息 See merge request: cann/graph-autofusion!1764 | 11 天前 | |
fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1960 merge fix/att-cache-guard-final into develop fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 修复 ATT 在 cache guard、NDDMA 计数及多 group 串行依赖建模上的不一致,避免缓存命中路径执行次数被低估,以及存在真实跨 group 依赖时 objective 偏小导致候选模板排序错误。 同时完善 schedule-result 性能日志:最终 The value of graph*_result* 日志包含 group_sum、edge_model、edge base、penalty 公式及对应数值,并保留数值紧跟在 is 后,兼容现有 att_analyze 结果性能解析。 ## 修改方案 1. 增加统一的 cache guard 计数逻辑,按符号 guard 范围和 block 维度计算实际执行次数,并对空/非法元数据安全回退。 2. 修正 parser 对共享 cache guard parent、block 外层 guard 和非连续轴的识别,保持 NDDMA 执行计数与 codegen 一致。 3. 在 codegen 中生成确定性的跨 group 串行 edge relation;对有效且非并行的 group 边增加可控惩罚,空 relation、单 group、并行 group 保持原逻辑。 4. 将 edge penalty 参数集中到 att_group_perf_config.h,当前参数为 ratio=0.10、cap=8000,便于后续基于 profiling 校准。 5. 在最终 schedule-result 日志中输出: - group_sum 汇总值; - edge_model 版本; - edge base 公式及计算值; - penalty 的 min(cap, ratio * base) 公式及计算值; - 最终 objective 值。 6. 保持原日志解析契约:最终结果格式为 The value of graph*_result* is <numeric> objective(...),不改变 objective 计算和模板选择逻辑。 7. 补充 cache guard、parser、生成器及 codegen 的 UT,并新增 ATT ST 回归用例。 ## 代码修改流程图 mermaid flowchart TD A["解析 ASCIR cache guard 与 group relation"] --> B{"元数据有效吗"} B -->|否| C["安全回退原有估值"] B -->|是| D["按符号范围计算 guard/NDDMA 次数"] D --> E["确定性生成跨 group edge"] E --> F{"存在串行依赖吗"} F -->|否| G["保持原 objective"] F -->|是| H["加入 edge penalty"] G --> I["生成数值前缀日志"] H --> I I --> J["追加 group_sum 与 edge_model 公式"] J --> K["进行模板比较与 PGO 候选排序"] ## 测试用例说明 本地 ATT Generator UT: text GeneratorUT.GenUpdatePerf*: 11/11 passed 本地 att_analyze 日志解析测试: text python3 -m pytest -q autofuse/tools/att_analyze/tests/unit/test_summary_templates.py autofuse/tools/att_analyze/tests/unit/test_log_parser.py 27 passed 新增公式日志兼容性验证: text The value of graph0_result0 is 85205.982063 objective(...) result_performance=85205.982063 ATT LLT(CANN 9.2.0,/workspace/third_party): text att_ut_aggregate: Passed 100% tests passed, 0 tests failed 新增 ATT ST 回归: text CacheGuardRegression.*: 6/6 passed ATT ST 全量入口受既有环境问题影响(缺失 ReduceSplitPenalty 生成可执行文件,以及 GCC 9.4/13.3 gcov 版本不匹配),不归因于本 patch。 NPU 端使用 Ascend950PR_9579(硬件 block_dim=56)和当前源码 host/device 产物,在统一 DSO、独立 TorchInductor/NPU cache 后验证通过: | PGO topn | 首次编译耗时 (ms) | eager (ms) | autofusion (ms) | speedup | 最大误差 | |---|---:|---:|---:|---:|---:| | 1 | 24332.7870 | 0.36129 | 0.33658 | 1.073x | 4.768e-07 | | 10 | 51401.0540 | 0.06997 | 0.06719 | 1.041x | 4.768e-07 | 首次混用旧 CANN 动态库或旧 kernel cache 时曾出现 kernel init failed;清理并隔离运行时后可复现成功,说明该现象是环境/产物版本组合问题。 ## 核对清单 - [x] 代码遵循项目现有风格 - [x] 已完成 ATT UT/LLT 及新增 ST 回归验证 - [x] 已完成 Ascend950PR NPU 基本功能验证 - [x] 已验证最终 objective 日志与现有 att_analyze 解析兼容 - [x] 参数集中管理,未引入与本 patch 无关的源码修改 - [x] 未跟踪用户已有临时文件和示例文件 - [x] 提交信息符合项目规范 ## 其他信息 源分支:fix/att-cache-guard-final;目标分支:develop。 最新提交:f9926331 fix: preserve numeric tiling objective log prefix。 See merge request: cann/graph-autofusion!1960 | 9 天前 | |
【质量加固】修复10个代码规范问题:枚举类改造 Co-authored-by: wem603947175<603947175@qq.com> # message auto-generated for no-merge-commit merge: !1730 merge quality-fix into develop 【质量加固】修复10个代码规范问题:枚举类改造 Created-by: wem603947175 Commit-by: wem603947175 Merged-by: cann-robot Description: # 【质量加固】修复10个代码规范问题:枚举类改造 ## 修改统计 | 项目 | 值 | |------|-----| | **问题总数** | 10 个 ✅ | | **修改文件** | 8 个(全部位于 autofuse 模块) | | **代码变更** | +10 行 / -10 行 | | **适用规则** | 规则7:枚举类优先 | --- ## 问题与文件对照表 ### 规则7:枚举类优先(10个问题,全部为 enum → enum class) | # | 文件路径 | 行号 | 枚举名 | |---|----------|------|--------| | 1 | autofuse/inc/graph_metadef/common/ge_common/debug/ge_log.h | :41 | TraceStatus | | 2 | autofuse/inc/graph_metadef/register/graph_optimizer/buffer_fusion/buffer_fusion_pattern.h | :31 | SkipStatus | | 3 | autofuse/inc/graph_metadef/register/graph_optimizer/buffer_fusion/buffer_fusion_pattern.h | :33 | ShapeTypeRule | | 4 | autofuse/inc/graph_metadef/register/graph_optimizer/fusion_common/fusion_turbo.h | :25 | TensorUptType | | 5 | autofuse/inc/graph_metadef/register/graph_optimizer/fusion_common/op_slice_info.h | :19 | OpReduceType | | 6 | autofuse/inc/graph_metadef/register/graph_optimizer/fusion_common/op_slice_info.h | :20 | OpL1FusionType | | 7 | autofuse/inc/graph_metadef/register/graph_optimizer/fusion_common/fusion_turbo_utils.h | :26 | Direction | | 8 | autofuse/inc/graph_metadef/register/graph_optimizer/buffer_fusion/buffer_fusion_pass_base.h | :23 | BufferFusionPassType | | 9 | autofuse/att/base/base_types.h | :41 | SolverType | | 10 | autofuse/graph_metadef/graph/expression/expression_impl.h | :33 | OperationType | --- ## 详细代码修改 ### 问题1:ge_log.h:41 — TraceStatus diff - enum TraceStatus { TRACE_INIT = 0, TRACE_RUNNING, TRACE_WAITING, TRACE_STOP }; + enum class TraceStatus { TRACE_INIT = 0, TRACE_RUNNING, TRACE_WAITING, TRACE_STOP }; ### 问题2:buffer_fusion_pattern.h:31 — SkipStatus diff - enum SkipStatus { DISABLED = 0, AVAILABLE = 1, SKIPPED = 2 }; + enum class SkipStatus { DISABLED = 0, AVAILABLE = 1, SKIPPED = 2 }; ### 问题3:buffer_fusion_pattern.h:33 — ShapeTypeRule diff - enum ShapeTypeRule { IGNORE_SHAPE_TYPE = 0, ONLY_SUPPORT_STATIC, ONLY_SUPPORT_DYNAMIC }; + enum class ShapeTypeRule { IGNORE_SHAPE_TYPE = 0, ONLY_SUPPORT_STATIC, ONLY_SUPPORT_DYNAMIC }; ### 问题4:fusion_turbo.h:25 — TensorUptType diff - enum TensorUptType { + enum class TensorUptType { UPDATE_NONE = 0, UPDATE_THIS = 1, UPDATE_PEER, }; ### 问题5:op_slice_info.h:19 — OpReduceType diff - enum OpReduceType { REDUCE_MEAN = 0, REDUCE_ADD, REDUCE_MAX, REDUCE_MIN }; + enum class OpReduceType { REDUCE_MEAN = 0, REDUCE_ADD, REDUCE_MAX, REDUCE_MIN }; ### 问题6:op_slice_info.h:20 — OpL1FusionType diff - enum OpL1FusionType { L1FUSION_DISABLE = 0, L1FUSION_BASIC, L1FUSION_INPUT_CTR }; + enum class OpL1FusionType { L1FUSION_DISABLE = 0, L1FUSION_BASIC, L1FUSION_INPUT_CTR }; ### 问题7:fusion_turbo_utils.h:26 — Direction diff - enum Direction { + enum class Direction { CURRENT = 0, PEER = 1, PEER_SINGLE = 2 }; ### 问题8:buffer_fusion_pass_base.h:23 — BufferFusionPassType diff - enum BufferFusionPassType { + enum class BufferFusionPassType { BUILT_IN_AI_CORE_BUFFER_FUSION_PASS, BUILT_IN_VECTOR_CORE_BUFFER_FUSION_PASS, CUSTOM_AI_CORE_BUFFER_FUSION_PASS, CUSTOM_VECTOR_CORE_BUFFER_FUSION_PASS, BUFFER_FUSION_PASS_TYPE_RESERVED }; ### 问题9:att/base/base_types.h:41 — SolverType diff - enum SolverType : uint32_t { SEARCH_TILE, ERROR }; + enum class SolverType : uint32_t { SEARCH_TILE, ERROR }; > 说明:所有调用点(如 solver_pass_manager.cpp、solver.cpp)均已使用 SolverType::SEARCH_TILE / SolverType::ERROR 前缀,改造后无需改动调用点。 ### 问题10:graph_metadef/graph/expression/expression_impl.h:33 — OperationType diff - enum OperationType : size_t { + enum class OperationType : size_t { See merge request: cann/graph-autofusion!1730 | 27 天前 | |
fix: 修复动态Shape下Reduce Tile 运行时轴重排的问题 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1537 merge fix/reduce-runtime-reorder into develop fix: 修复动态Shape下Reduce Tile 运行时轴重排的问题 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 运行时换轴破坏 canonical 槽位语义 原实现通过交换 input.local_buffer_vars 中的指针选择 Reduce Tile 求解顺序。该数组同时被公式、约束、equal_order、PGO 候选和 tiling_data 按固定下标解释;交换 z1t/z2t 后会让轴身份与槽位含义不一致,存在回填错位和精度风险。 #### 1.2 动态选择未完整作用于求解路径 原实现只交换两个变量,不能表达完整轴排列,也没有完整覆盖 WorkloadBalance 和 PGO/topn 的枚举顺序,动态决策无法稳定影响后续全部求解路径。 #### 1.3 equal_order 与变量替换需要隔离 equal_order 依赖 AttAxis::order 的 canonical 分组;缺失、重复或多重 Expr 映射可能造成误分组。运行时 preferred order 中还可能包含常量或非 local-buffer Expr,需要先投影并校验。 ### 二、修改方案 #### 2.1 canonical 和 ordered 双视图 - local_buffer_vars 保持 canonical 顺序,固定用于轴身份、equal_order、公式、约束、性能计算和 tiling_data 回填。 - 新增 ordered_local_buffer_vars,仅用于普通 solver、WorkloadBalance 和 PGO/topn 的遍历顺序。 - 新增 ordered_to_canonical,将 ordered 下标映射回 canonical 下标;两种视图共享同一 TilingVariable,不复制状态。 #### 2.2 生成完整运行时规则 - RuntimeReorderRule 使用原始 tail/reduce Expr、参数化阈值和完整 preferred_order。 - canonical 与 preferred 分别构建拓扑;只有 canonical 写入 AttAxis::order,preferred 只生成完整排列。 - equal-order 组内相对顺序保持 canonical;非法、缺失或重复排列不生成运行时重排代码,安全回退 canonical。 #### 2.3 求解和输出隔离 - 运行时条件 tail < cache_line_size / dtype_size 且 reduce > vector_len_size / dtype_size 命中时,改写 ordered 视图及映射,不修改 canonical 数组。 - equal_order 始终在 canonical 轴上识别和联合求解;普通求解按 ordered 遍历,并通过映射访问 canonical solved_axes。 - PGO 按 ordered 枚举和重置变量,候选值按 canonical 下标写回;topn 过滤及最终 tiling_data 均保持 canonical 布局。 ### 三、代码修改流程图 mermaid flowchart TD A[ArgListReorder 分析 Reduce Tile] ==> B{shape 是否动态且满足生成条件} B ==>|否| C[仅保留 canonical 拓扑] B ==>|是| D[独立生成 canonical 与 preferred 拓扑] D ==> E[canonical 写入 AttAxis order] D ==> F[preferred 提取完整 Tile Expr 顺序] F ==> G[保持 equal-order 组内 canonical 相对顺序] G ==> H{投影后是否为 local-buffer 完整全排列} H ==>|否| C H ==>|是| I[保存 RuntimeReorderRule] C ==> J[Codegen 初始化 canonical ordered 和单位映射] I ==> J J ==> K{运行时 tail 小且 reduce 大} K ==>|否| L[ordered 保持 canonical] K ==>|是| M[ordered 切换 preferred 并更新映射] L ==> N{求解路径} M ==> N N ==>|equal-order| O[canonical 分组和联合求解] N ==>|普通与 WorkloadBalance| P[ordered 遍历并映射 canonical index] N ==>|PGO 与 topn| Q[ordered 枚举并按 canonical 下标保存候选] O ==> P P ==> R[公式 约束 性能计算读取 canonical] Q ==> R R ==> S[tiling_data 按 canonical 槽位回填] ### 四、核心类图 mermaid classDiagram class RuntimeReorderRule { Expr condition_axis Expr compare_axis uint32 condition_threshold uint32 compare_threshold ExprVector preferred_order } class ModelInfo { RuntimeReorderRuleVector runtime_reorder_rules AttAxisVector arg_list } class ArgListReorder { SortArgList() SetRuntimePreferredOrder() GetTileSplitOrder() } class ArgsManager { GetAxesOrder() GetVarsRelations() } class SolverPassManager { InitSolverGen() } class AxesReorderSolverGen { SetAxesOrder() SetVarsRelations() GenRuntimeReorderRules() GetRuntimePreferredIndices() } class AxesReorderSolverInput { TilingVariablePointer local_buffer_vars TilingVariablePointer ordered_local_buffer_vars uint32Pointer ordered_to_canonical } class AxesReorderSolver { IdentifyEqualPriorityAxes() NaiveLocalBufTiling() BinaryLocalBufTilingCore() WorkloadBalance() } class AxesReorderPgoSolver { PgoSolverGenerateAllTilingDataInner() } class TilingVariable { size_t order int64 value } ArgListReorder ..> RuntimeReorderRule : 生成完整规则 ModelInfo o-- RuntimeReorderRule : 保存 ArgsManager ..> ModelInfo : 读取 canonical 信息 SolverPassManager ..> ArgsManager : 获取 order 与变量关系 SolverPassManager ..> AxesReorderSolverGen : 初始化 codegen AxesReorderSolverGen ..> RuntimeReorderRule : 解析 preferred order AxesReorderSolverGen ..> AxesReorderSolverInput : 生成双视图输入 AxesReorderSolverInput o-- TilingVariable : 两种视图共享对象 AxesReorderSolver ..> AxesReorderSolverInput : 普通求解 AxesReorderPgoSolver ..> AxesReorderSolverInput : PGO 枚举 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - 完整 ATT UT:1022/1022 通过。 - 新增规则生成、完整排列、非法排列回退、替换变量一对一映射、equal_order 隔离、WorkloadBalance ordered 遍历、PGO canonical 回填等覆盖。 - 独立 review 定向用例:13/13 通过。 #### 1.2 系统测试 - att_st:通过。 - inductor_topn_test_codegen:通过。 - inductor_tail_brc_tail_reduce_test_codegen:通过。 - pgo_add_abs_inductor_test_codegen:通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 - git diff --check 通过。 - changed-lines clang-format 检查通过,无额外格式化。 - OAT 对变更源码和测试文件检查通过。 - 构建产物时间晚于相关源码。 - 独立代码 review 通过,无 Critical 或 Important。 ### 注意事项 - 本次不修改对外 API 或 ABI,不新增堆分配及设备侧逻辑。 - 动态 Reduce 的真实设备侧 E2E 覆盖未包含在本 PR,作为非阻塞后续增强项。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | 4cb7547d | 修复 Reduce Tile 运行时轴重排 | 16 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/att/base/model_info.h | 修改 | RuntimeReorderRule 改为完整 preferred order | | autofuse/att/gen_model_info/expr_gen/arg_list_reorder.cpp | 修改 | 生成并校验 canonical 与 preferred 拓扑 | | autofuse/att/gen_model_info/expr_gen/arg_list_reorder.h | 修改 | 增加 preferred 顺序辅助接口 | | autofuse/att/generator/preprocess/args_manager.cpp | 修改 | 生成 canonical axis order 及唯一 fallback | | autofuse/att/generator/preprocess/args_manager.h | 修改 | 暴露 GetAxesOrder | | autofuse/att/generator/solver_pass_gen/axes_reorder_solver/axes_reorder_solver_gen.cpp | 修改 | 生成双视图、映射和完整运行时选择代码 | | autofuse/att/generator/solver_pass_gen/axes_reorder_solver/axes_reorder_solver_gen.h | 修改 | 增加 order、变量关系及 preferred 投影接口 | | autofuse/att/generator/solver_pass_gen/solver_pass_manager.cpp | 修改 | 向 codegen 传递 canonical order 和变量关系 | | autofuse/att/generator/solver_pass/axes_reorder_solver_code/axes_reorder_solver_data_struct.cpp | 修改 | AxesReorderSolverInput 增加 ordered 视图和映射 | | autofuse/att/generator/solver_pass/axes_reorder_solver_code/axes_reorder_solver_equal_priority.cpp | 修改 | 跳过单轴组并在 canonical 上识别双轴组 | | autofuse/att/generator/solver_pass/axes_reorder_solver_code/axes_reorder_solver_local_buf.cpp | 修改 | 普通 solver 和 WorkloadBalance 使用 ordered 遍历 | | autofuse/att/generator/solver_pass/axes_reorder_solver_code/axes_reorder_solver_autotuning.cpp | 修改 | PGO ordered 枚举和 canonical 候选回填 | | autofuse/att/generator/solver_pass/axes_reorder_solver_code/axes_reorder_solver_main.cpp | 修改 | 初始化并展示 ordered 视图 | | autofuse/tests/ut/att/testcase/gen_model_info/expr_gen/test_arg_list_reorder.cpp | 修改 | 补充规则生成和 equal-order 稳定性 UT | | autofuse/tests/ut/att/testcase/preprocess/test_args_manager.cpp | 修改 | 补充缺失与歧义 order fallback UT | | autofuse/tests/ut/att/testcase/solver_pass_gen/axes_reorder_gen/test_axes_reorder_gen.cpp | 修改 | 补充普通、PGO、WorkloadBalance 代码生成 UT | See merge request: cann/graph-autofusion!1537 | 1 个月前 | |
【feat】: v35 ReduceMin/ReduceMax/ReduceAll/ReduceAny 三层性能建模实现 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !448 merge fix_reduce_perf_model into develop 【feat】: v35 ReduceMin/ReduceMax/ReduceAll/ReduceAny 三层性能建模实现 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 描述 ### 一、主要解决的问题 #### 1.1 Reduce API 缺少 V2 性能建模入口 原有 V2 API perf 路径主要覆盖 elementwise、data move 和已有 RegBase 向量函数, ReduceMin/ReduceMax/ReduceAny/ReduceAll 缺少能感知 Reduce 语义的建模入口,无法区分: - AR 与 RA Reduce pattern - B64 与普通 dtype 的向量指令成本差异 - reuse source 与 non-reuse source 的拷贝路径差异 - multi-reduce 场景下 copy merge 与 elementwise merge 的尾部成本 #### 1.2 Reduce shape、stride、merge 语义没有统一载体 ATT parser 已经能拿到 input/output repeat、stride、loop axis 等信息,但后续 perf model 缺少结构化参数,只能在 ASCIR adapter 中临时推断。该分支把 Reduce 专用参数沉淀到 codegen::ReduceSpecificParams,让 parser、ASCIR adapter 和 AscendC API perf 共用同一套语义。 #### 1.3 性能公式缺少可读拆解 复杂 Reduce 公式生成后只落在 pipe_res 和 ternary 变量中,review 或定位 tiling case 时难以直接看出每段公式对应的建模分支。该分支新增 PerfBreakdownGroup / PerfBreakdownItem,并把 breakdown 传递到 tiling code annotation。 #### 1.4 测试覆盖不足 新增 Reduce perf model 覆盖面较大,涉及 Common 合轴、ASCIR 注册、RegBase、AscendC API、符号表达式和多 reduce merge,需要补充 UT/ST 覆盖。 ### 二、修改方案 #### 2.1 Common 层新增 Reduce 专用参数模型 autofuse/common/codegen_api_param/codegen_api_param.h/.cpp 新增: - ReducePattern: 区分 AR / RA - ReduceMergeMode: 区分 none、copy、elementwise merge - ReduceMergedDims: 保存归约后的 {first, last} 二维建模形态 - ReduceReuseInfo: 标记输入是否只被当前 reduce 使用 - ReduceSpecificParams: 汇总 reduce_type、pattern、merge_size、merge_times、reuse 等信息 - BuildReduceMergedAxisPlan / BuildReduceMergedShape / BuildReduceSpecificParams: 根据 repeat、stride、dtype size 生成统一 Reduce 建模参数 合轴逻辑以 input/output stride 是否为 0 判断 first/last 归属,并在需要时按 32B 对齐补齐尾轴尺寸。 #### 2.2 Parser 阶段填充 ReduceSpecificParams 新增 autofuse/att/gen_model_info/parser/reduce_specific_params_builder.cpp/.h,并在 AscendGraphParser::ConvertNodeInfos 中调用: - 识别 Max/Min/Mean/Prod/Sum/Any/All/ReduceMax/ReduceMin/ReduceAny/ReduceAll - 根据 output 最后一维 stride 是否为 0 推断 AR / RA - 根据 loop axis 与 input/output stride 关系判断是否需要 multi-reduce - 从 loop axis repeat 生成 merge_times - 通过输入 fanout 判断 reuse.is_reuse_source 同时 ParserSubAxis 保存 axis id,保证后续可通过 attrs.loop_axis_id 找到真实 loop axis。 #### 2.3 ASCIR Reduce adapter 负责上下文转换与注册分流 新增 autofuse/v35/att/api_perf_register/ascir_reduce_api_perf_v2.cpp/.h: - 将 codegen::ReduceSpecificParams 转成 ascendcapi_v2::ReduceApiPerfContext - 对当前 shape 重新构造 merged_dims,避免静态参数和实际 shape 不一致 - 对缺失 merged dims 的场景 fallback 到 last-axis merge - Max/Min/Any/All 在有 reduce params 时走 Reduce perf,无 reduce params 时保持 elementwise fallback - 注册 ReduceMax/ReduceMin/ReduceAny/ReduceAll 的 V2 perf 入口 #### 2.4 AscendC API 层新增 Reduce perf model 新增 autofuse/v35/att/api_perf_register/ascendc_api_perf/reduce_api_perf_v2.cpp/.h,核心入口为: - ReduceMinPerf - ReduceMaxPerf - ReduceAnyPerf - ReduceAllPerf 内部统一走 ReduceApiPerf,按 dtype、pattern、reuse、merge mode 分支: - logical reduce: Any/All - AR-B64 与 AR-normal - RA-B64 与 RA-normal - aligned / unaligned 子路径 - tree reduction 成本 - copy merge 与 elementwise merge 成本 - 256B vector block 与 B64 特殊 repeat 元素数 输出写入 perf.pipe_res[PipeType::AIV_VEC],同时写入 perf.perf_breakdowns 供 tiling annotation 展示。 #### 2.5 RegBase 与 DataMove 路径整理 - ascendc_regbase_perf.cpp/.h 新增 ReduceMinPerf / ReduceMaxPerf,通过 VF 表统一计算 RegBase reduce min/max 成本 - B64 compare 分支抽成 CompareB64SpecificPerf - ascendc_api_perf_v2.cpp 中 DataMove 逻辑迁移到 ascendc_api_perf/data_move_api_perf_v2.cpp/.h #### 2.6 perf breakdown 贯穿生成链路 - autofuse/att/base/perf_breakdown.h: 新增 breakdown 数据结构 - ModelInfo: 保存 perf_breakdowns - PipePerfExpr: 从 API perf 输出收集 breakdown,并随变量替换更新表达式 - ArgsManager: 保存、替换和对外提供 breakdown - TilingCodeGenImpl: 在生成 tiling case annotation 时追加 Reduce perf breakdown ### 三、代码修改流程图 #### 3.1 多文件调用关系图 mermaid graph LR A[AscendGraphParser<br/>ConvertNodeInfos] -.-> B[Reduce params builder<br/>FillReduceSpecificParams] B -.-> C[Common params<br/>BuildReduceSpecificParams] C -.-> D[NodeInfo.reduce_specific_params] D -.-> E[ASCIR reduce adapter<br/>BuildReduceContext] E -.-> F[AscendC reduce perf model<br/>ReduceApiPerf] F -.-> G[PerfOutputInfo.pipe_res<br/>AIV_VEC] F -.-> H[PerfBreakdown<br/>semantic items] H -.-> I[PipePerfExpr and ArgsManager<br/>replace symbols] I -.-> J[Tiling code annotations<br/>case explanation] C -.-> K[Common UT<br/>merged shape] F -.-> L[Reduce perf UT<br/>AR RA B64 merge reuse] style B fill:#90EE90,stroke:#006400,stroke-width:2px style C fill:#90EE90,stroke:#006400,stroke-width:2px style E fill:#90EE90,stroke:#006400,stroke-width:2px style F fill:#90EE90,stroke:#006400,stroke-width:2px style H fill:#90EE90,stroke:#006400,stroke-width:2px style D fill:#FFD700,stroke:#B8860B,stroke-width:2px style J fill:#FFD700,stroke:#B8860B,stroke-width:2px #### 3.2 ReduceApiPerf 分支流程图 mermaid flowchart TD S([ReduceApiPerf]) -.-> V[Validate context and dtype] V -.-> L{Logical reduce} L -.-> LG[Build logical reduce cost] L -.-> P{Reduce pattern} P -.-> ARD{AR B64 dtype} P -.-> RAD{RA B64 dtype} ARD -.-> ARB[Build AR B64 cost] ARD -.-> ARN[Build AR normal cost] RAD -.-> RAB[Build RA B64 tree cost] RAD -.-> RAN[Build RA normal tree cost] LG -.-> M{Merge mode} ARB -.-> M ARN -.-> M RAB -.-> M RAN -.-> M M -.-> O[Write AIV_VEC result] M -.-> CP[Add copy merge cost] M -.-> EW[Add elementwise merge cost] CP -.-> B[Append perf breakdown] EW -.-> B O -.-> B B -.-> R([Return ge.SUCCESS]) style S fill:#90EE90,stroke:#006400,stroke-width:2px style ARB fill:#FFD700,stroke:#B8860B,stroke-width:2px style ARN fill:#FFD700,stroke:#B8860B,stroke-width:2px style RAB fill:#FFD700,stroke:#B8860B,stroke-width:2px style RAN fill:#FFD700,stroke:#B8860B,stroke-width:2px style CP fill:#FF69B4,stroke:#C71585,stroke-width:2px style EW fill:#FF69B4,stroke:#C71585,stroke-width:2px ## 变更类型 请选择本次引入的变更类型: - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 暂无。 ## 如何测试 ### 一 测试用例说明 #### 1.1 单元测试 重点覆盖: - CodegenApiParamReduceTest.*: BuildReduceSpecificParams、copy mode、invalid input、rank mismatch - UTestReduceMinMaxApiPerfV2.*: RegBase reduce min/max、AR/RA、B64、symbolic dim、reuse、multi-reduce merge、ASCIR 注册与 fallback - UTestAscirPerfV2.*: 既有 ASCIR V2 perf 路径回归 推荐命令: bash source ~/Ascend/cann/bin/setenv.bash bash scripts/test/run_autofuse_test.sh --ut -j10 已有构建产物时可定向执行: bash build/autofuse/tests/ut/att/att_ut --gtest_filter=UTestReduceMinMaxApiPerfV2.*:CodegenApiParamReduceTest.* #### 1.2 系统测试 重点覆盖: - TestAscendcApiPerf.TestReduceAnyPerf - TestAscendcApiPerf.TestReduceMaxPerf - TestAscendcApiPerf.TestReduceAllPerf - TestAscendcApiPerf.TestReduceMinPerf 这些 ST 用例补齐 output stride,确保 Reduce pattern 可被 parser 正确识别。 推荐命令: bash source ~/Ascend/cann/bin/setenv.bash bash scripts/test/run_autofuse_test.sh --st -j10 #### 1.3 编译验证 bash source ~/Ascend/cann/bin/setenv.bash cd build make aihac_codegen -j10 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 See merge request: cann/graph-autofusion!448 | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 11 天前 | ||
| 9 天前 | ||
| 27 天前 | ||
| 1 个月前 | ||
| 3 个月前 |