已合并
feat: add precise NDDMA 1D performance model #1690
feat: add precise NDDMA 1D performance model #1690
已合并
zhang_shengjie创建于 8月10日
zhang_shengjie成员
8月10日

描述

一、主要解决的问题

1.1 原始 NDDMA 语义在合轴后会丢失

NDDMA 的 repeats / gm_strides / strides / vectorized_axisMergeTensorContinuousDims 之后会被压成更粗的连续维视图,原始 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 原始输入,保存以下信息:

字段 含义 作用
repeats 原始输出维度 计算 raw rank 和搬运字节数
gm_strides 输入侧 stride 进入 NG 基础项
strides 输出侧 stride 决定 NGM 是否生效
vectorized_axis Codegen 轴序 作为 parity gate 的一部分

NormalizeNddmaDescriptor 只做合法性检查和统一视图,不改写原始 rank;当前 1D 命中时,raw_rankeffective_rank 保持一致。

2.2 选择顺序拆成 4 步,命中关系更清楚

步骤 检查项 通过后 不通过后
1 descriptor 是否完整 继续 记录 no_descriptor / schema_mismatch
2 轴序是否与 Codegen 语义一致 继续 记录 codegen_mismatch
3 raw rank 是否等于 1 继续 记录 rank_unsupported / no_registered_model
4 dtype / stride / block_dim 是否可建模 计算 1D 公式 记录 dtype_unsupported / stride_invalid

is_cv_ub_fusion / kUBFuse 路径属于已知不一致场景,命中后直接回退旧模型。

2.3 1D 公式采用 HW_GE_ATT 的两段式多核模型

按 dtype size 选择 B8 / B16 / B32 / B64 参数表后,先计算:

  • bytes = output_dims[0] * dtype_size
  • input_stride = min(128, input_strides[0])
  • output_stride_gate = max(0, min(1, output_strides[0] - 1))

然后构造两个分支:

  • low_core = bytes / t1 + h1 + NG + NGM
  • high_core = bytes / t2 + h2 + (NG + NGM) * rho

其中:

  • NG 描述输入侧非连续搬运带来的基础 penalty
  • NGM 只在 output_stride > 1 时生效
  • rho 是高核数分支的修正系数

block_dim <= 2 时直接取 low_coreblock_dim > 2 时取 high_core。如果 block_dim 是动态表达式,就生成 nddma_1d_multicoreTernaryOp

2.4 回退策略只记录一次原因

raw rank = 2~5dtype 不支持、stride 非法、schema 不一致或 codegen parity 不成立的场景,都不进入新模型,直接记录 fallback reason 并回退当前 legacy GetDmaPerf

三、代码修改流程图

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]

四、测试结果汇总

场景 用例 PGO 结果 关键结论
Torch Task Duration NC019 关闭 PASS 176.765 us -> 10.5065 us,加速比 16.82x
TensorFlow profiling NC019 关闭 PASS PROFILE_TASK_OK,每个 kernel 8 个样本
NDDMA 1D 影响范围复测 22 个用例 关闭 PASS 22/22 PASS22/22 PROFILE_TASK_OK
UT profiling / benchmark / report / backend - PASS 145 passedgit diff --check PASS

4.1 NDDMA 1D 复测明细

  • 范围:NC001-NC019P0-RD-01P0-RD-02P0-RD-03
  • AUTOFUSE_DFX_FLAGS=--disable_lifting=true
  • 首轮结果:20/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 用例图样

用例组 构图 验证点
模型层 UT TensorShapeInfo -> NddmaDescriptor -> EvaluateNddmaModel -> NddmaModelResult raw rank、stride、dtype、fallback reason
ATT 接入 UT Nddma 单节点 -> rank=1 / rank=2~5 / cv_ub_fusion -> AIV_MTE2 / legacy 命中新模型、回退分支、日志
Codegen UT Nddma -> Store / Nddma -> DataCopyNddma 默认 descriptor 映射、1D/3D/7D 代码生成
ATT ST Load / Store / Nddma 单节点图 + transpose / dynamic shape 静态 / 动态 shape 与 stride 重排
graph 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

  • #285(RFC:Nddma 性能建模统一方案)

如何测试

一、测试用例说明

1.1 单元测试

  • 四种 dtype size 的静态公式 golden 验证。
  • 动态 block_dim、shape、input_strideoutput_stride 表达式验证。
  • 非法 rank、向量长度、stride、dtype 和 kUBFuse fallback 验证。
  • 默认 Codegen 一维 descriptor 映射验证。

1.2 系统测试

  • ATT 静态和动态 NDDMA 性能表达式验证。
  • legacy rank 2~5 回退兼容性验证。

核对清单

其他信息

验证方法

  • pre-commit、clang-format、codespell、OAT:通过。
  • 原工作区验证记录:ATT UT 1025/1025、ATT ST 1/1、Codegen NDDMA 4/4 通过。
  • 基于最新 master 的本地 ATT UT:因本机 Ascend runtime 头文件和动态库缺失,在 CMake 配置阶段失败,未进入源码编译;由 PR compile 流水线继续验证。

注意事项

  • 本 PR 不包含 docs 目录改动。
  • 当前仅启用 raw rank=1 精确模型,rank 2~5 保持 legacy fallback。
  • 未命中新模型时会打印 fallback reason,方便排查为什么没有进入精确模型。

提交记录

Commit 描述 修改文件数
ef9ebd9e feat: add precise NDDMA 1D performance model 11

修改文件清单

文件路径 修改类型 说明
autofuse/att/gen_model_info/api_perf_register/api_perf.h 修改 增加可选 NDDMA descriptor
autofuse/att/gen_model_info/api_perf_register/utils/api_perf_utils.cpp 修改 复制 descriptor 上下文
autofuse/att/gen_model_info/gen_model_info.cpp 修改 传递 kUBFuse 模型上下文
autofuse/att/gen_model_info/parser/tuning_space.h 修改 保存 kUBFuse gate
autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 修改 接入新模型和 fallback
autofuse/v35/att/api_perf_register/nddma_model.h 新增 定义模型契约
autofuse/v35/att/api_perf_register/nddma_model.cpp 新增 实现一维多核公式
autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_nddma_model_v2.cpp 新增 模型层 UT
autofuse/tests/v35/ut/att/gen_model_info/api_perf_register/test_ascir_perf_v2.cpp 修改 ATT 接入 UT
autofuse/tests/v35/st/att/gen_model_info/test_ascir_perf_v2.cpp 修改 ATT 静态和动态 ST
autofuse/tests/v35/ut/codegen/reg_api_call/ test_codegen_nddma_reg_api_call.cpp 修改 Codegen descriptor 映射 UT
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)
Zzhang_shengjie成员
8月10日 创建了 pull request,commit c563a7dd
atomgit-bot
atomgit-bot
8月10日 评论:

变更摘要

本 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.hNodeDetail 中增加 std::optional<NddmaDescriptorInfo> nddma_descriptor 字段,并在 api_perf_utils.cppGetDMAActualPerf 中复制该上下文,确保精确模型可获取原始一维 descriptor。
  • kUBFuse gate 内部传递,公开接口不变:在 gen_model_info.cpp 中引入 ModelGenerationContext 结构体(含 is_cv_ub_fusion),将 GenerateModelInfo 重构为通过 GenerateSingleModelInfoWithContextGenerateModelInfoWithContext 内部转发,保持对外签名不变;在 tuning_space.hNodeInfo 中增加 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 映射验证。
likedislike
不准确?
atomgit-bot
atomgit-bot
8月10日 评论:

代码审查

关闭总结

逐文件审查结果

文件 审查结果
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 传递链路完整,ProcessAndSetScheduleGroupInfoschedule_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

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月10日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月10日 评论:

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 /approve or /lgtm
  • Commenting /approve implies 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. 👍

likedislike
此处折叠了112条消息 查看更多
CANN-robotCANN-robot成员
8月14日 添加了label:approved
CANN-robotCANN-robot成员
8月14日 合入了pull request
Zzhang_shengjie成员
27 天前 关联了issue:RFC:Nddma 性能建模统一方案
CANN-robotCANN-robot成员
27 天前 删除了label:ci-pipeline-passed
Zzhang_shengjie成员
27 天前 修改了pull request 的描述