Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)变更摘要
本 PR 为 ATT NDDMA 新增了一维精确性能模型,替换原有通用 DMA 模型无法区分 dtype、输入/输出 stride 及多核场景的问题。核心实现在 nddma_model.h/nddma_model.cpp 中引入基于 HW_GE_ATT 一维多核系数的精确公式,按 B8/B16/B32/B64 四档接入,并支持静态 shape 与动态 shape 表达式。仅在 raw rank=1 且与默认 Codegen descriptor 语义一致时启用精确模型;rank 2~5、非法 descriptor、不支持的 dtype 以及 kUBFuse 路径均通过 NddmaFallbackReason 记录原因并回退原有模型。公开接口 GenerateModelInfo 保持不变,kUBFuse gate 通过内部 ModelGenerationContext 传递。
主要改动
- 新增
NddmaModelResult/NddmaNormalizedDesc结构与EvaluateNddmaModel一维多核公式:在nddma_model.h/nddma_model.cpp中定义模型契约,内置 B8/B16/B32/B64 四组Nddma1DParams系数,按block_dim分低核/高核两条公式分支,支持动态TernaryOp表达与静态 golden 值计算。 - 新增
NddmaDescriptorInfo传递 descriptor 上下文:在api_perf.h的NodeDetail中增加std::optional<NddmaDescriptorInfo> nddma_descriptor字段,并在api_perf_utils.cpp的GetDMAActualPerf中复制该上下文,确保精确模型可获取原始一维 descriptor。 - kUBFuse gate 内部传递,公开接口不变:在
gen_model_info.cpp中引入ModelGenerationContext结构体(含is_cv_ub_fusion),将GenerateModelInfo重构为通过GenerateSingleModelInfoWithContext和GenerateModelInfoWithContext内部转发,保持对外签名不变;在tuning_space.h的NodeInfo中增加is_cv_ub_fusion字段用于底层判断。 ascir_api_perf_v2.cpp中接入新模型与回退逻辑:新增TryNewNddmaModel函数,依次处理kUBFuse直接回退、BuildNddmaDescriptor构造 descriptor、EvaluateNddmaModel评估;若模型未选中则通过LogNddmaFallback输出稳定回退日志后继续走原有MergeTensorContinuousDims+ 通用 DMA 模型路径。- 全面测试覆盖:新增
test_nddma_model_v2.cpp覆盖四种 dtype 的静态公式 golden 验证、动态表达式验证、非法 rank/stride/dtype/codegen 匹配等回退路径;修改test_ascir_perf_v2.cpp(UT/ST)增加精确模型接入与静态/动态 shape 端到端验证,以及test_codegen_nddma_reg_api_call.cpp增加默认 Codegen 一维 descriptor 映射验证。


代码审查
关闭总结
逐文件审查结果
| 文件 | 审查结果 |
|---|---|
autofuse/att/gen_model_info/api_perf_register/api_perf.h |
无问题 — 新增 NddmaDescriptorInfo 结构体和 std::optional<NddmaDescriptorInfo> 字段,定义清晰,#include <optional> 正确添加 |
autofuse/att/gen_model_info/api_perf_register/utils/api_perf_utils.cpp |
无问题 — 单行拷贝 nddma_descriptor,与其他字段拷贝模式一致 |
autofuse/att/gen_model_info/gen_model_info.cpp |
无问题 — GenerateSingleModelInfoWithContext / GenerateModelInfoWithContext 重构正确,is_cv_ub_fusion 传递链路完整,ProcessAndSetScheduleGroupInfo 中 schedule_result 引用安全 |
autofuse/att/gen_model_info/parser/tuning_space.h |
无问题 — is_cv_ub_fusion 字段默认 false,安全 |
autofuse/tests/v35/st/att/gen_model_info/test_ascir_perf_v2.cpp |
无问题 — ST 测试覆盖静态/动态 shape 场景,断言合理 |
autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_ascir_perf_v2.cpp |
无问题 — UT 覆盖四种 dtype、rank 2-5 fallback、kUBFuse fallback,逻辑完备 |
autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_nddma_model_v2.cpp |
无问题 — 模型层 UT 全面覆盖成功路径、各种 fallback 原因、边界值(overflow、零 stride、负值、重复 axis) |
autofuse/tests/v35/ut/codegen/reg_api_call/test_codegen_nddma_reg_api_call.cpp |
无问题 — Codegen descriptor 映射测试正确验证 1D 张量的默认 descriptor 输出 |
autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp |
1 个 P3 发现 — nddma_descriptor 在半失败路径上提前赋值(见上方 finding) |
autofuse/v35/att/api_perf_register/nddma_model.cpp |
无问题 — 公式实现正确、fallback 分类完整、溢出/边界检查到位 |
autofuse/v35/att/api_perf_register/nddma_model.h |
无问题 — 契约定义清晰,enum/struct 设计合理 |
按优先级统计
- P0: 0
- P1: 0
- P2: 0
- P3: 1(
TryNewNddmaModel中 descriptor 赋值时序)
总体风险评估
低风险。 该 PR 新增的 NDDMA 一维多核精确性能模型实现质量较高:fallback 机制完善(覆盖 rank 不支持、dtype 不支持、stride 非法、schema 不匹配、codegen 不一致、kUBFuse 路径等场景),边界值检查完整(溢出、零值、负值),测试覆盖充分(模型层 UT、接入层 UT、ST、Codegen 映射测试)。唯一的 P3 发现是微小的代码时序问题,不影响运行时正确性。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-cann/graph-autofusion | ✅ 张德鹏, wangxiaotian995, xchu42 (3/2) | ✅ 张德鹏 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
zhang_shengjie, thanks for your pull request. All authors of the commits have signed the CLA. 👍


描述
一、主要解决的问题
1.1 原始 NDDMA 语义在合轴后会丢失
NDDMA 的
repeats / gm_strides / strides / vectorized_axis在MergeTensorContinuousDims之后会被压成更粗的连续维视图,原始 rank、轴序和非连续搬运信息不可逆。1.2 旧 DMA 模型只能描述通用搬运,不能区分 1D 多核的真实代价
现有
GetDmaPerf主要覆盖通用 DMA 与 stride penalty,无法把raw rank = 1场景下input_stride / output_stride / block_dim对搬运性能的影响单独表达出来。1.3 需要把“命中新模型”和“必须回退”的边界说清楚
如果把 rank 2~5、descriptor schema 不一致、dtype 不支持、或者 Codegen 语义不一致的场景混进新模型,就会把结果写偏,影响后续融合决策。
二、修改方案
2.1 先取原始 descriptor,再做规范化,不经过合轴
新模型在
MergeTensorContinuousDims之前读取 NDDMA 原始输入,保存以下信息:repeatsgm_stridesNG基础项stridesNGM是否生效vectorized_axisNormalizeNddmaDescriptor只做合法性检查和统一视图,不改写原始 rank;当前 1D 命中时,raw_rank和effective_rank保持一致。2.2 选择顺序拆成 4 步,命中关系更清楚
no_descriptor/schema_mismatchcodegen_mismatchraw rank是否等于 1rank_unsupported/no_registered_modeldtype_unsupported/stride_invalidis_cv_ub_fusion/kUBFuse路径属于已知不一致场景,命中后直接回退旧模型。2.3 1D 公式采用 HW_GE_ATT 的两段式多核模型
按 dtype size 选择
B8 / B16 / B32 / B64参数表后,先计算:bytes = output_dims[0] * dtype_sizeinput_stride = min(128, input_strides[0])output_stride_gate = max(0, min(1, output_strides[0] - 1))然后构造两个分支:
low_core = bytes / t1 + h1 + NG + NGMhigh_core = bytes / t2 + h2 + (NG + NGM) * rho其中:
NG描述输入侧非连续搬运带来的基础 penaltyNGM只在output_stride > 1时生效rho是高核数分支的修正系数block_dim <= 2时直接取low_core,block_dim > 2时取high_core。如果block_dim是动态表达式,就生成nddma_1d_multicore的TernaryOp。2.4 回退策略只记录一次原因
对
raw rank = 2~5、dtype不支持、stride 非法、schema 不一致或 codegen parity 不成立的场景,都不进入新模型,直接记录 fallback reason 并回退当前 legacyGetDmaPerf。三、代码修改流程图
flowchart TD A[TensorShapeInfo / NodeInfo] --> B[提取 repeats / gm_strides / strides / vectorized_axis] B --> C{descriptor / codegen 校验} C -->|不通过| R[记录 fallback reason] C -->|通过| D{raw rank = 1 ?} D -->|否| R D -->|是| E[选择 dtype 参数表] E --> F[计算 low_core / high_core] F --> G{block_dim 是否可静态判断} G -->|是| H[直接选择对应分支] G -->|否| I[生成 nddma_1d_multicore TernaryOp] H --> J[写入 AIV_MTE2] I --> J R --> K[回退 legacy GetDmaPerf]四、测试结果汇总
176.765 us -> 10.5065 us,加速比16.82xPROFILE_TASK_OK,每个 kernel 8 个样本22/22 PASS,22/22 PROFILE_TASK_OK145 passed,git diff --check PASS4.1 NDDMA 1D 复测明细
NC001-NC019、P0-RD-01、P0-RD-02、P0-RD-03AUTOFUSE_DFX_FLAGS=--disable_lifting=true20/22在±3%内NC008三轮中位数:1.296 us -> 1.319 us,劣化约1.74%NC017三轮中位数:1.742 us -> 1.7615 us,劣化约1.11%3%的 Task Duration 劣化,未观察到 kernel/template 变化五、验证构图
5.1 用例图样
TensorShapeInfo -> NddmaDescriptor -> EvaluateNddmaModel -> NddmaModelResultNddma 单节点 -> rank=1 / rank=2~5 / cv_ub_fusion -> AIV_MTE2 / legacyNddma -> Store/Nddma -> DataCopyNddmaLoad / Store / Nddma单节点图 + transpose / dynamic shapegraph TD M[模型层UT] --> M1[TensorShapeInfo / Descriptor] M1 --> M2[EvaluateNddmaModel] M2 --> M3[NddmaModelResult] A[ATT接入UT] --> A1[Nddma单节点] A1 --> A2[rank=1] A1 --> A3[rank=2到5] A1 --> A4[cv_ub_fusion] A2 --> A5[AIV_MTE2] A3 --> A6[legacy] A4 --> A6 C[Codegen UT] --> C1[Nddma] C1 --> C2[Store] C1 --> C3[DataCopyNddma] S[ATT ST] --> S1[Load / Store / Nddma] S1 --> S2[static shape] S1 --> S3[dynamic shape] S1 --> S4[transpose]变更类型
关联的Issue
如何测试
一、测试用例说明
1.1 单元测试
block_dim、shape、input_stride和output_stride表达式验证。kUBFusefallback 验证。1.2 系统测试
核对清单
其他信息
验证方法
注意事项
提交记录
修改文件清单