已合并
[VFFusion] Plan-time move and conflict update for all fused members #1838
[VFFusion] Plan-time move and conflict update for all fused members #1838
已合并
hujiajun创建于 26 天前
hujiajun成员
26 天前

描述 Description

两阶段改动:
(1) 将冲突存储按来源拆分为四类,引入引用计数和 pivot 消解机制,使冲突可以增量更新而非一次性写入;
(2) 补齐 producer→consumer 融合路径缺失的 op 重排和 group 冲突刷新。

冲突存储拆分(commit 1)

  • 四路拆分:conflictList 拆为 copyConflicts(copy op 屏障,永久)、syncConflicts(sync/scf 屏障,永久)、opConflicts(def-use 中间 op pivot,可消解)、groupConflicts(formed loop 屏障,引用计数)
  • pivot 消解:新增 dissolvePivot(模板实现 dissolvePivotImpl),当中间 op 被融合或 op 加入 formed loop 后,从冲突对中擦除对应的 pivot/group,最后一处原因消除后该冲突对删除
  • 全覆盖:computeConflictLists 的 walk 从仅 non-vec op 扩展到全体 op,使独立的 fusable op 也留下 pivot 记录
  • API 层:addSyncConflict / addCopyConflict / addOpConflict / addGroupConflict 保证双向对称插入
  • updateConflicts :先 dissolvePivot 消解新成员已有 group 冲突,再扫描全体成员(ops() 替代 leafOps(),排除自身)重新注入

Producer 融合路径补齐(commit 2)

  • 重写 consolidateToTail:从仅处理 leaf 的递归 user walk 改为基于 use-def 链的拓扑排序(climbedForwardSlice),支持全体 node 成员,新增 verify 进行支配正确性检查
  • 补齐 addProducer:调用 consolidateToTail() + updateConflicts(op),与 addLeaf 行为对齐

关联特性issue:https://gitcode.com/Ascend/AscendNPU-IR/issues/324

类型 Category

  • Bug修复 Bugfix
  • 新功能 New feature
  • 代码风格更新(格式化,局部变量)Style changes
  • 重构(即不是新增功能,也不是修改bug的代码变动)Refactor
  • 构建过程或辅助工具的变动 Build-related
  • 文档内容更新 Docs

Checklist

  • 我的代码遵循这个项目的代码风格 My code follows the project's code style
  • 我已经自己测试过我的代码 I have self-tested my code
  • 我已经更新了相应的文档 I have updated the relevant documentation
  • 我已经根据需要更新了对应的变更日志 I have updated the changelog as needed
  • 我已经在标题中正确使用了类型标签(例如:feat:, fix:)I have correctly used type labels in the title (e.g., feat:, fix:)
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 hujiajun 的贡献)
Hhujiajun成员
26 天前 创建了 pull request,commit 5bd0c990
atomgit-bot
atomgit-bot
26 天前 评论:

变更摘要

此 PR 对 AutoVectorizeV2(AV2)的融合规划阶段进行了大规模重构:将原先仅覆盖 leaf 节点的 VectorizeContext 替换为面向全体融合成员的 PlanContext / FusedNode 架构。核心变更包括:(1) 新增 FusedNode 类统一管理 leaf 与 producer,其 consolidateToTail 基于 use-def 链拓扑排序取代旧的简单排序,并在排序后加入 IR 合法性验证;(2) conflictsWith / updateConflicts 的作用范围从 leaf 扩展到全体融合成员;(3) 补齐 bestFusedNode 路径中缺失的 consolidateToTail + updateConflicts 调用;(4) 删除 findBestFusedNodeForProducer 中已被 canAccept 覆盖的冗余冲突检查。

主要改动

  • 删除 Context.h,新增 PlanContext.h / RetriedOptions.h 拆分数据结构:原 VectorizeContext(含 maxFusedOpscloneFunccanFitStack 等)被移除,拆分为 RetriedOptions(纯参数结构体)和 PlanContext(持有 FusableOpInfo 映射、冲突列表、FusedNode 实例集合,并负责 initFusableOpInfoFrom 初始化和 computeTileSize)。

  • 新增 FusedNode 类及其核心方法 consolidateToTailFusedNode 同时管理 leafproducers 两个 SetVectorconsolidateToTail 通过 climbedForwardSlice 使用支配信息构建前向切片,实现基于 use-def 链的拓扑排序来重组操作顺序,排序后调用 verify + report_fatal_error 兜底保证 IR 合法性。

  • canAcceptconflictsWith / updateConflicts 扩展到全体融合成员canAccept 通过 AcceptContext 枚举区分 Sibling/Producer/FallbackLeaf 三种调用场景的行为差异;conflictsWith 遍历 ops()(leaf + producers)全体成员检查冲突;updateConflicts 对全体成员的上游/下游可融合操作建立双向冲突关系。

  • 新增 FusionUtils.h/cpp 提取操作分类与图遍历工具:将 isFusableOpisNonVectorizableOpisMemrefLinalgOphasRankReducingIndexingMap 等分类判断,以及 findDownstreamFusableOpOf / findUpstreamFusableOpOf 图遍历逻辑从主 pass 文件中独立为工具模块。

  • AutoVectorizeV2.cpp 大幅精简(净减少约 889 行):主 pass 文件经重构后移除了大量内联工具代码和冗余逻辑,包括 bestFusedNode 路径补齐 consolidateToTail + updateConflicts 调用,以及删除 findBestFusedNodeForProducer 中已被 canAccept 覆盖的重复冲突检查。

likedislike
ascend-robot
ascend-robot成员
26 天前 评论:

libing-pipeline创建中,请等待……

likedislike
atomgit-bot
atomgit-bot
26 天前 评论:

代码审查

审查总结

已逐一审查全部 9 个变更文件,结果如下:

文件 审查结论
bishengir/include/.../FusedNode.h 无独立问题(配合 .cpp 分析)
bishengir/include/.../FusionUtils.h 无独立问题
bishengir/include/.../PlanContext.h 无独立问题
bishengir/include/.../RetriedOptions.h P2:include guard / 注释与文件名不匹配
bishengir/lib/.../FusedNode.cpp P2canAccept off-by-one;P3isMemref() 解引用空 leaf、numLoops==0 越界
bishengir/lib/.../FusionUtils.cpp P1isOpInBlock 对多 block 父 op 判定错误
bishengir/lib/.../PlanContext.cpp P3typeWithLargestRank 默认构造时 shape 为空
bishengir/lib/.../AutoVectorizeV2.cpp 无独立问题
bishengir/lib/.../CMakeLists.txt 无问题(仅新增 3 个 .cpp 源文件)

按优先级统计

  • P1:1 个 — isOpInBlockscf::IfOp 等多 block 父 op 的判定错误,影响冲突分析和图遍历的正确性
  • P2:2 个 — RetriedOptions.h 的 include guard 错配、canAccept 容量检查 off-by-one(允许 maxFusedOps+1
  • P3:3 个 — isMemref() 无 leaf 空检查、numLoops==0 时越界访问、registerAndAnalyzeOp 无 ShapedType 时 shape 为空

整体风险评估:中等

最关键的 P1 问题(isOpInBlock 实现错误)在存在 scf::IfOp 结构的 IR 中会直接导致冲突列表计算错误,进而影响融合决策的正确性。考虑到该 PR 已引入 enableCrossIfFusion 特性,scf::IfOp 场景是实际会触发的路径。建议在合入前优先修复 P1 和 P2 的问题。

类型 数量
🔴 阻塞 1
🟡 建议 2

⛔ 需要修改

likedislike
ascend-robotascend-robot成员
26 天前 添加了label:stat/needs-squash
此处折叠了271条消息 查看更多
ascend-robotascend-robot成员
19 天前 添加了label:approved
NoBBAI成员
19 天前 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
19 天前 添加了label:lgtm
ascend-robotascend-robot成员
19 天前 解决了最后一个问题
ascend-robotascend-robot成员
19 天前 合入了pull request,合并节点 SHA:fc1de1700e958485e2d83203c94521e68c46b3ae