Pull Request已成功合入, 合并人@ascend-robot
(感谢 dezheng889 的贡献)变更摘要
此 PR 为昇腾 NPU Inductor 后端的 reduction 算子引入了符号动态形状的分组(grouping)支持。核心思路是:当 reduction 轴为动态(符号)维度时,将其保持为纯循环/分块轴(grid=1),而非拆分为跨程序 grid 轴,从而避免缺少跨核 combine 导致的结果覆盖问题;同时按运行时 reduction 大小进行分桶(bucketing),并为每个桶调优 R0BLOCK_SUB。这一改动使单 kernel 通过 tail mask 循环处理运行时 numel,匹配 CUDA 的 single-kernel 路径,并减少了不必要的回退到 community simt 路径。
主要改动
- 1D 动态 reduction 保持 split=1(
torch_npu/_inductor/ir.py):在num_splits中新增对 1D 符号 reduction 轴的特殊判断,当reduction_ranges仅有一个符号维度时返回split=1,使该 reduction 保持单一Reduction节点而非退化出多层 split。 - split_axis 决策中排除 1D 动态 reduction 轴(
torch_npu/_inductor/codegen/split_tiling.py):在select_split_axis末尾增加is_1d_dynamic_reduction检测,对于单一符号 reduction 轴、标量输出的情况,不再将其加入split_axis,确保 grid=1 从而避免部分结果覆盖标量输出。 - 新增
_dynamic_reduction_tiling_axis与分组特征构建重构(split_tiling.py):新增方法识别无 grid split 轴的单一动态 reduction 分块轴;_build_group_features中仅对实际包含动态轴的组生成分桶特征(_REDUCTION_BUCKETS/_OUTER_BUCKETS),避免全静态组产生不可达的 group id。_build_grouped_meta重构为处理两种场景:有动态 split 轴的常规路径,以及无动态 split 轴时按 reduction 分块轴分桶的路径。 - 动态 reduction 线性化路径优化(
torch_npu/_inductor/codegen/ir.py):新增is_linear_dynamic_reduction函数,检查 indexing 中是否存在符号边界的ModularIndexing/FloorDiv;在transform_dims_in_indexing中,对 A5 平台的动态形状不再一律回退到 community simt,而是先判断是否可线性化——若线性化可行则继续走simt_template路径,仅不可线性化时才回退。 - 新增动态形状 1D sum 测试(
test/_inductor/test_sum.py):添加test_sum_1d_dynamic_shape和test_sum_1d_dynamic_shape_group_autotune两个测试用例,覆盖跨分桶边界的多种动态尺寸,验证单 kernel 在dynamic=True及开启enable_symbolic_shape_group_autotune下的正确性。


代码审查
审查总结
本次 diff 共审查 4 个文件,以下是审查结论:
| 文件 | 结果 |
|---|---|
test/_inductor/test_sum.py |
发现 1 个 P3 建议 |
torch_npu/_inductor/codegen/ir.py |
无问题 |
torch_npu/_inductor/codegen/split_tiling.py |
发现 2 个 P3 建议 |
torch_npu/_inductor/ir.py |
无问题 |
按优先级统计:
- P0:0
- P1:0
- P2:0
- P3:3
总体风险评估:低。 该变更逻辑设计合理、边界条件处理周全。核心流程(num_splits → select_split_axis → _build_grouped_meta → _build_group_features)对 1D 动态 shape reduction 的处理一致且正确:split 被抑制(num_splits 返回 split=1)、reduction 轴不被设为 grid split 轴(grid==1),reduction tiling 轴通过 bucketed autotune 按运行时大小调整 R0BLOCK_SUB。is_linear_dynamic_reduction 作为乐观守卫与 Step 3 的 can_split_all 最终安全检查形成双层防护。3 个 P3 建议均为次要改进(未使用参数、类型检查一致性、测试容差),不影响正确性或安全性。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
【修改方案】
【资料变更】
【接口变更】
【功能验证】
【CheckList】