| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
【PR】feat: sync develop to master 20260708 Co-authored-by: j18351891940<jiangrun3@hisilicon.com> Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1235 merge develop into master 【PR】feat: sync develop to master 20260708 Created-by: zhanj Commit-by: xingzhixiong;j18351891940 Merged-by: cann-robot Description: # Pull Request ## 描述 【PR】feat: sync develop to master 20260708 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 2. ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1235 | 2 个月前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
【PR】feat: broadcast backward Co-authored-by: czways<chengzhiwei5@huawei.com> # message auto-generated for no-merge-commit merge: !2059 merge revert-mr-2023-1789107028331-auto into develop 【PR】feat: broadcast backward Created-by: czways Commit-by: czways Merged-by: cann-robot Description: # Pull Request broadcast backward ## 描述 请清晰准确地描述本次 Pull Request 的意图和变更内容。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 2. ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 # BroadcastBackwardPass:GE 侧与 graph-autofusion PR 侧对比分析 ## 简介 ### 目的 本文档对比 GE 仓库与 graph-autofusion PR #2059 中 broadcast_backward_pass 的实现差异与相同之处,为代码审查、后续维护和跨仓库同步提供参考。 > **版本说明**:PR #2059(head 0ae756e6)是 BroadcastBackwardPass 落地 graph-autofusion 的**最终完整版实现**,覆盖早期的 PR #1830 及后续修复(IndirectLoad 下游防护、pass 注册顺序调整、UT/ST 测试框架)。本文所有 PR 侧行号均以 PR #2059 为准。 ### 范围 - **GE 侧**:ge_0728/compiler/graph/optimize/autofuse/autofuse/post_process/pass/broadcast_backward_pass.cpp(1515 行)。该文件已从 ge_0728 工作树删除(git status 显示 D,pass 调用在 asc_graph_pass.cpp:21 处注释停用),本文 GE 侧行号基于删除前最后一个完整版本(commit 97f8a3246)。 - **PR 侧(PR #2059)**: - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_pass.cpp(1477 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_pass.h(24 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_shared_split.cpp(388 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_shared_split.h(20 行) - graph-autofusion/autofuse/optimize/platform/v1/pass_runner_v1.h + v35/optimize/pass_runner_v2.h(pass 注册顺序调整) - 测试框架:tests/framework/broadcast_backward/(broadcast_backward_test_utils.h 99 行 + broadcast_backward_ut_utils.h 378 行)、UT tests/ut/optimize/test_broadcast_backward_pass.cpp(1955 行,73 个用例)、ST tests/st/optimize/test_broadcast_backward_pass.cpp(132 行,8 个用例) - 仅覆盖 Broadcast 后移 pass 本身及其注册,不含 optimize.cpp 重构、frontend_shape_vars 移除等 PR 中的其他变更。 ## 总体概述 PR 侧本质上是 GE 侧的**移植 + 增强**: 1. 去掉 asc_adapt:: 适配层,直接使用 af::GraphUtils、af::NodeUtils、ScheduleUtils:: 原生接口。 2. 移除 topo id 管理(约 190 行),改为 pass 入口和结尾统一 TopologicalSorting。 3. 新增 broadcast_backward_shared_split 预处理模块(388 行)。 4. 重写 GetBroAxisFromNode 轴匹配逻辑,支持 axis 不对齐和隐式广播维度。 5. CheckBackwardCommon 新增控制边、IndirectLoadBoundary、RemovePad 三个屏障。 6. MoveBroadcastAfterMerge 支持多后继。 7. CollectBroNodes 新增控制边检查,ProcessOriginalBackwardLogic 新增起点去重。 8. **(最终版新增)IndirectLoad 下游防护**:ChainReachesIndirectLoad 全下游可达性 DFS + HasMultipleInputsBroadcastBehind 兄弟 broadcast 检测,在两个改写入口整体拒绝到达 IndirectLoad 的链路。 9. **(最终版新增)pass 注册顺序**:BroadcastBackwardPass 注册进 V1/V2 两个 pass runner,CSE 类 pass(DuplicateElewiseCse、SameSourceBroadcastCse)调整到其之前执行。 10. **(最终版新增)独立测试框架**:graph builder 工具 + 73 个 UT 用例 + 8 个 ST 用例。 ## 差异分析 ### 一、架构层差异(适配层不同) | 维度 | GE 侧 | PR 侧 | |------|-------|-------| | 命名空间 | namespace ge | namespace optimize | | 图操作封装 | 全部通过 asc_adapt:: 适配层(GetPeerInNodes、GetPeerOutNode、IsSingleInAndOutNode、GetOutputTensorAttr、CreateBroadcastNode 等 20+ 函数) | 直接使用 af::GraphUtils、af::NodeUtils、ScheduleUtils:: 原生接口,无中间层 | | 节点类型 | ge::NodePtr 直接使用 | af::NodePtr 基类指针,需 ToAscNode() 向下转型 std::dynamic_pointer_cast<AscNode> | | 类型常量 | kTransposeType、kBroadcastType 等全局宏 | Transpose::Type、Broadcast::Type 等类静态成员 | | 数据类型 | DataType(GE 命名空间) | af::DataType | | 接口入口 | Run(ComputeGraphPtr) → asc_adapt::ProcessAscBackendNodes 遍历 | RunPass(AscGraph &) 直接操作(broadcast_backward_pass.cpp:1471) | **原因分析**: - **命名空间**:graph-autofusion 是独立组件,不属于 GE 命名空间,使用自己的 optimize 命名空间隔离代码。 - **图操作封装**:GE 侧 AscGraph 是 GE ComputeGraph 的子图,节点操作需通过 asc_adapt:: 适配层桥接两种图模型;graph-autofusion 中 AscGraph 是原生图结构,直接调用 af::GraphUtils 即可,无需中间层。 - **节点类型**:GE 侧节点类型统一在 ge::Node 下;graph-autofusion 中 af::NodePtr 是基类指针,AscNode 是携带 tensor attr 的派生类,需 dynamic_pointer_cast 转型后才能访问 outputs[i].attr 等扩展字段。 - **类型常量**:graph-autofusion 使用 ASCIR op 定义体系,类型常量绑定在 op 类上(如 Broadcast::Type),比全局宏更符合面向对象设计且避免命名冲突。 - **接口入口**:GE 侧 pass 注册在 ComputeGraph 层级,需通过 ProcessAscBackendNodes 遍历找到 AscBackend 子图再执行;graph-autofusion 的 pass runner 直接在 AscGraph 层级注册和调用,无需遍历。 ### 二、PR 侧新增功能(GE 侧没有) #### 1. broadcast_backward_shared_split 模块(388 行,全新) PR 侧在 BroadcastBackward 入口最先调用: cpp GE_ASSERT_SUCCESS(broadcast_backward_shared_split::SplitSharedBroadcastBranches(graph)); GE_ASSERT_SUCCESS(broadcast_backward_shared_split::SplitSharedBroadcastConsumers(graph)); 功能:在执行后移前,先**克隆拆分**共享同一条 Broadcast 链的多分支/多消费者场景,避免改写时边冲突。GE 侧无此预处理步骤,直接在原图上改写。 **原因分析**: graph-autofusion 的图结构中,一条 Broadcast 链的输出可能同时被多个分支或多个消费者引用。如果不先拆分,后移时 ReorderBroadcasts 需要断开 Broadcast 输出边,但该边连接了多个消费者,无法同时断开所有边,会导致改写失败或图结构损坏。通过预处理阶段克隆 Broadcast 链,使每个分支/消费者拥有独立的 Broadcast 副本,后续后移可以独立操作每条链。GE 侧可能这类共享场景较少,或通过其他 pass 在更早阶段已经拆分。 **根本原因:GE 融合反推机制不可移植到 AF** GE 的 Broadcast 处理与子图融合深度绑定,采用 **"消除 → 融合 → 恢复"** 三段式流程: GE: UpdateBroadcastInfoToLoad(消除Brc,写入Load) → MergeAscGraphByLoop(融合两个子图) → OptimizedFallback(从Load读出,按消费者重建Brc) - **融合前**(UpdateBroadcastBeforeMerge):沿 Load → Broadcast 路径,把广播轴信息"折叠"进 Load 输出属性(repeats[i]=1, strides[i]=0),然后删除 Brc 节点。目的是让不同子图在融合前统一布局。 - **融合**(MergeAscGraphByLoop):按循环轴合并两个 AscGraph。 - **融合后**(OptimizedFallback):遍历融合后图中每个计算节点的每个输入,从 Load 属性和图级 AscGraphAttr 倒推 broadcast_info,按消费者实际需求重新插入 Brc。 OptimizedFallback 的核心是 **从消费者需求倒推**(bottom-up):对每个消费者输入,比较消费者所需布局 vs Load 当前布局,差异轴即为 broadcast_info,若非空则在消费者输入前新建 Brc。一个共享源有多个消费者时,每个消费者独立判断需要哪些广播轴,只插需要的轴,不产生冗余: 原始: P → B{A,B} → C0(需要轴A) P → B{A,B} → C1(需要轴B) GE 重建:P → B0{A} → C0 P → B1{B} → C1 GE 这一机制依赖大量 GE 特有结构: | GE 反推机制 | 依赖的 GE 特有结构 | |-------------|---------------------| | UpdateBroadcastInfoToLoad | AscBackendSubGraphFusionDecider、MergeAscGraphByLoop、NodeFuseInfo、ViewOpAttrInfo | | TuningSubgraphBeforeMerge | 融合决策器、AscGraphAxisMapping | | OptimizedFallbackPro | 融合后 AscGraphAttr、AutoFuseAttrs、FusedAscBackend 节点、ProcessAscBackendNodes | 这些结构在 AF 中均不存在。AF 不走子图融合路径,直接在单个 AscGraph 上做图优化和 codegen。因此 GE 的融合反推机制 **不可移植到 AF**。 当前 GE 侧的 BroadcastBackwardPass 已被注释停用(asc_graph_pass.cpp:21)且源文件已从 ge_0728 工作树删除,AF PR #2059 是在 AF 侧重新实现,替代 GE 侧旧实现。broadcast_backward_shared_split 正是为了弥补 GE 融合反推机制缺失后的共享链场景处理:GE 通过融合后 OptimizedFallback 按消费者需求精确重建 Brc,AF 无法走这条路径,只能在融合前先把共享 Brc 链拆分为独立副本,再逐条执行后移。 #### 2. CheckBackwardCommon 新增三个屏障 PR 侧 broadcast_backward_pass.cpp:484-509: cpp if (!HasNoControlEdges(next_node)) { return false; } // 控制边屏障 L485-487 if (next_node->GetType() == kStoreType) { return false; } if (IsIndirectLoadBoundary(next_node)) { return false; } // IndirectLoad 边界屏障(增强)L493-495 if (ScheduleUtils::IsRemovePad(next_node)) { return false; } if (IsNextViewOp(next_node)) { return false; } if (IsDtypeNotSupportOp(next_node, output_dtype)) { return false; } 注意:最终版 CheckBackwardCommon 签名为 bool CheckBackwardCommon(const NodePtr &next_node),output_dtype 在函数内部声明,不再通过参数外传。 GE 侧(L308-325)只检查 Store、ViewOp、DtypeNotSupport 三种,无控制边和 IndirectLoad/RemovePad 屏障。PR 侧额外屏蔽以下三类: | 屏障 | PR 实现 | 说明 | |------|---------|------| | HasNoControlEdges | L485-487 | 节点存在控制边时不后移,避免控制依赖被破坏 | | IsIndirectLoadBoundary | L493-495(实现 L146-162) | 不仅检查 next_node 本身是 IndirectLoad,还检查 next_node 的输出是否喂给 IndirectLoad(遍历所有输出锚点的 peer in 节点) | | IsRemovePad | L496-498 | padding 逆操作边界 | **原因分析**: - **控制边屏障**:graph-autofusion 的 AscGraph 允许计算节点之间存在控制依赖边。Broadcast 后移会断开并重连数据边,如果节点同时有控制边,后移后控制依赖的语义可能不再成立。GE 侧的 asc_adapt:: 适配层在 IsSingleInAndOutNode 中隐含了控制边检查(GE 的 AscGraph 不允许控制边出现在 Brc 链中),PR 侧显式检查更清晰。 - **IndirectLoad 边界(增强)**:IsIndirectLoadBoundary(L146-162)不仅判断 next_node 自身是否为 IndirectLoad,还遍历 next_node 的所有输出锚点,检查是否有 peer in 节点是 IndirectLoad。注释说明:"直接喂给 IndirectLoad 的 compute 同样不能后移,否则 broadcast 会紧贴 IL"。IndirectLoad 的输出轴属于独立的物理视图(通过索引间接加载,轴语义与普通 Load 不同),Broadcast 后移跨过此边界会破坏轴对应关系。GE 侧不存在此算子类型。 - **RemovePad**:该算子涉及 padding 的逆操作,Broadcast 后移跨过此边界会导致 padding 区域的广播语义不一致。GE 侧不存在此算子类型。 这三个屏障是 graph-autofusion 特有图结构和算子语义决定的,不是通用优化,无法回传 GE 侧。 #### 3. MoveBroadcastAfterMerge 支持多后继 | | GE 侧 L1089-1108 | PR 侧 L1045-1064 | |---|---|---| | merge 后继 | 只处理 at(0) 单个后继 | 复制 GetPeerInDataAnchors() 全部后继,逐个断开、逐个重连 | PR 侧支持 merge_node 输出连接到多个下游节点,GE 侧只处理单后继。 **原因分析**: graph-autofusion 的图结构允许 merge 节点(如 Add)输出后继续 fork 到多个下游分支(fork-join-fork 模式),这在融合图中较常见。GE 侧假设 merge 后只有单后继,这在 GE 的图结构中成立(GE 的融合图通常在 merge 后接 Store)。如果 merge 有多个后继,GE 侧只重连第一个后继会导致其他后继丢失数据边,造成图改写不等价。 **根因定位:GE 侧 MoveBroadcastAfterMerge 的 Bug** PR 侧支持多后继的直接原因是修复了从 GE 移植时发现的 MoveBroadcastAfterMerge Bug。以下是根因分析: **图结构**: Load_0 → Broadcast_0 ─┬→ Abs_0 → Cast_0 ──┐ └→ Cast_1 → Relu_0 ──┤→ Add_0(merge) ─┬→ Sigmoid_0 → Store_0 └→ Sqrt_0 → Store_1 **触发路径**: 1. **多引用后移触发**:CollectCandidateMultiRefNodes(L897)选中 Broadcast_0(单输出锚点、2 个消费者、类型是 Broadcast)。 2. **分支汇聚判定通过**:CheckAllBranchesCanBackward(L978)从 Abs0 和 Cast1 分别 trace,两条分支都在 Add0 处汇聚(Add0 是多输入→merge),first_merge_node == current_merge_node == Add_0 → 返回 true。 3. **执行后移**:BackwardMultiRefBroadcast(L1066)调用 MoveBroadcastAfterMerge(L1045)。 **Bug**:GE 侧 MoveBroadcastAfterMerge 只处理了 merge 的第一个消费者: cpp // GE broadcast_backward_pass.cpp:1094 auto merge_next_in_anchor = merge_out_anchor->GetPeerInDataAnchors().at(0); // 只取 Sigmoid_0 GE_ASSERT_GRAPH_SUCCESS(GraphUtils::RemoveEdge(merge_out_anchor, merge_next_in_anchor)); // Add_0 → Broadcast_0 → Sigmoid_0 ✓ // Add_0 → Sqrt_0(仍然直连) ✗ 没有被处理 Add_0 有两个消费者 Sigmoid_0 和 Sqrt_0,但 GetPeerInDataAnchors().at(0) 只取了第一个(Sigmoid_0)。Sqrt0 仍然直接连在 Add0 上。 4. **属性更新导致不一致**:UpdateComputeNodesAscTensorAttr(L706)把 Add_0 的输出 attr 更新为 Load0 的 attr(z1 维 repeat=1,广播前)。Sqrt0 的输入继承 Add0 的新输出 attr(repeat=1),但 Sqrt0 的输出 attr 仍保持原来的 repeat=18 → codegen 校验失败: ``` Node Sqrt: input tensor 0 vectoriz See merge request: cann/graph-autofusion!2059 | 18 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
【PR】feat: broadcast backward Co-authored-by: czways<chengzhiwei5@huawei.com> # message auto-generated for no-merge-commit merge: !2059 merge revert-mr-2023-1789107028331-auto into develop 【PR】feat: broadcast backward Created-by: czways Commit-by: czways Merged-by: cann-robot Description: # Pull Request broadcast backward ## 描述 请清晰准确地描述本次 Pull Request 的意图和变更内容。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 2. ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 # BroadcastBackwardPass:GE 侧与 graph-autofusion PR 侧对比分析 ## 简介 ### 目的 本文档对比 GE 仓库与 graph-autofusion PR #2059 中 broadcast_backward_pass 的实现差异与相同之处,为代码审查、后续维护和跨仓库同步提供参考。 > **版本说明**:PR #2059(head 0ae756e6)是 BroadcastBackwardPass 落地 graph-autofusion 的**最终完整版实现**,覆盖早期的 PR #1830 及后续修复(IndirectLoad 下游防护、pass 注册顺序调整、UT/ST 测试框架)。本文所有 PR 侧行号均以 PR #2059 为准。 ### 范围 - **GE 侧**:ge_0728/compiler/graph/optimize/autofuse/autofuse/post_process/pass/broadcast_backward_pass.cpp(1515 行)。该文件已从 ge_0728 工作树删除(git status 显示 D,pass 调用在 asc_graph_pass.cpp:21 处注释停用),本文 GE 侧行号基于删除前最后一个完整版本(commit 97f8a3246)。 - **PR 侧(PR #2059)**: - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_pass.cpp(1477 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_pass.h(24 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_shared_split.cpp(388 行) - graph-autofusion/autofuse/optimize/graph_pass/broadcast_backward_shared_split.h(20 行) - graph-autofusion/autofuse/optimize/platform/v1/pass_runner_v1.h + v35/optimize/pass_runner_v2.h(pass 注册顺序调整) - 测试框架:tests/framework/broadcast_backward/(broadcast_backward_test_utils.h 99 行 + broadcast_backward_ut_utils.h 378 行)、UT tests/ut/optimize/test_broadcast_backward_pass.cpp(1955 行,73 个用例)、ST tests/st/optimize/test_broadcast_backward_pass.cpp(132 行,8 个用例) - 仅覆盖 Broadcast 后移 pass 本身及其注册,不含 optimize.cpp 重构、frontend_shape_vars 移除等 PR 中的其他变更。 ## 总体概述 PR 侧本质上是 GE 侧的**移植 + 增强**: 1. 去掉 asc_adapt:: 适配层,直接使用 af::GraphUtils、af::NodeUtils、ScheduleUtils:: 原生接口。 2. 移除 topo id 管理(约 190 行),改为 pass 入口和结尾统一 TopologicalSorting。 3. 新增 broadcast_backward_shared_split 预处理模块(388 行)。 4. 重写 GetBroAxisFromNode 轴匹配逻辑,支持 axis 不对齐和隐式广播维度。 5. CheckBackwardCommon 新增控制边、IndirectLoadBoundary、RemovePad 三个屏障。 6. MoveBroadcastAfterMerge 支持多后继。 7. CollectBroNodes 新增控制边检查,ProcessOriginalBackwardLogic 新增起点去重。 8. **(最终版新增)IndirectLoad 下游防护**:ChainReachesIndirectLoad 全下游可达性 DFS + HasMultipleInputsBroadcastBehind 兄弟 broadcast 检测,在两个改写入口整体拒绝到达 IndirectLoad 的链路。 9. **(最终版新增)pass 注册顺序**:BroadcastBackwardPass 注册进 V1/V2 两个 pass runner,CSE 类 pass(DuplicateElewiseCse、SameSourceBroadcastCse)调整到其之前执行。 10. **(最终版新增)独立测试框架**:graph builder 工具 + 73 个 UT 用例 + 8 个 ST 用例。 ## 差异分析 ### 一、架构层差异(适配层不同) | 维度 | GE 侧 | PR 侧 | |------|-------|-------| | 命名空间 | namespace ge | namespace optimize | | 图操作封装 | 全部通过 asc_adapt:: 适配层(GetPeerInNodes、GetPeerOutNode、IsSingleInAndOutNode、GetOutputTensorAttr、CreateBroadcastNode 等 20+ 函数) | 直接使用 af::GraphUtils、af::NodeUtils、ScheduleUtils:: 原生接口,无中间层 | | 节点类型 | ge::NodePtr 直接使用 | af::NodePtr 基类指针,需 ToAscNode() 向下转型 std::dynamic_pointer_cast<AscNode> | | 类型常量 | kTransposeType、kBroadcastType 等全局宏 | Transpose::Type、Broadcast::Type 等类静态成员 | | 数据类型 | DataType(GE 命名空间) | af::DataType | | 接口入口 | Run(ComputeGraphPtr) → asc_adapt::ProcessAscBackendNodes 遍历 | RunPass(AscGraph &) 直接操作(broadcast_backward_pass.cpp:1471) | **原因分析**: - **命名空间**:graph-autofusion 是独立组件,不属于 GE 命名空间,使用自己的 optimize 命名空间隔离代码。 - **图操作封装**:GE 侧 AscGraph 是 GE ComputeGraph 的子图,节点操作需通过 asc_adapt:: 适配层桥接两种图模型;graph-autofusion 中 AscGraph 是原生图结构,直接调用 af::GraphUtils 即可,无需中间层。 - **节点类型**:GE 侧节点类型统一在 ge::Node 下;graph-autofusion 中 af::NodePtr 是基类指针,AscNode 是携带 tensor attr 的派生类,需 dynamic_pointer_cast 转型后才能访问 outputs[i].attr 等扩展字段。 - **类型常量**:graph-autofusion 使用 ASCIR op 定义体系,类型常量绑定在 op 类上(如 Broadcast::Type),比全局宏更符合面向对象设计且避免命名冲突。 - **接口入口**:GE 侧 pass 注册在 ComputeGraph 层级,需通过 ProcessAscBackendNodes 遍历找到 AscBackend 子图再执行;graph-autofusion 的 pass runner 直接在 AscGraph 层级注册和调用,无需遍历。 ### 二、PR 侧新增功能(GE 侧没有) #### 1. broadcast_backward_shared_split 模块(388 行,全新) PR 侧在 BroadcastBackward 入口最先调用: cpp GE_ASSERT_SUCCESS(broadcast_backward_shared_split::SplitSharedBroadcastBranches(graph)); GE_ASSERT_SUCCESS(broadcast_backward_shared_split::SplitSharedBroadcastConsumers(graph)); 功能:在执行后移前,先**克隆拆分**共享同一条 Broadcast 链的多分支/多消费者场景,避免改写时边冲突。GE 侧无此预处理步骤,直接在原图上改写。 **原因分析**: graph-autofusion 的图结构中,一条 Broadcast 链的输出可能同时被多个分支或多个消费者引用。如果不先拆分,后移时 ReorderBroadcasts 需要断开 Broadcast 输出边,但该边连接了多个消费者,无法同时断开所有边,会导致改写失败或图结构损坏。通过预处理阶段克隆 Broadcast 链,使每个分支/消费者拥有独立的 Broadcast 副本,后续后移可以独立操作每条链。GE 侧可能这类共享场景较少,或通过其他 pass 在更早阶段已经拆分。 **根本原因:GE 融合反推机制不可移植到 AF** GE 的 Broadcast 处理与子图融合深度绑定,采用 **"消除 → 融合 → 恢复"** 三段式流程: GE: UpdateBroadcastInfoToLoad(消除Brc,写入Load) → MergeAscGraphByLoop(融合两个子图) → OptimizedFallback(从Load读出,按消费者重建Brc) - **融合前**(UpdateBroadcastBeforeMerge):沿 Load → Broadcast 路径,把广播轴信息"折叠"进 Load 输出属性(repeats[i]=1, strides[i]=0),然后删除 Brc 节点。目的是让不同子图在融合前统一布局。 - **融合**(MergeAscGraphByLoop):按循环轴合并两个 AscGraph。 - **融合后**(OptimizedFallback):遍历融合后图中每个计算节点的每个输入,从 Load 属性和图级 AscGraphAttr 倒推 broadcast_info,按消费者实际需求重新插入 Brc。 OptimizedFallback 的核心是 **从消费者需求倒推**(bottom-up):对每个消费者输入,比较消费者所需布局 vs Load 当前布局,差异轴即为 broadcast_info,若非空则在消费者输入前新建 Brc。一个共享源有多个消费者时,每个消费者独立判断需要哪些广播轴,只插需要的轴,不产生冗余: 原始: P → B{A,B} → C0(需要轴A) P → B{A,B} → C1(需要轴B) GE 重建:P → B0{A} → C0 P → B1{B} → C1 GE 这一机制依赖大量 GE 特有结构: | GE 反推机制 | 依赖的 GE 特有结构 | |-------------|---------------------| | UpdateBroadcastInfoToLoad | AscBackendSubGraphFusionDecider、MergeAscGraphByLoop、NodeFuseInfo、ViewOpAttrInfo | | TuningSubgraphBeforeMerge | 融合决策器、AscGraphAxisMapping | | OptimizedFallbackPro | 融合后 AscGraphAttr、AutoFuseAttrs、FusedAscBackend 节点、ProcessAscBackendNodes | 这些结构在 AF 中均不存在。AF 不走子图融合路径,直接在单个 AscGraph 上做图优化和 codegen。因此 GE 的融合反推机制 **不可移植到 AF**。 当前 GE 侧的 BroadcastBackwardPass 已被注释停用(asc_graph_pass.cpp:21)且源文件已从 ge_0728 工作树删除,AF PR #2059 是在 AF 侧重新实现,替代 GE 侧旧实现。broadcast_backward_shared_split 正是为了弥补 GE 融合反推机制缺失后的共享链场景处理:GE 通过融合后 OptimizedFallback 按消费者需求精确重建 Brc,AF 无法走这条路径,只能在融合前先把共享 Brc 链拆分为独立副本,再逐条执行后移。 #### 2. CheckBackwardCommon 新增三个屏障 PR 侧 broadcast_backward_pass.cpp:484-509: cpp if (!HasNoControlEdges(next_node)) { return false; } // 控制边屏障 L485-487 if (next_node->GetType() == kStoreType) { return false; } if (IsIndirectLoadBoundary(next_node)) { return false; } // IndirectLoad 边界屏障(增强)L493-495 if (ScheduleUtils::IsRemovePad(next_node)) { return false; } if (IsNextViewOp(next_node)) { return false; } if (IsDtypeNotSupportOp(next_node, output_dtype)) { return false; } 注意:最终版 CheckBackwardCommon 签名为 bool CheckBackwardCommon(const NodePtr &next_node),output_dtype 在函数内部声明,不再通过参数外传。 GE 侧(L308-325)只检查 Store、ViewOp、DtypeNotSupport 三种,无控制边和 IndirectLoad/RemovePad 屏障。PR 侧额外屏蔽以下三类: | 屏障 | PR 实现 | 说明 | |------|---------|------| | HasNoControlEdges | L485-487 | 节点存在控制边时不后移,避免控制依赖被破坏 | | IsIndirectLoadBoundary | L493-495(实现 L146-162) | 不仅检查 next_node 本身是 IndirectLoad,还检查 next_node 的输出是否喂给 IndirectLoad(遍历所有输出锚点的 peer in 节点) | | IsRemovePad | L496-498 | padding 逆操作边界 | **原因分析**: - **控制边屏障**:graph-autofusion 的 AscGraph 允许计算节点之间存在控制依赖边。Broadcast 后移会断开并重连数据边,如果节点同时有控制边,后移后控制依赖的语义可能不再成立。GE 侧的 asc_adapt:: 适配层在 IsSingleInAndOutNode 中隐含了控制边检查(GE 的 AscGraph 不允许控制边出现在 Brc 链中),PR 侧显式检查更清晰。 - **IndirectLoad 边界(增强)**:IsIndirectLoadBoundary(L146-162)不仅判断 next_node 自身是否为 IndirectLoad,还遍历 next_node 的所有输出锚点,检查是否有 peer in 节点是 IndirectLoad。注释说明:"直接喂给 IndirectLoad 的 compute 同样不能后移,否则 broadcast 会紧贴 IL"。IndirectLoad 的输出轴属于独立的物理视图(通过索引间接加载,轴语义与普通 Load 不同),Broadcast 后移跨过此边界会破坏轴对应关系。GE 侧不存在此算子类型。 - **RemovePad**:该算子涉及 padding 的逆操作,Broadcast 后移跨过此边界会导致 padding 区域的广播语义不一致。GE 侧不存在此算子类型。 这三个屏障是 graph-autofusion 特有图结构和算子语义决定的,不是通用优化,无法回传 GE 侧。 #### 3. MoveBroadcastAfterMerge 支持多后继 | | GE 侧 L1089-1108 | PR 侧 L1045-1064 | |---|---|---| | merge 后继 | 只处理 at(0) 单个后继 | 复制 GetPeerInDataAnchors() 全部后继,逐个断开、逐个重连 | PR 侧支持 merge_node 输出连接到多个下游节点,GE 侧只处理单后继。 **原因分析**: graph-autofusion 的图结构允许 merge 节点(如 Add)输出后继续 fork 到多个下游分支(fork-join-fork 模式),这在融合图中较常见。GE 侧假设 merge 后只有单后继,这在 GE 的图结构中成立(GE 的融合图通常在 merge 后接 Store)。如果 merge 有多个后继,GE 侧只重连第一个后继会导致其他后继丢失数据边,造成图改写不等价。 **根因定位:GE 侧 MoveBroadcastAfterMerge 的 Bug** PR 侧支持多后继的直接原因是修复了从 GE 移植时发现的 MoveBroadcastAfterMerge Bug。以下是根因分析: **图结构**: Load_0 → Broadcast_0 ─┬→ Abs_0 → Cast_0 ──┐ └→ Cast_1 → Relu_0 ──┤→ Add_0(merge) ─┬→ Sigmoid_0 → Store_0 └→ Sqrt_0 → Store_1 **触发路径**: 1. **多引用后移触发**:CollectCandidateMultiRefNodes(L897)选中 Broadcast_0(单输出锚点、2 个消费者、类型是 Broadcast)。 2. **分支汇聚判定通过**:CheckAllBranchesCanBackward(L978)从 Abs0 和 Cast1 分别 trace,两条分支都在 Add0 处汇聚(Add0 是多输入→merge),first_merge_node == current_merge_node == Add_0 → 返回 true。 3. **执行后移**:BackwardMultiRefBroadcast(L1066)调用 MoveBroadcastAfterMerge(L1045)。 **Bug**:GE 侧 MoveBroadcastAfterMerge 只处理了 merge 的第一个消费者: cpp // GE broadcast_backward_pass.cpp:1094 auto merge_next_in_anchor = merge_out_anchor->GetPeerInDataAnchors().at(0); // 只取 Sigmoid_0 GE_ASSERT_GRAPH_SUCCESS(GraphUtils::RemoveEdge(merge_out_anchor, merge_next_in_anchor)); // Add_0 → Broadcast_0 → Sigmoid_0 ✓ // Add_0 → Sqrt_0(仍然直连) ✗ 没有被处理 Add_0 有两个消费者 Sigmoid_0 和 Sqrt_0,但 GetPeerInDataAnchors().at(0) 只取了第一个(Sigmoid_0)。Sqrt0 仍然直接连在 Add0 上。 4. **属性更新导致不一致**:UpdateComputeNodesAscTensorAttr(L706)把 Add_0 的输出 attr 更新为 Load0 的 attr(z1 维 repeat=1,广播前)。Sqrt0 的输入继承 Add0 的新输出 attr(repeat=1),但 Sqrt0 的输出 attr 仍保持原来的 repeat=18 → codegen 校验失败: ``` Node Sqrt: input tensor 0 vectoriz See merge request: cann/graph-autofusion!2059 | 18 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1790 merge develop_transpose_one_set_axis into develop 【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 给ascgraph新增图级schedInfo,同时提供对外的getter/setter接口,为后续将node级schedInfo收编成图级schedInfo做铺垫。 当前新增图级接口之后,在schedule的入口处先将图级的schedInfo下发给node级schedInfo,保持内部逻辑先不动,等后续node级schedInfo全部收编完成后再一把切换。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. inductor+af流程,前端保持老流程不动,所有inductor+af用例和网络均不受影响,验证兼容性 2. inductor+af流程,前端将设置node级sched.axis接口改为直接设置图级sched.axis接口,所有inductor+af用例和网络仍不受影响,验证新接口无问题 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1790 | 27 天前 | |
fix: 保留后端不支持的浮点 Cast 路径(#247) Co-authored-by: zqmin<zengqingmin2@huawei.com> # message auto-generated for no-merge-commit merge: !1762 merge fix/validate-cast-bypass into develop fix: 保留后端不支持的浮点 Cast 路径(#247) Created-by: zqmin Commit-by: zqmin Merged-by: cann-robot Description: # Pull Request ## 描述 重构 ImprovePrecision 连续 Cast 链处理逻辑,解决逐节点删除 Cast 时因图连接变更导致的级联错误和不支持 dtype 转换被错误折叠的问题。 核心改动: - 将 Cast 处理从逐节点 CastNodeProc 改为两阶段 ProcessCastChains:先统一收集线性链并做 DP 最小保留路径规划,再对保留的 Cast 执行精度后处理。 - DP 使用 CanCollapseCast 判断每条 dtype 转换边是否被后端支持,identity 转换成本为 0,真实转换成本为 1,确保不保留冗余 identity Cast。 - 不重新创建 Cast 节点,只调用 DelNode 删除不需要的原始 Cast 并重连上下游。 - 移除 ShouldDeleteCastNode,保留原有 IsFloatToUltraLowNeedInsertCast 和 ShouldChangeDataType 后处理逻辑。 检视修复: - MarkRetainedCastNodes 回溯循环增加越界保护,避免后续修改 DP 时引入死循环。 - ProcessCastChains 对 GetPeerOutNode 失败做容错,孤立节点不再中断整个 pass。 - CollectLinearCastChain 去除冗余的线性检查条件。 - 移除 ProcessCastNodePrecision 前置声明,按调用顺序重排函数定义。 测试改进: - 修正 UT Fp32ToFp16CastBeforeStore 为真实的 FP32 到 FP16 场景(原测试名与实际 dtype 不一致)。 - 新增 UT NonFloatSourceCastChain_FallbackDeletesIdentity 覆盖 fallback 路径。 - 抽取 UT/ST 重复 helper 到 improve_precision_test_utils.h,消除 codecheck 重复代码告警。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 关联 #247:ImprovePrecision 保留后端不支持的浮点 Cast 中间路径。 ## 如何测试 1. cmake --build build-cast-fix --target optimize_ut optimize_st -j 8 2. ./build-cast-fix/autofuse/tests/ut/optimize/optimize_ut --gtest_filter='TestImprovePrecisionUT.*',4 个用例通过。 3. ./build-cast-fix/autofuse/tests/st/optimize/optimize_st --gtest_filter='TestImprovePrecisionST.*',25 个用例通过。 4. pre-commit 和 OAT 检查全部通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 涉及文件:improve_precision.cpp、improve_precision_test_utils.h、test_improve_precision.cpp(UT/ST) - DP 保证 source < target 约束使回溯严格递减,不会产生环 - 非线性链、非浮点链、分支链保留原有单节点处理逻辑 See merge request: cann/graph-autofusion!1762 | 1 个月前 | |
【fix】: 解决同级多for循环变量未定义问题 Co-authored-by: wang-yan-male<wangyan220@huawei.com> # message auto-generated for no-merge-commit merge: !2018 merge develop into develop 【fix】: 解决同级多for循环变量未定义问题 Created-by: WangYanMale Commit-by: wang-yan-male Merged-by: cann-robot Description: # Pull Request ## 描述 解决同级多for循环变量未定义问题 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 构造两个reduce水平融合的场景 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!2018 | 19 天前 | |
feat: 支持AA..R Reduce全载模板 Co-authored-by: weishitoken<huangqianqian15@huawei.com> # message auto-generated for no-merge-commit merge: !1525 merge feat/reduce-aaar-fullload into develop feat: 支持AA..R Reduce全载模板 Created-by: wei_shi Commit-by: weishitoken Merged-by: cann-robot Description: # Pull Request ## 描述 支持 Reduce AA...AR 尾轴 reduce 场景生成 AllLoad 模板,同时保留原有 AR/ARA 全载模板判断。新增对应 task generator 和 autoschedule UT,并在不适用 FullLoadReduceFuse 时输出 debug 日志。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. cmake --build build --target optimize_ut -j 8 2. ./build/autofuse/tests/ut/optimize/optimize_ut --gtest_filter="ReduceScheduleCaseGeneratorTest.*" 3. ./build/autofuse/tests/ut/optimize/optimize_ut --gtest_filter="AutoSchedulerReduceUT.Autoschedule_reduce_aaar_fullload_axesgroup" ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次未修改文档;核对清单中的文档项表示已确认无需更新文档。 See merge request: cann/graph-autofusion!1525 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 3 个月前 | ||
| 18 天前 | ||
| 3 个月前 | ||
| 18 天前 | ||
| 3 个月前 | ||
| 27 天前 | ||
| 1 个月前 | ||
| 19 天前 | ||
| 1 个月前 |