文件最后提交记录最后更新时间
【feat】: ReduceSum/ReduceMean/ReduceProd支持ATT基于AscendC的源码建模 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !578 merge fix_reduce_perf_model_reduce_sum_mean_prod into develop 【feat】: ReduceSum/ReduceMean/ReduceProd支持ATT基于AscendC的源码建模 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 描述 ### 一、主要解决的问题 #### 1.1 ReduceSum/ReduceMean/ReduceProd 未接入 Reduce 专用建模 原 v35 Reduce API 建模链路只覆盖 ReduceMin/ReduceMax/ReduceAny/ReduceAllSum/Mean/Prod 只有普通 elementwise 入口或近似建模,带 reduce_specific_params 的 ASCIR reduce 节点没有进入 ReduceApiPerf 分支树,因此无法复用 AR/RA、B64、reuse-source、multi-reduce merge 等 Reduce 专用建模逻辑。 #### 1.2 ReduceMean 需要体现 Codegen 的后处理语义 Codegen 中 Mean 语义不是单独的 Reduce 指令,而是 ReduceSum 后追加 Muls。因此性能模型需要按 ReduceSum + Muls 组合建模,并把后处理开销加入 AIV_VEC。 #### 1.3 注册链路不完整 仅注册 REGISTER_EVAL_FUNC_TAG 不足以支持 ApiPerfFactory::Create(),还需要补齐 ApiPerfRegisterV2。原 Mean/Prod/Sum 的 factory 注册存在复用 tag 或字符串拼接错误风险,需要拆分 reduce op 与 alias op 的注册。 ### 二、修改方案 #### 2.1 AscendC Reduce API 层新增 Sum/Prod/Mean 在 reduce_api_perf_v2 中扩展 ReduceLogicalOp: - kSum - kProd 新增 IsMinMaxReduce,让 B64 特化 compare 逻辑只用于 Min/MaxSum/Prod 在 B64 dtype 下走通用 VF group cost,避免错误复用 Eq/Lt/Gt/Select/Duplicate 的 Min/Max 比较代价。 新增建模入口: - ReduceSumPerf: 使用 AddPerfkVcaddkAdd - ReduceProdPerf: 使用 MulPerfkMulkMul - ReduceMeanPerf: 先调用 ReduceSumPerf,再按输出侧有效维度追加 MeanPerfMuls 开销 #### 2.2 ASCIR Reduce API 层新增 reduce 与 fallback 分发 在 ascir_reduce_api_perf_v2 中新增: - ReduceSumApi - ReduceMeanApi - ReduceProdApi - SumApi - MeanApi - ProdApi Sum/Mean/Prod alias 入口按 HasReduceSpecificParams(node) 分发: - 有 reduce_specific_params: 走 Reduce 专用建模 - 无 reduce_specific_params: 回退 elementwise 建模 新增 elementwise fallback: - ElementwiseSumApi -> ascendcperf_v2::SumPerf - ElementwiseMeanApi -> ascendcperf_v2::MeanPerf - ElementwiseProdApi -> ascendcperf_v2::MulPerf #### 2.3 注册 Reduce op 与 alias op 在 ascir_api_perf_v2.cpp 中补齐: - kReduceSum -> ReduceSumApi - kReduceMean -> ReduceMeanApi - kReduceProd -> ReduceProdApi - kSum -> SumApi - kMean -> MeanApi - kProd -> ProdApi 同时修正 factory 注册: - reduce 专用注册使用 kReduceSum/kReduceMean/kReduceProd - alias 注册使用 kSum/kMean/kProd ### 三、代码修改流程图 #### 3.1 多文件调用关系图 ```mermaid graph TD A[ascir_api_perf_v2.cpp<br/>注册 tag 和 factory] B[ascir_reduce_api_perf_v2.cpp<br/>ASCIR reduce 分发] C[reduce_api_perf_v2.cpp<br/>AscendC Reduce 建模] D[reduce_api_perf_v2.h<br/>声明 Sum Mean Prod] E[ascir_reduce_api_perf_v2.h<br/>声明 ASCIR API] F[test_reduce_min_max_api_perf_v2.cpp<br/>UT 覆盖] A -->|kReduceSum kReduceMean kReduceProd| B A -->|kSum kMean kProd alias| B B -->|BuildReduceContext| C B -->|无 reduce params fallback| G[Elementwise Sum Mean Prod] C -->|ReduceSumPerf| H[ReduceApiPerf<br/>AR RA B64 merge 分支] C -->|ReduceProdPerf| H C -->|ReduceMeanPerf| I[ReduceSumPerf + Muls] D --> C E --> B F -->|验证 AscendC API| C F -->|验证 ASCIR 注册和 alias| A style A fill:#FFD700,stroke:#B8860B,stroke-width:2px style B fill:#90EE90,stroke:#006400,stroke-width:2px style C fill:#90EE90,stroke:#006400,stroke-width:2px style F fill:#90EE90,stroke:#006400,stroke-width:2px style I fill:#FF69B4,stroke:#C71585,stroke-width:2px ``` #### 3.2 Reduce API 分支流程图 ```mermaid flowchart TD Start([ASCIR Sum Mean Prod]) --> HasParams{node 有 reduce_specific_params} HasParams -->|否| Elementwise[Elementwise fallback<br/>SumPerf MeanPerf MulPerf] HasParams -->|是| Context[BuildReduceContext<br/>重建 merged dims pattern merge reuse] Context --> Type{API 类型} Type -->|ReduceSum| Sum[ReduceSumPerf<br/>AddPerf + Vcadd] Type -->|ReduceProd| Prod[ReduceProdPerf<br/>MulPerf + Mul] Type -->|ReduceMean| Mean[ReduceMeanPerf] Mean --> MeanStep1[ReduceSumPerf] MeanStep1 --> MeanStep2[追加 MeanPerf Muls 开销] Sum --> ReduceCore[ReduceApiPerf] Prod --> ReduceCore MeanStep2 --> ReduceCoreDone[更新 AIV_VEC 和 breakdown] ReduceCore --> Pattern{Reduce pattern 和 dtype} Pattern -->|AR B64| ARB64[BuildArB64Cost] Pattern -->|AR normal| ARNormal[BuildArNormalCost] Pattern -->|RA B64| RAB64[BuildRaB64Cost] Pattern -->|RA normal| RANormal[BuildRaNormalCost] ARB64 --> Merge{multi reduce merge} ARNormal --> Merge RAB64 --> Merge RANormal --> Merge Merge -->|开启| MergeCost[BuildMergeCost] Merge -->|关闭| Total[reduce_total_perf] MergeCost --> Total style Sum fill:#90EE90,stroke:#006400,stroke-width:2px style Prod fill:#90EE90,stroke:#006400,stroke-width:2px style Mean fill:#90EE90,stroke:#006400,stroke-width:2px style MeanStep2 fill:#FF69B4,stroke:#C71585,stroke-width:2px ``` ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 修改文件 | 文件 | 变更 | 说明 | |---|---:|---| | autofuse/v35/att/api_perf_register/ascendc_api_perf/reduce_api_perf_v2.cpp | +37/-1 | 新增 ReduceSum/Mean/Prod 核心建模 | | autofuse/v35/att/api_perf_register/ascendc_api_perf/reduce_api_perf_v2.h | +3/-0 | 暴露 ReduceSum/Mean/Prod 接口 | | autofuse/v35/att/api_perf_register/ascir_reduce_api_perf_v2.cpp | +72/-0 | 新增 ASCIR reduce/fallback 分发 | | autofuse/v35/att/api_perf_register/ascir_reduce_api_perf_v2.h | +15/-0 | 暴露 ASCIR Sum/Mean/Prod API | | autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp | +17/-7 | 注册 Reduce op 与 alias op | | autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_reduce_min_max_api_perf_v2.cpp | +74/-0 | 新增 UT 覆盖建模和注册 | ## 如何测试 ### 一 测试用例说明 #### 1.1 单元测试 新增 AscendCApiReduceSumProdMeanUseReduceBranches: - 覆盖 ReduceSumPerf 的 AR/RA 分支差异 - 覆盖 ReduceProdPerfReduceSumPerf 公式差异 - 覆盖 ReduceMeanPerf = ReduceSumPerf + MeanPerf(Muls) 的 delta 校验 新增 AscirRegistersReduceSumMeanProdOpsAndAliases: - 校验 kReduceSum/kReduceMean/kReduceProd factory 可创建 - 校验 kSum/kMean/kProd alias 可创建 - 校验 alias 在有 reduce_specific_params 时与 reduce 专用入口公式一致 #### 1.2 系统测试 本 commit 对 ASCIR/AscendC API perf 建模和注册链路生效,不新增独立 ST 用例。 ### 二 验证命令 ```bash bash scripts/test/run_autofuse_test.sh --ascend_install_path=/home/zhangshengjie/Ascend/latest --ascend_3rd_lib_path=/home/zhangshengjie/third_party -u -m att ``` 验证结果: ```text 927 tests from 53 test suites ran. PASSED 927 tests. att_ut test successfully! ``` ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于 commit message 的格式、无效 commit 的合并等 ## 其他信息 ### 注意事项 - ReduceMeanPerf 当前按 Codegen 语义建模为 ReduceSum + Muls。 - B64 下的 Sum/Prod 不走 Min/Max 专用 compare 建模。 - Sum/Mean/Prod alias 保留无 reduce 参数时的 elementwise fallback,避免影响原 elementwise API 行为。 - 仓库内未找到 scripts/validate_mermaid.py,Mermaid 图按 skill 规则手工避免嵌套方括号和特殊字符。 See merge request: cann/graph-autofusion!5783 天前
【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!3011 个月前