已合并
fix: split shared data for matmul vector partition #1430
fix: split shared data for matmul vector partition #1430
已合并
ling-DT创建于 7月23日
ling-DT成员
7月23日

Pull Request

描述

修复 ASCGraph 中同一个 Data 通过多个 Load 同时喂给 MatMul/Cube 与 Vector 后处理时,cube schedule case generator 因 shared input 无法把 MatMul 与 Vector 切成独立图的问题。

本次变更在切图前复制非 Cube/MatMul 侧共享 Data,并在切图后恢复复制 Data 的原始输入名,保持外部输入语义不变。

变更类型

请选择本次引入的变更类型:

关联的Issue

无。

如何测试

描述测试此变更的步骤和前提条件:

  1. source /workspace/lingxing/Ascend0713/ascend-toolkit/set_env.sh && cmake --build build --target aihac_codegen pyautofuse -j 8
  2. tc_af_tf_ks_net_0018 静态/动态 runtime 验证通过,并生成 autofused_mm_mul_*;compare 脚本已跑通并生成 profiling CSV。

核对清单

其他信息

本地未执行 llt。optimize_ut 在当前本地环境因 gmock/gtest 依赖缺失无法运行,待 PR CI 验证。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 ling-DT 的贡献)
Lling-DT成员
7月23日 创建了 pull request,commit 2df21bc4
atomgit-bot
atomgit-bot
7月23日 评论:

变更摘要

本次 PR 修复了 ASCGraph 中同一个 Data 节点通过多个 Load 同时馈入 MatMul/Cube 与 Vector 后处理算子时,CubeFusionCaseGenerator 因共享输入无法将 Cube 与 Vector 切分为独立子图的问题。核心方案是在图切分前检测出被 Cube 和 Vector 两侧共享使用的 Data 节点,为 Vector 侧复制一份独立的 Data 副本并重连对应 Load 的边;图切分后再将副本 Data 的名称恢复为原始名,从而保持外部输入语义不变。

主要改动

  • 新增 SplitSharedDataForCubeAndVector 函数:遍历图中所有 Data 节点,通过 BFS(IsReachableToCube)判断其下游 Load 是否可达 Cube 算子,将不可达 Cube 的 Vector 侧 Load 重连至复制的 Data 副本,实现 Cube 与 Vector 的输入数据分离。
  • 新增 RestoreSplitDataNames 函数:在图切分完成后,将各子图中被复制的 Data 节点名称从 {name}_shared_split_data 恢复为原始 Data 名称,确保外部输入引用不因内部拆分而改变。
  • 新增成员 split_data_names_:在 CubeFusionCaseGenerator 中记录拆分过程中创建的数据副本名与原始名的映射关系,供 GenerateGeneralCase 中填写映射、GeneratorTask 中恢复名称使用。
  • 修改 GenerateGeneralCaseGeneratorTask:在分区前调用 SplitSharedDataForCubeAndVector 完成输入分离,在 PartitionByConnectivity 后调用 RestoreSplitDataNames 恢复数据名称。
  • 新增单元测试 Test_MatMul_Add_Shared_Data_Split:构造 data0 同时供 MatMul(Cube 侧)和 Add/Mul(Vector 侧)共享使用的场景,验证切分后产生两个 task,data0 出现在两个子图中(Cube 图 1 个、Vector 图 1 个),且 Vector 图保留对 data0 的两个 Load 引用。
likedislike
atomgit-bot
atomgit-bot
7月23日 评论:

代码审查

Good — CountLoadsFromData correctly null-checks before use. The issue is confined to CountDataNodeByNameAndIndex. Now let me close out with the summary.

审查总结

各文件审查结果

文件 审查结果
autofuse/v35/optimize/task_generator/cube_schedule_case_generator.h ✅ 无问题 — 仅新增 #include <utility> 和成员变量 split_data_names_,类型正确,与现有代码一致
autofuse/v35/optimize/task_generator/cube_schedule_case_generator.cpp ✅ 无问题 — 新增的 4 个函数(IsReachableToCubeGetUniqueSplitDataNameCopyDataNodeForSharedSplitSplitSharedDataForCubeAndVectorRestoreSplitDataNames)错误处理完备,宏返回值检查正确,BFS 避免了死循环,图修改时通过预捕获节点列表避免了迭代器失效。GE_ASSERT_TRUE/GE_ASSERT_SUCCESS 宏展开为 return ErrorResult() 而非崩溃,错误传播路径完整
autofuse/tests/v35/ut/optimize/test_cube_schedule_case_generator.cpp ⚠️ 1 个 P2 问题 — CountDataNodeByNameAndIndex 空指针解引用

发现统计

  • P0: 0
  • P1: 0
  • P2: 1 — 测试辅助函数 CountDataNodeByNameAndIndexir_attr 空指针解引用风险
  • P3: 0

整体风险评估

低风险。生产代码(.h.cpp)的实现质量良好,算法逻辑正确(BFS 方向、分类条件、边替换、名称恢复),错误处理路径完整。唯一的缺陷位于测试辅助函数中,不影响生产运行时行为,但可能在测试复用或边界场景下导致测试崩溃。

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

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月23日 添加了label:cann-cla/yes
CANN-robotCANN-robot成员
7月23日 添加了label:stat/needs-squash
CANN-robot
CANN-robot成员
7月23日 评论:

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 zhanj, zhang_shengjie, xchu42 (3/2) zhanj (1/1)

💡 Tip:

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

CLA Signature Pass

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

likedislike
CANN-robotCANN-robot成员
7月23日 将yangyongqiang0606,xchu42,zhang_shengjie,depeng1994,wqtshg_wt,peiyang,shengnan666,XuebinYang,sjtulxh,zhanj,zhujingjing,xuyafei,wangxiaotian995设为评审人
CANN-robotCANN-robot成员
7月23日 将yangyongqiang0606,xchu42,zhang_shengjie,depeng1994,wqtshg_wt,peiyang,shengnan666,XuebinYang,sjtulxh,zhanj,zhujingjing,xuyafei,wangxiaotian995设为审查人
ling-DT成员
7月23日 评论:

compile

likedislike
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 3abb89d2728f6045a4e013c83af441285c0338f8] virtual merging success
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [c8986719e3f4411982cfac4ce88b390c][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
PreSmoke_A900_npupool ✅ SUCCESS >>>>>

[2026-07-23 03:50:02]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [81a5fe35cdab4c1abbd47999b8e7ab3a][流水线指导]

任务名称状态日志下载链接
codecheck ❌ FAILED >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_checkpr ✅ SUCCESS
pre_comment ✅ SUCCESS >>>>>
codecheck_codestyle ⚠️ WARNING >>>>>
codecheck_precommit ✅ SUCCESS >>>>>
likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [4594ae47df344574bca93260b7e1ad48][流水线指导]

任务名称状态日志下载链接
UT_Test_Python_superkernel ✅ SUCCESS >>>>>
ST_Test_Python_superkernel ✅ SUCCESS >>>>>
UT_Test_superkernel ✅ SUCCESS >>>>>
UT_Test_autofuse_framework ✅ SUCCESS >>>>>
ST_Test_autofuse_framework ✅ SUCCESS >>>>>
UT_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_e2e ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>

[2026-07-23 04:11:03]    CI执行结束

likedislike
atomgit-bot
atomgit-bot7月23日进行代码检视1
autofuse/tests/v35/ut/optimize/test_cube_schedule_case_generator.cpp
@@ -203,0 +205,4 @@
205+ }
206+ auto ir_attr = node->attr.ir_attr->DownCastTo<af::AscDataIrAttrDef>();
207+ if (ir_attr == nullptr) {
208+ continue;
atomgit-bot
atomgit-bot7月23日评论:

🟡 Medium Priority

CountDataNodeByNameAndIndex 函数(测试辅助函数)的第 206 行,代码直接对 node->attr.ir_attr 调用 ->DownCastTo<>() 而不先检查 ir_attr 是否为 null。

ir_attr 的类型是 std::unique_ptr<AscIrAttrDefBase>(定义于 ascendc_ir_def.h:370),默认初始化为 nullptr。对 null unique_ptr 调用 operator->() 属于未定义行为(通常会导致崩溃)。

虽然当前测试图中所有 Data 节点都通过 dataX.ir_attr.SetIndex(...) 设置了 ir_attr,但该函数作为通用辅助函数可能被复用于其他图场景。函数内部的第 207 行 if (ir_attr == nullptr) 空值检查也表明作者预期了可能为 null 的情况,但空指针解引用已经在第 206 行发生了。

证据链node->attr.ir_attrunique_ptr,可为 null)→ 第 206 行无保护地调用 ->DownCastTo<>() → 若 ir_attr 为空则 UB/崩溃 → 第 207 行的空值检查永远不会被触发。

修复方案:在解引用前先检查 ir_attr 是否为 null。

likedislike
CANN-robotCANN-robot成员
7月23日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-failed
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 459d46b0376295197a7de752ddb42407348eda88] virtual merging success
Lling-DT成员
7月23日 推送  1 个提交:2ce92249-fix: guard null ir attr in shared data test
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 8db3468957c20bf8c0566a180b1cdfc6492e69cf] virtual merging success
ling-DT成员
7月23日 评论:

compile

likedislike
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 10474850f2eaa1e27d3a4e8af6e5e5802a4904e3] virtual merging success
CANN-robotCANN-robot成员
7月23日 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [15e2be2bc90e4baa95770dc2ee9f23a7][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
PreSmoke_A900_npupool ✅ SUCCESS >>>>>

[2026-07-23 04:31:04]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [2a46ee7d167c4148849071adf144f476][流水线指导]

任务名称状态日志下载链接
codecheck ❌ FAILED >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_checkpr ✅ SUCCESS
pre_comment ✅ SUCCESS >>>>>
codecheck_codestyle ⚠️ WARNING >>>>>
codecheck_precommit ✅ SUCCESS >>>>>
likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [f95cebe9028a4954873dcc4182a68a69][流水线指导]

任务名称状态日志下载链接
UT_Test_Python_superkernel ✅ SUCCESS >>>>>
ST_Test_Python_superkernel ✅ SUCCESS >>>>>
UT_Test_superkernel ✅ SUCCESS >>>>>
UT_Test_autofuse_framework ✅ SUCCESS >>>>>
ST_Test_autofuse_framework ✅ SUCCESS >>>>>
UT_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_e2e ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>

[2026-07-23 04:40:59]    CI执行结束

likedislike
CANN-robotCANN-robot成员
7月23日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-failed
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: d149c0d357b3033287d6d9dcd726d7442e502fb1] virtual merging success
Lling-DT成员
7月23日 推送  1 个提交:36c16276-test: reduce shared data split duplication
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 65f1b75004e253e6e328fa336ac1b10c888f5ebc] virtual merging success
ling-DT成员
7月23日 评论:

compile

likedislike
Lling-DT成员
7月23日 update merge request[project id: 8005834, iid: 1430, commit_id: 2d7d229e318ebee66a0dc89d43f39358090b253c] virtual merging success
CANN-robotCANN-robot成员
7月23日 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [400815494ec34ffcbdc2b872076dabdb][流水线指导]

任务名称状态日志下载链接
UT_Test_Python_superkernel ✅ SUCCESS >>>>>
ST_Test_Python_superkernel ✅ SUCCESS >>>>>
UT_Test_superkernel ✅ SUCCESS >>>>>
UT_Test_autofuse_framework ✅ SUCCESS >>>>>
ST_Test_autofuse_framework ✅ SUCCESS >>>>>
UT_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_ascendc_api ✅ SUCCESS >>>>>
ST_Test_autofuse_e2e ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>

[2026-07-23 05:14:35]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [77dd61370c924446ab0c307d13d0f904][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
PreSmoke_A900_npupool ✅ SUCCESS >>>>>

[2026-07-23 05:07:33]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月23日 评论:

流水线任务触发成功
任务链接 [8dd89c07cc0245aeaca7c4ee841c4cd5][流水线指导]

任务名称状态日志下载链接
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_checkpr ✅ SUCCESS
pre_comment ✅ SUCCESS >>>>>
codecheck_codestyle ⚠️ WARNING >>>>>
codecheck_precommit ✅ SUCCESS >>>>>

[2026-07-23 05:07:57]    CI执行结束

likedislike
CANN-robotCANN-robot成员
7月23日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
7月23日 添加了label:ci-pipeline-passed
xchu42
xchu42成员
7月23日 评论:

/lgtm

likedislike
zhang_shengjie成员
7月23日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
7月23日 添加了label:lgtm
Lling-DT成员
7月23日 解决了最后一个问题
zhanj
zhanj成员
7月23日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月23日 添加了label:approved
CANN-robotCANN-robot成员
7月23日 合入了pull request