已合并
fix(pass): Preserve assemble fanout during chain fusion #6065
zhangxiangjie创建于 9月8日
fix(pass): Preserve assemble fanout during chain fusion #6065
已合并
zhangxiangjie创建于 9月8日
zhangxiangjie成员
9月8日

问题描述

新 IR 适配后,MergeViewAssemble 在中间张量存在 View/Slice 等旁路消费者时停止 Assemble 链合并。该限制也作用于无 token 依赖的函数,导致历史上可以消除的中间链保留到后续 Pass:

  • 原始 case 0 的 CONTRACT→ASSEMBLE 输出分支未合并,保留冗余输出写入链,触发精度问题。
  • 相关 case 的 Cube 输出前保留中间 Assemble,影响后续内存通路选择,导致 pipemix 检查失败。

修改方案

在保留旁路数据依赖的前提下,恢复无 token 函数中的分支合并能力:

  • 在消费者缓存构建阶段记录函数是否包含输入或输出 token。
  • 对无 token 函数,允许单生产者链和完整的 assemble-like 生产者组继续合并输出分支。
  • 保留旁路消费者需要的中间写入,删除被合并替代的链尾;无旁路时沿用现有清理逻辑。
  • 保留主线的 CONTRACT 支持,以及完整覆盖、版本、作用域和 opcode/RMW 兼容检查;含 token 的函数继续使用现有限制。

补充 Pass 单测,覆盖旁路数据边、生产者输入与偏移映射、token 依赖保留;同步调整 TestIntermediateOutcast 的算子数量预期,保留 outcast 数据依赖断言。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhangxiangjie 的贡献)
Zzhangxiangjie成员
9月8日 创建了 pull request,commit d5c3e2c2
atomgit-bot
atomgit-bot
9月8日 评论:

变更摘要

该 PR 修复了 MergeViewAssemble 优化 pass 在链式融合(chain fusion)过程中丢失 assemble 扇出(fanout)的问题:当中间 tensor 除了主链下游消费者外,还存在其他侧向消费者(如 VIEW 消费者或 token 依赖消费者)时,原先的融合会把中间生产者错误删除,导致数据边(data edge)丢失。改动引入 hasTokenDependencies_ 状态标记,仅在存在 token 依赖的情况下才启用 hasAssembleChainStopper 的链终止/删除语义,并保留侧向消费者所需的中间写操作,同时补充了对应的单元测试。

主要改动

  • 新增 hasTokenDependencies_ 状态标记(merge_view_assemble_utils.h 与 BuildConsumerCache):在 merge_view_assemble_utils.h 中新增成员 hasTokenDependencies_,并在 BuildConsumerCache 开头重置、在遍历操作时通过 operation.tokens_ 与 operation.result_token_ 置位,用于记录函数内是否存在 token 依赖。

  • 按 token 依赖门控链终止语义:BuildProducerGroupFusion、MergeAssembleChain、ProcessAssembleConsumers 中原本直接以 consumers.hasAssembleChainStopper 判断链是否终止/是否可融合,改为仅在 hasTokenDependencies_ 为真时才生效,避免无 token 场景下因 stopper 误判而阻断融合。

  • 保留侧向消费者所需的生产者:AppendProducerGroupFusions 中仅当生产者消费者的 hasAssembleChainStopper 为假时才 SetAsDeleted;ProcessAssembleChainEnd 中新增 hasSideConsumer 判断,当链中存在被链终止者消费的中间操作时,保留这些中间写操作(仅删除链尾),确保 VIEW 等侧向消费者的数据边不被破坏。

  • 新增/完善单元测试(test_merge_view_assemble.cpp):新增 ProducerGroupWithIntermediateViewConsumerKeepsDataEdge(覆盖带/不带 token 两种场景)与 AssembleChainWithIntermediateTokenConsumerKeepsDataEdge,并强化 AssembleChainWithIntermediateViewConsumerKeepsDataEdge 断言,验证中间 VIEW 消费者保留、生产者不删除、token 依赖(GetVarDependency 中 HasProducer/HasConsumer)保持正确。

likedislike
不准确?
atomgit-bot
atomgit-bot
9月8日 评论:

代码审查

✅ 未发现问题

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

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.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
framework/src/passes ✅ congqiannan, zhangyuebing (2/2) ✅ zhangyuebing (1/1)
repo-cann/pypto ✅ zhangyuebing, congqiannan (2/2) ✅ zhangyuebing (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

zhangxiangjie, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robot
CANN-robot成员
9月8日 评论:

CLA Signature Pass

zhangxiangjie, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
9月8日 将xinweiliu,cam_bxh,dai-zhentao,lululu40888,shi-dingkun,gguuaanngg,codehjp423,gaoxiang618,wangzheng97,DCGDDD,syfeng,jason_yuan_ye,foundea,ym-HW,hw_zhangzhiqi,yinjie27_,congqiannan,zhangyuebing,tsungl4,gaoxingwang,zhiweiyuan,caodongdong,make_pto,zhoubotcam,linjiashu,wangbing110,WenboCodes设为评审人
CANN-robotCANN-robot成员
9月8日 将xinweiliu,cam_bxh,dai-zhentao,lululu40888,shi-dingkun,gguuaanngg,codehjp423,gaoxiang618,wangzheng97,DCGDDD,syfeng,jason_yuan_ye,foundea,ym-HW,hw_zhangzhiqi,yinjie27_,congqiannan,zhangyuebing,tsungl4,gaoxingwang,zhiweiyuan,caodongdong,make_pto,zhoubotcam,linjiashu,wangbing110,WenboCodes设为审查人
Zzhangxiangjie成员
9月8日 关联了issue:[Task|任务跟踪]: 修复 create_new_logical_tensor 场景下的调度与 A5 数据通路问题
zhangxiangjie成员
9月8日 评论:

/compile

likedislike
Zzhangxiangjie成员
9月8日 预合并成功(commit_id: b8a7c71cbfcf592e17362a01e0db3eeebce07663)
CANN-robot
CANN-robot成员
9月8日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月8日 添加了label:ci-pipeline-running
此处折叠了7条事件消息 查看更多
CANN-robotCANN-robot成员
9月8日 添加了label:cann-cla/yes
zhangxiangjie成员
9月8日 评论:

/compile

likedislike
Zzhangxiangjie成员
9月8日 预合并成功(commit_id: bb4a198bdbd8e0f02904d82eff9747a3446d8619)
CANN-robot
CANN-robot成员
9月8日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月8日 删除了label:ci-pipeline-failed
此处折叠了7条事件消息 查看更多
CANN-robotCANN-robot成员
9月9日 删除了label:ci-pipeline-passedstat/needs-squash
CANN-robot
CANN-robot成员
9月9日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci-pipeline-passed, stat/needs-squash.

likedislike
CANN-robotCANN-robot成员
9月9日 添加了label:cann-cla/yes
zhangxiangjie成员
9月9日 评论:

/compile

likedislike
Zzhangxiangjie成员
9月9日 预合并成功(commit_id: c91f53b51b27d66df6683205f93bb62c61891400)
CANN-robot
CANN-robot成员
9月9日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月9日 添加了label:ci-pipeline-running
Zzhangxiangjie成员
9月9日 修改标题为 “fix(pass): Preserve assemble fanout during chain fusion”,原标题为“fix(pass): preserve assemble fanout during chain fusion”
Zzhangxiangjie成员
9月9日 修改了pull request 的描述
Zzhangxiangjie成员
9月9日 修改了pull request 的描述
CANN-robotCANN-robot成员
9月9日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月9日 添加了label:ci-pipeline-passed
zhangyuebing成员
9月10日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
9月10日 添加了label:approved
zhangyuebing成员
9月10日 评论:

✅ 已将本 PR 下你提交的未解决检视意见标记为已解决(无未解决的检视意见)。

likedislike
congqiannan成员
9月10日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
9月10日 添加了label:lgtm
CANN-robotCANN-robot成员
9月10日 合入了pull request