已合并
【PR】: fix: 调整 tensor layout 工具归属和搬运模式 #1932
Phl17创建于 19 天前
【PR】: fix: 调整 tensor layout 工具归属和搬运模式 #1932
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 Phl17 的贡献)atomgit-bot
19 天前 评论:
19 天前 评论:
变更摘要
该 PR 主要将张量不连续性分析工具 TensorLayoutUtils / DiscontinuityInfo / AnalyzeLoadDiscontinuity 从 optimize 命名空间迁移至 ascgen_utils 命名空间,使其可被 codegen 模块复用;在此基础上重构了 reg_api_call_utils.cpp 中的 GetPaddingMode,由原先基于 tpipe.tiler 轴类型判断的模式改为基于不连续分析结果来决定 PaddingMode::Compact/PaddingMode::Normal,并同步更新了相关 E2E/UT 用例期望,同时清理了 IndirectLoad 测试中大量过期变体。
主要改动
GetPaddingMode重构为基于不连续分析:reg_api_call_utils.cpp/.h中GetPaddingMode签名由(const TPipe&, const Tensor&, const DataCopyParams&)简化为(const Tensor&, const DataCopyParams&),新实现用 UB 张量的axis/axis_size/axis_strides/vectorized_axis构造af::AscTensorAttr并调用ascgen_utils::TensorLayoutUtils::AnalyzeLoadDiscontinuity,仅当分析成功、无多重不连续且repeat == stride时才返回Compact,否则返回Normal;reg_broadcast_api_call.cpp也据此在 Compact 模式下改用ActualSize计算末维尺寸。- 工具类迁移至
ascgen_utils命名空间:tensor_layout_utils.h/.cpp的命名空间由optimize改为ascgen_utils,并移除了schedule_utils.h依赖;load_to_nddma_template.cpp、nddma_template.cpp、un_alignment_strategy.cpp中的调用点相应加上ascgen_utils::限定符。 - IndirectLoad E2E 测试清理与期望调整:移除
IL_USER_SIDE_INPUT_FANOUT、IL_USER_MASKED_EMBEDDING_MINIMAL/SUM_FULL、IL_USER_EMBEDDING_SUM_RANK2、IL_INDEX_MIXED_VIEW、IL_EMBEDDING_SIZE/DIRECT/SIMT等变体及相关辅助代码(如VariadicBackendGraph、ValidateAccessInfoMetadata、RAII 的AllocGmBuffer);embedding 子图索引视图改为稠密[rows, embedding_size]并去掉Cast/Broadcast中间节点,相关内核期望由IndirectLoadSimtEmbeddingPolicy调整为IndirectLoadSimtStridedPolicy;BuildComplexInputPath统一改为Add路径(移除Maximum分支)。 - 新增
AnalyzeLoadDiscontinuity单元测试:新增test_tensor_layout_utils.cpp,覆盖连续布局、单/多重不连续、尾轴不连续、广播轴忽略,以及 vectorized 轴缺失、layout 属性长度不足等失败场景。 - 数据搬运 padding 模式相关期望同步更新:
floortoint、load_where_x2_x3_is_ubscalar_store后端 E2E 期望改为DataCopyPadExtend<..., PaddingMode::Compact>,而test_codegen_store_reg_api_call.cpp的三维/五维 Store 用例期望改为Normal;load_nan_out_for_store用例增加输出缓冲零初始化、固定block_dim = 1并调整测试 shape。


不准确?
atomgit-bot
19 天前 评论:
19 天前 评论:
代码审查
已完成对全部 15 个变更文件的审查。以下为每个文件的核查结论与最终统计。
各文件核查结论
- autofuse/common/tensor_layout_utils.cpp / .h — 命名空间
optimize→ascgen_utils重命名本身没有问题,但该重命名与三个调用方的新限定写法不一致,导致编译错误(见下)。本文件无独立问题。 - autofuse/tests/ut/common/test_tensor_layout_utils.cpp — 新增单测,我逐一对照
AnalyzeLoadDiscontinuity实现核验了 7 个用例的期望值(连续/单不连续/多不连续/尾轴不连续/广播轴忽略/缺轴失败/长度不足失败),全部与实现逻辑一致。无问题。 - floortoint_float_backend_generate.cpp / load_where_x2_x3_is_ubscalar_store_backend_generate.cpp — PaddingMode 期望由 Normal→Compact,与
GetPaddingMode新逻辑的放宽方向一致(属于有意变更)。无独立问题。 - test_codegen_store_reg_api_call.cpp — 两处期望 Compact→Normal,与 store 方向新逻辑收紧方向一致。无问题。
- test_e2e_load_nan_out_for_store_expect_kernel.cpp —
fill_n清零、block_dim=1、shape 调整均合理。无问题。 - indirect_load_store_backend_generator.cpp — 发现 CMake 目标与已删除宏不一致的问题(P2)。
- test_e2e_indirect_load_store_kernel.cpp — 发现 user_fanout 测试断言失败路径 GM 泄漏(P3);其余删除/改造(RAII→裸指针、EmbReduce 视图改造、embedding index 视图改造)与配套测试分配一致。
- reg_api_call_utils.cpp / .h — 发现 GetPaddingMode 删除 TileInner 首轴保护的行为风险(P2);签名变更与两个调用点同步。
- reg_broadcast_api_call.cpp —
(void)CalculateDmaParams失败时回退 Normal,行为与旧一致,未发现可确认缺陷。 - load_to_nddma_template.cpp / nddma_template.cpp / un_alignment_strategy.cpp — 三处
ascgen_utils::AnalyzeLoadDiscontinuity缺少TensorLayoutUtils::限定,构成编译错误(P0)。
最终统计
- P0:3 项(三个 optimize 文件的编译错误,独立文件独立修复)
- P2:2 项(GetPaddingMode 行为风险;CMake 目标与删除宏不一致)
- P3:1 项(user_fanout 测试失败路径 GM 泄漏)
总体风险评估
高风险。本 PR 存在 3 处确定性编译错误(ascgen_utils::AnalyzeLoadDiscontinuity 无法解析),将直接导致构建失败,必须先修复;此外 GetPaddingMode 放宽 Compact 判定删除了既有安全保护、以及大量 E2E 测试删除后未同步 CMake 配置,均属于需要确认的回归风险。其余 padding 模式期望、测试视图改造等为有配套测试更新的有意变更。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 3 |
| 🟡 建议 | 0 |
⛔ 需要修改


不准确?
19 天前 添加了label:cann-cla/yes
此处折叠了59条消息 查看更多
xchu42
18 天前 评论:
18 天前 评论:
/lgtm


18 天前 添加了label:lgtm
yangyongqiang
18 天前 评论:
18 天前 评论:
/approve


18 天前 添加了label:approved
18 天前 合入了pull request
Pull Request
描述
当前codegen和schedule对数据搬运 padding mode方式判断不一致,需要进行归一;调整 tensor layout 工具(TensorLayoutUtils)的归属位置,并重构搬运(DMA)时 padding 模式的判定逻辑:GetPaddingMode 不再依赖 tpipe 与 DataCopyParams,而是通过 TensorLayoutUtils::AnalyzeLoadDiscontinuity 分析 UB tensor 的布局属性(axis、axis_size、axis_strides、vectorized_axis)决定使用 Compact 还是 Normal 模式,同时新增对应单元测试并更新既有 codegen 测试期望
变更类型
请选择本次引入的变更类型:
关联的Issue
如何测试
修复后 执行用例tc_af_tf_autofuse_pointwise_696_Cast_RealDiv_SelectV2_1170成功,精度和性能问题满足用例要求
核对清单
其他信息
变更摘要
本 PR 主要调整 tensor layout 工具(TensorLayoutUtils)的归属位置,并重构搬运(DMA)时 padding 模式的判定逻辑:GetPaddingMode 不再依赖 tpipe 与 DataCopyParams,而是通过 TensorLayoutUtils::AnalyzeLoadDiscontinuity 分析 UB tensor 的布局属性(axis、axis_size、axis_strides、vectorized_axis)决定使用 Compact 还是 Normal 模式,同时新增对应单元测试并更新既有 codegen 测试期望。
主要改动
工具归属调整: 将 tensor_layout_utils.cpp/.h 迁移至 autofuse/common/ 目录,并在 .cpp 中移除对 schedule_utils.h 的依赖。
重写 GetPaddingMode 判定逻辑: 函数签名由 GetPaddingMode(const TPipe &tpipe, const Tensor &ub_tensor, const DataCopyParams &data_copy_param) 简化为 GetPaddingMode(const Tensor &ub_tensor),改为调用 TensorLayoutUtils::AnalyzeLoadDiscontinuity 分析 UB tensor 布局:分析成功且无多重不连续(has_multiple_discontinuities 为假)时返回 kCompactPddingMode,否则返回 kNormalPddingMode;头文件声明及 CreateEnhanceDmaCall、BuildDataCopyApiParamInNormal 两处调用点同步更新。
新增单元测试: 新增 autofuse/tests/ut/common/test_tensor_layout_utils.cpp,覆盖连续布局、单一/多重不连续、尾轴不连续、广播轴忽略,以及 vectorized_axis 缺失、布局属性长度不足返回失败等场景。
更新 codegen 测试期望: 调整 test_codegen_load_reg_api_call.cpp 与 test_codegen_store_reg_api_call.cpp 中 DataCopyPadExtend 的 PaddingMode 期望值(部分用例由 Normal 改为 Compact,部分反之),以匹配新的 padding 模式选择逻辑。