| 【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 | 6 天前 |