| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: add precise NDDMA 1D performance model Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1690 merge feat/nddma-1d-precise-model into develop feat: add precise NDDMA 1D performance model Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 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 原始输入,保存以下信息: | 字段 | 含义 | 作用 | |------|------|------| | repeats | 原始输出维度 | 计算 raw rank 和搬运字节数 | | gm_strides | 输入侧 stride | 进入 NG 基础项 | | strides | 输出侧 stride | 决定 NGM 是否生效 | | vectorized_axis | Codegen 轴序 | 作为 parity gate 的一部分 | NormalizeNddmaDescriptor 只做合法性检查和统一视图,不改写原始 rank;当前 1D 命中时,raw_rank 和 effective_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_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 并回退当前 legacy GetDmaPerf。 ### 三、代码修改流程图 mermaid 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 PASS,22/22 PROFILE_TASK_OK | | UT | profiling / benchmark / report / backend | - | PASS | 145 passed,git diff --check PASS | #### 4.1 NDDMA 1D 复测明细 - 范围:NC001-NC019、P0-RD-01、P0-RD-02、P0-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 重排 | mermaid 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] ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无。 ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - 四种 dtype size 的静态公式 golden 验证。 - 动态 block_dim、shape、input_stride 和 output_stride 表达式验证。 - 非法 rank、向量长度、stride、dtype 和 kUBFuse fallback 验证。 - 默认 Codegen 一维 descriptor 映射验证。 #### 1.2 系统测试 - ATT 静态和动态 NDDMA 性能表达式验证。 - legacy rank 2~5 回退兼容性验证。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 - 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 | See merge request: cann/graph-autofusion!1690 | 1 个月前 | |
fix: 修复IndirectLoad SIMT post-Reduce广播侧输入寻址越界并精简IL用例集 Co-authored-by: xiebangrui<xiebangrui@huawei.com> # message auto-generated for no-merge-commit merge: !2209 merge IL into develop fix: 修复IndirectLoad SIMT post-Reduce广播侧输入寻址越界并精简IL用例集 Created-by: xiebangrui2025 Commit-by: xiebangrui Merged-by: cann-robot Description: ## 描述 修复 IndirectLoad SIMT 模板在 post-Reduce 场景下广播视图侧输入的寻址越界缺陷,并按分层看护策略精简 IL E2E 用例集。 **缺陷根因**:SIMT lowering metadata 中 output 侧 GM load 的 use_logical_offset 此前被 has_post_reduce 整体关闭(indirect_load_utils.cpp),导致含 post-IL Reduce 的图内非稠密广播视图侧输入退化为 raw output_index 寻址。对广播侧输入(如 [8,2048,1]/[2048,1,0])按稠密索引读取会越界数倍至数千倍,表现为模拟器 SIGSEGV、板上 AIC error。 **修复**:output 侧 GM load 恒定按物理视图做坐标折叠(dense 快路径、零偏移、kIndexOffset 三类分支的生成代码与值等价性均保持不变,由既有 UT 与 E2E 全集回归验证)。该字段对 index 侧 load 仍有 mixed_index_views 真实语义,保持不动。 **用例集收敛(88 → 56)**: - 删除 dtype 覆盖/大 shape/简单拓扑冗余 30 个(看护点已由等价用例或 UT 覆盖) - 下沉至既有 UT 已有等价断言的 4 个(StaticPowerOfTwo policy、ARA fallback 调度候选等) - 7 个巨型用户图用例缩形状(layernorm 839MB→1MB、graph_hint 表 135 万行→512 行等,拓扑与失败模式不变,运行时间约 100s→2s 量级) - CMake 注册目标与 run_autofuse_test.sh 线上清单逐一对齐(56=56) - 有意识放弃:bf16/uint32 在 IL gather 的运行时、超大 shape 多轮地址压力、StructuredMagic/post8/post10 融合后缀发射的独立运行时用例(后者如需可后续补 UT) ## 变更类型 - [x] 🐛 Bug 修复 - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) ## 关联的Issue 无 ## 如何测试 1. cmake --build build --target <indirect_load_*_e2e_v2 目标集> -j 20 2. ctest --test-dir build/autofuse/tests -L st -L build_backend_test2 -R "indirect_load.*" 3. UT:build/autofuse/tests/ut/test_main --gtest_filter="IndirectLoad*" ## 测试结果 - 新增回归用例 indirect_load_user_position_bias_exp_sum(1:1 复刻用户上报图,含两个不同广播模式侧输入 + post-IL Sum,缩至 8×256×256):修复前模拟器 SIGSEGV + 16384 点精度断言全失败;修复后 PASSED - 新增 codegen UT GenerateSimtPostReduceMapsBroadcastLoadToColumn:post-Reduce 广播侧输入必须折叠坐标(修复前红,修复后绿) - 回退修复专项验证:UT 文本断言失败 + E2E SIGSEGV 复现,恢复修复后全绿(红→绿双向闭环) - 优化后全集:56 个 IL E2E(codegen + 模拟器运行 + 精度断言)100% 通过;26 个 IL codegen UT 全绿 - optimize_ut 存在 2 个段错误,经无修改对照确认为存量问题,与本次变更无关 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 修复代码仅 1 处(indirect_load_utils.cpp,output load metadata 恒启用逻辑偏移);其余为测试用例新增/精简与清单同步。 See merge request: cann/graph-autofusion!2209 | 15 小时前 | |
【feat】: SIMT Cast 支持 int64 到 bf16 类型转换 Co-authored-by: w00607005<wangdingjun2@huawei.com> # message auto-generated for no-merge-commit merge: !2202 merge dev into develop 【feat】: SIMT Cast 支持 int64 到 bf16 类型转换 Created-by: wangdingjun Commit-by: w00607005 Merged-by: cann-robot Description: # Pull Request ## 描述 - ASCIR Cast 注册类型对 kCastTypePairs 与 SIMT codegen 支持列表新增 {DT_INT64, DT_BF16} - int64 到 bf16 无直接转换,codegen 统一生成经 float 中转的两段式 static_cast - 设备端 CastExtend 的 b64CastWithTransfer 增加 <bfloat16_t, int64_t> 组合 - ATT 性能建模 IsB64TransferCast 同步识别 int64->bf16,保持公式与 codegen 对齐 - 新增 UT 用例 Cast_Test_Int64_BFloat16 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.构造触发int64->bf16类型转换,观察日志是否执行成功。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!2202 | 15 小时前 | |
【feat】: 新增ascir:Rand/Randn Co-authored-by: 李玥玮<liyuewei1@huawei.com> # message auto-generated for no-merge-commit merge: !1749 merge 0_local into develop 【feat】: 新增ascir:Rand/Randn Created-by: liyuewei Commit-by: 李玥玮 Merged-by: cann-robot Description: # Pull Request ## 描述 主要改动 新增 Rand/Randn 算子常量与注册: 在 att_const_values.h 中新增 kRand、kRandn 常量,并在 pyascir.h 的算子宏列表中加入 OP(Rand)、OP(Randn),使两个算子进入统一的算子枚举体系。 新增算子实现与类型约束: 在 ascir_builtin_ops_v2.cpp 中注册 Rand(支持 DT_FLOAT)与 Randn(支持 DT_UINT32、DT_INT32),同时在 v2_ascir_att_impl.h 中定义对应的 Att 实现类。 新增 Codegen 与性能注册实现: 在 v2_ascir_codegen_impl.h 中新增 RandAscIrCodegenImplV2、RandnAscIrCodegenImplV2(二者 API 名均为 Rand,加载 random_reg_base.h),并在 ascir_api_perf_v2.cpp 中以 kUnitVector 为单位注册性能信息。 新增 Python 前端接口: 在 ascir_api.py 中新增 Rand、Randn 函数,负责创建对应算子、设置 dtype、axis、size、stride 并返回输出节点。 新增底层随机数封装与测试: 新增 random.h,封装 AscendC::PhiloxRandom<10> 并以固定 philoxKey/philoxCounter 实现 Rand;同时注册 random_reg_base.h 字符串,并新增 test_codegen_rand_reg_api_call.cpp 覆盖 Rand/Randn 的 API 名称、头文件加载及 dtype 支持。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1749 | 1 个月前 |