Pull Request已成功合入, 合并人@CANN-robot
(感谢 朱珉 的贡献)变更摘要
本 PR 恢复被回退的 Gather 后置 Norm 复合区域融合能力,并叠加行级广播与视图一致性修复。核心是在候选图生成阶段引入 NormInfo/NormStage 元数据与 norm_utils,把 Gather(IndirectLoad)后置的 Reduce→Broadcast→Elementwise 链识别为轴保持复合区域;同时新增 simt_boundary_sync 在调度全部 split 完成后统一对齐 SIMT 边界节点视图,并通过 SoftmaxPatternFusionUtils、SimtLoadMetadata 行级广播标记、padded 视图强制 strided 降级等机制修复生产暴露的 rank mismatch 与 vectorized_axis 不一致问题。
主要改动
- 新增 Norm 复合区域元数据与工具:新增
norm_utils.h/.cpp,定义NormInfo(kSoftmaxDedicated/kGenericComposite两种 kind)、NormStage及SetNormInfo/TryGetNormInfo/HasNormInfo,将区域入口/出口、成员节点、各 Reduce→Broadcast 组合与保持轴集合附着在IndirectLoad节点上随图传递。 - 新增 SIMT 边界视图同步:新增
simt_boundary_sync.h/.cpp的SyncSimtBoundaryViews,对 SIMT 角色节点按实际 (outer, inner) split 逐层同步 tensor view,并将失效旧轴经 merge 链重映射到 inner 轴;schedule.cpp在DoScheduler末尾调用,且在模板 merge 后立即把失效vectorized_axis替换为 merged 轴。 - 行级广播 side-input 兜底:
SimtLoadMetadata增加original_view与is_row_broadcast字段,schedule_result.h新增SetRowBroadcastLoad/IsRowBroadcastLoad标记;reg_indirect_load_api_call.cpp在 rank mismatch 断言前按IsDenseEquivalentView、退化视图、稠密尾段取模与output_index / 尾轴宽去尾维寻址逐级兜底。 - Softmax 模式识别抽取与复用:将原
softmax_pattern_fusion_pass.cpp中的匹配/替换逻辑抽取为softmax_pattern_fusion_utils.h/.cpp,新增MatchStableStructure/MatchStableDedicated/MatchStable与NormalizeDirectPostSoftmax,支持沿多输入 Elementwise 链回溯至IndirectLoad输出并在候选图副本内替换为专用Softmax节点。 - SIMD padded 视图强制 strided 降级:
FinalizeLoweringMetadata与GenerateSimd通过比较向量化跨度与逻辑元素积判定输出视图被 pad,强制SimdFallback::kStrided,避免 dense facade 线性写出与 padded 布局冲突。
其他配套调整:autoschedule.cpp 新增 IsAxisStreamingOnAnyOutput 循环轴豁免与可求解 tile 预建 case,node_cache_marker.cpp 恢复参数 Load 缓存起点,codegen_kernel_loop.cpp 增加固定间接寻址参数判定,indirect_load_utils.cpp 调整 post-reduce 链查找与 tpipe tensor 收集豁免,并补充 test_norm_utils、test_simt_boundary_sync、test_softmax_pattern_fusion_utils、IL_USER_SOFTMAX 端到端用例及多个 UT/ST 断言更新。


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 |
|---|---|---|
| repo-cann/graph-autofusion | ✅ yangyongqiang0606, xchu42, xuyafei (3/2) | ✅ yangyongqiang0606 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
JaydenChu, thanks for your pull request. All authors of the commits have signed the CLA. 👍


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


/lgtm


/approve


描述
在 IndirectLoad 候选生成链路中支持 Gather 后置 Norm 复合区域(Softmax / LayerNorm 等多个 Reduce + Broadcast + Elementwise 组合)的识别、校验与调度接入,打通 Softmax 专用/通用双路径分流;同时适配 SIMT body 内行级广播 side-input 的坐标重建。
问题场景
含
IndirectLoad的图后接 Norm 类计算时,现有 Gather+Reduce 候选链存在四类问题:SoftmaxApiCall::Generate固定把最后一个向量化轴当作 R,且专用 Softmax 节点保持完整输入输出形状;普通 Reduce 的 stride 推导对它推不出归约轴,导致候选在布局校验阶段被淘汰。CollectOutputBoundaries遇到第二个 Reduce 时触发图级断言,LayerNorm 均值/方差双分支形态直接编译失败。[8,2048,1]/strides=[2048,1,0],每行读一个向量沿尾轴广播)经调度期视图 split 改写后 rank 失配且尺寸符号化,坐标重建断言失败。问题原因
RewrittenGraphAnalysis::post_reduce为单 Reduce 假设,无法表达多统计 Reduce 区域ReducePartitionCaseGenerator的 AllLoad 流程,遇IndirectLoad提前返回修改方案
复合区域识别与调度:
norm_utils:NormInfo/NormStage元数据,基于节点 ExtAttr 随候选图复制传递softmax_pattern_fusion_utils:MatchStableStructure/MatchStableDedicated拆分匹配CollectOutputBoundaries收集全部 Reduce,逐个校验同轴 Broadcast 配对ValidateSimdCompositeLayouts);SIMT 串行多阶段simt_boundary_sync:SIMT 边界视图 split 同步与 vectorized_axis 两级重映射SIMT side-input 视图适配:
7.
SimtLoadMetadata增加行级广播标记:generator 在视图改写前按原始结构判定(尾轴 stride==0、其余轴 row-major 稠密递推——从后往前),写入节点 attr 穿透 VF 克隆8. codegen 坐标重建兜底:rank mismatch 断言前按
output_index / 尾轴宽去尾维寻址(读[行,列]值沿尾轴广播的正确语义)9. IL 模板 tensor merge 后,vectorized_axis 中失效旧轴立即替换为 merged 轴(消除中间窗口不一致,
RemapOutputVectorizedAxes的 direct_ancestor 路径无缝衔接到 inner 轴)修改效果
变更类型
关联的Issue
无
如何测试
核对清单