Pull Request已成功合入, 合并人@CANN-robot
(感谢 pantong 的贡献)变更摘要
此 PR 是 transdata aicpu kernel 迁移系列的第 2 部分,主要引入 format_transfer 核心格式转换模块,覆盖 FRACTAL_Z、FRACTAL_NZ、C1HWC0、FRACTAL_Z_WINO 四种格式与标准 4D 格式(NCHW/HWCN/NHWC/ND)之间的双向转换,并建立了格式转换的注册框架和通用工具函数。同时实现了 TransDataCpuKernel 主入口,整合新旧计算路径,并附带 15 个单元测试用例验证关键转换链路的正确性。
主要改动
-
新增
FormatTransfer注册框架:通过register_format_transfer.h/.cpp定义了FormatTransfer抽象基类、TransArgs参数结构体和REGISTER_FORMAT_TRANSFER宏,基于src → dst格式对建立 Builder 注册表,使各格式转换实现类可独立注册并被BuildFormatTransfer统一查找调度。 -
新增核心格式转换实现:
format_transfer_fractal_z.cpp实现 NCHW/HWCN/NHWC 与 FRACTAL_Z(含 C0 编码变体)之间的 TransFormat/TransShape;format_transfer_fractal_nz.cpp实现 ND/NCHW/NHWC 与 FRACTAL_NZ 之间的大 N 小 Z 排列转换,并支持 OpenMP 并行加速;format_transfer_c1hwc0.cpp实现 NCHW/HWCN 到 C1HWC0 的布局映射;format_transfer_fractal_z_wino.cpp实现 FRACTAL_Z_WINO 格式与 NCHW/HWCN/FRACTAL_Z 的转换,包括 Winograd 特有的 N0_2/N0_8 维度拆分。 -
新增通用工具模块:
format_transfer_utils.h/.cpp提供跨格式转换复用的辅助函数,包括形状合法性校验(IsShapeValid/CheckShapeValid)、C0 值获取(GetC0ValueForTransShape/GetC0ValueForTransFormat)、最大公约/最小公倍数计算(Measure/Lcm)、维度提取(GetFormatDim)、分组循环骨架模板(RunGroupedFormatTransfer)等;formats_definitions.h统一定义了各格式的维度索引枚举常量。 -
新增
TransDataCpuKernel主入口:trans_data_aicpu.cpp/.h实现Compute方法,按输入/输出格式分支分发到新NewCompute(走注册框架的RunFormatTransfer)或旧路径HandleHwcnToFzC04/DealData,同时提供张量信息提取、形状 Padding、转置、数据分发等辅助函数,并通过REGISTER_CPU_KERNEL注册为 aicpu kernel。 -
CMake 构建与单元测试:
cmake/symbol.cmake在gen_aicpu_kernel_symbol的 ARM 链接命令中新增COMMAND_EXPAND_LISTS以支持列表展开。test_trans_data.cpp添加 15 个测试用例,覆盖 NCHW/HWCN/NHWC→FRACTAL_Z、ND→FRACTAL_NZ、NCHW/HWCN→C1HWC0、HWCN→FRACTAL_Z_C04 等转换场景,以及不支持的格式/dims/group=0 的错误路径验证,支持 float/half/int8 多种数据类型。


代码审查
Now I have completed my review of all 18 files. Let me write the closing summary.
审查总结
审查覆盖的文件(共 18 个)
| 文件 | 审查结论 |
|---|---|
cmake/symbol.cmake |
无问题(仅为尾随空格清理 + 必要的 COMMAND_EXPAND_LISTS 修复) |
conversion/trans_data/CMakeLists.txt |
1 个 P3 问题(file(GLOB) 使用) |
format_transfer_c1hwc0.cpp |
1 个 P2 问题(BiggerMemSet 返回值忽略) |
format_transfer_c1hwc0.h |
无问题 |
format_transfer_fractal_nz.cpp |
无问题 |
format_transfer_fractal_nz.h |
无问题 |
format_transfer_fractal_z.cpp |
无问题 |
format_transfer_fractal_z.h |
无问题 |
format_transfer_fractal_z_wino.cpp |
无问题 |
format_transfer_fractal_z_wino.h |
无问题 |
format_transfer_utils.cpp |
2 个 P3 问题(死代码 + Measure 函数 bug) |
format_transfer_utils.h |
无问题 |
formats_definitions.h |
无问题 |
register_format_transfer.cpp |
无问题 |
register_format_transfer.h |
无问题 |
trans_data_aicpu.cpp |
无问题 |
trans_data_aicpu.h |
无问题 |
test_trans_data.cpp |
无问题 |
各优先级问题数量
- P0: 0
- P1: 0
- P2: 1 —
BiggerMemSet返回值被忽略,可能导致脏数据 - P3: 3 — 死代码、
Measure函数数学错误、CMakefile(GLOB)使用
整体风险评估
低风险。核心格式转换逻辑(FRACTAL_Z/NZ/C1HWC0/WINO)在代码结构上完整且一致,参数校验链路清晰。发现的 4 个问题均为边缘情况:1 个错误处理遗漏(P2,可能影响 C1HWC0 格式转换的健壮性)、1 个代码冗余(P3 死代码)、1 个公开 API 的数学缺陷(P3,当前不可触发)、1 个 CMake 最佳实践偏离(P3)。以上问题均不影响正常业务流程的正确性。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 1 |
⛔ 需要修改


The following users do not have permission to comment /lgtm or /approve on any module in this PR:
刘伟


/lgtm
/approve


The following users do not have permission to comment /lgtm or /approve on any module in this PR:
刘伟


描述
将canndev仓TransData算子的AICPU kernel迁移到ops-math仓,PR2/3:format_transfer core formats + UT。
关联的Issue
#2231
测试
PR2 of 3: format_transfer for FRACTAL_Z/NZ/C1HWC0/WINO + 15 UT.
修复检视意见:
Still no _aicpu_def.cpp (canndev active). Depends on PR1.
类型标签