已合并
feat(pooling): add GlobalLpPool operator #6398
feat(pooling): add GlobalLpPool operator #6398
已合并
fan926创建于 6月23日
fan926
fan926成员
6月23日

算子说明

Global LP Pool — 计算输入张量空间维度的 Lp 范数:
y = (sum(|x|^p))^(1/p), keepdims=True

支持规格

  • 输入: 4D (NCHW) 或 5D (NCD0D1D2)
  • DTypes: FP32, FP16, BF16
  • 属性: p (float, 默认 2.0)
  • 架构: ascend950/arch35
  • 接口: aclnn_exclude (直调)

文件清单 (20 files)

  • op_kernel/ — VF 级 kernel 实现 (双缓冲 + 二分归约树 + |x|^p + (1/p) root)
  • op_host/ — Tiling (ubFactor, 多核切分, cacheBuf 约束, empty tensor 分支)
  • op_graph/ — Proto 定义
  • tests/ — Tiling 单测 (5 用例: 4D/5D/大通道/空张量)
  • README.md — 算子说明
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 fan926 的贡献)
fan926fan926成员
6月23日 创建了 pull request,commit 046aaa57
CANN-robotCANN-robot成员
6月23日 添加了label:cann-cla/no
CANN-robot
CANN-robot成员
6月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
*/*/README.md ✅ 陈娇, 陈琦, 唐玮玮 (3/2) ✅ 陈娇 (1/1)
*/*/op_graph/*_proto.h ✅ 王永光, 唐玮玮, 陈琦 (3/2) ✅ 王永光 (1/1)
*/*/op_host/*_def.cpp ✅ 王永光, 陈琦, 唐玮玮 (3/2) ✅ 王永光 (1/1)
pooling ✅ 唐玮玮, 王永光, 陈琦 (3/2) ✅ 唐玮玮, 王永光, 陈琦 (3/1)
repo-cann/ops-nn ✅ 唐玮玮, 陈琦 (2/2) ✅ 陈琦, 唐玮玮 (2/1)

💡 Tip:

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

CLA Signature Pass

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

likedislike
atomgit-bot
atomgit-bot
6月23日 评论:

变更摘要

本 PR 为 CANN 算子库新增 GlobalLpPool 算子,实现输入张量空间维度的 Lp 范数池化(y = (sum(|x|^p))^(1/p), keepdims=True)。涵盖 4D(NCHW)和 5D(NCD0D1D2)输入、FP32/FP16/BF16 三种数据类型,基于 ascend950/arch35 架构。核心组件包括:tiling 参数计算(global_lp_pool_tiling_arch35.cpp)、VF 级 kernel 实现(双缓冲 + 二分归约树,global_lp_pool_kernel.h)、算子定义与 shape 推导、JSON 配置、proto 图注册,以及 4 个测试/示例程序和 1 个 tiling 单元测试。

主要改动

  • 新增算子核心 kernel 实现:global_lp_pool_kernel.h 包含模板类 GlobalLpPoolKernel,实现双缓冲 CopyIn、VF 指令集 Cast/Power/ReduceSum、二分归约树 Accumulate(GetCacheID/DoCachingVf)、以及 PostElewise 逆幂运算(Sqrt/Ln/Muls/Exp),支持 isEmptyTensor 和 isTailR 模板分派。

  • 新增 tiling 参数计算:global_lp_pool_tiling_arch35.cpp 实现多步 UB 切分算法(CalcAUbFactor → CalcRFromBudget → TryExpandA → CheckCacheBufConstraint),支持多核切分、空张量路径,并将结果写入 GlobalLpPoolTilingData 结构体。

  • 新增算子注册与接口定义:global_lp_pool_def.cpp 通过 OpDef 注册输入/输出/属性(p 默认 2.0),global_lp_pool_proto.h 通过 REG_OP 注册图算子,global_lp_pool_infershape.cpp 实现空间维度归约为 1 的 shape 推导。

  • 测试与示例程序:4 个示例文件覆盖 aclnn 两段式调用、200 个 shape×dtype×p 组合、综合精度对比、整数输入精度验证;1 个 tiling 单元测试覆盖基本/大通道/5D/空张量场景。

  • 构建与配置:根 CMakeLists.txt 设置 ascend950/arch35 编译目标;global_lp_pool.json / global_lp_pool_binary.json 定义三种 dtype 的 kernel 二进制映射;tiling_key.h 定义 isEmptyTensor/isTailR 模板参数选择。

审查覆盖的文件(全部 23 个):CMakeLists.txt(无问题),README.md(无问题),test_200.cpp(P2 泄漏),test_aclnn_global_lp_pool.cpp(P2 泄漏),test_comprehensive.cpp(P2 泄漏 + P3 死代码),test_integer.cpp(P2 泄漏),op_graph/CMakeLists.txt(无问题),global_lp_pool_proto.h(无问题),global_lp_pool_tiling_arch35.cpp(P3 调试日志),global_lp_pool_tiling_arch35.h(无问题),global_lp_pool.json(无问题),global_lp_pool_binary.json(无问题),global_lp_pool_def.cpp(无问题),global_lp_pool_infershape.cpp(无问题),global_lp_pool_empty.h(无问题),global_lp_pool_kernel.h(无问题),global_lp_pool_tiling_data.h(无问题),global_lp_pool_tiling_key.h(无问题),global_lp_pool_apt.cpp(无问题),tests/CMakeLists.txt(无问题),tests/ut/CMakeLists.txt(无问题),tests/ut/op_host/CMakeLists.txt(无问题),test_global_lp_pool_tiling.cpp(无问题)。

likedislike
不准确?
atomgit-bot
atomgit-bot
6月23日 评论:

代码审查

审查总结

共审查 23 个变更文件,发现 7 个问题:

优先级 数量 说明
P2 4 四个测试/示例文件中 Run/RunOneCase/CreateAclTensor 函数在错误路径上提前返回时未释放已分配的 device 内存
P3 3 file(GLOB) 构建反模式 (3 个 CMakeLists.txt 合并为 1 个报告)、test_comprehensive.cpp 中未使用的 golden_fp16 变量、README 中 p=0 行为描述不准确

逐文件审查结果:

文件 结果
pooling/global_lp_pool/CMakeLists.txt 无问题
pooling/global_lp_pool/README.md P3: p=0 文档描述不准确
pooling/global_lp_pool/examples/test_200.cpp P2: device 内存泄漏
pooling/global_lp_pool/examples/test_aclnn_global_lp_pool.cpp P2: device 内存泄漏
pooling/global_lp_pool/examples/test_comprehensive.cpp P2: device 内存泄漏; P3: 未使用变量
pooling/global_lp_pool/examples/test_integer.cpp P2: device 内存泄漏
pooling/global_lp_pool/op_graph/CMakeLists.txt 无问题
pooling/global_lp_pool/op_graph/global_lp_pool_proto.h 无问题
pooling/global_lp_pool/op_host/arch35/global_lp_pool_tiling_arch35.cpp 无问题
pooling/global_lp_pool/op_host/arch35/global_lp_pool_tiling_arch35.h 无问题
pooling/global_lp_pool/op_host/config/ascend950/global_lp_pool.json 无问题
pooling/global_lp_pool/op_host/config/ascend950/global_lp_pool_binary.json 无问题
pooling/global_lp_pool/op_host/global_lp_pool_def.cpp 无问题
pooling/global_lp_pool/op_host/global_lp_pool_infershape.cpp 无问题
pooling/global_lp_pool/op_kernel/arch35/global_lp_pool_empty.h 无问题
pooling/global_lp_pool/op_kernel/arch35/global_lp_pool_kernel.h 无问题
pooling/global_lp_pool/op_kernel/arch35/global_lp_pool_tiling_data.h 无问题
pooling/global_lp_pool/op_kernel/arch35/global_lp_pool_tiling_key.h 无问题
pooling/global_lp_pool/op_kernel/global_lp_pool_apt.cpp 无问题
pooling/global_lp_pool/tests/CMakeLists.txt P3: file(GLOB)
pooling/global_lp_pool/tests/ut/CMakeLists.txt P3: file(GLOB)(同上)
pooling/global_lp_pool/tests/ut/op_host/CMakeLists.txt P3: file(GLOB)(同上)
pooling/global_lp_pool/tests/ut/op_host/arch35/test_global_lp_pool_tiling.cpp 无问题

整体风险评估:低风险。 核心算子逻辑(kernel、tiling、infer shape、proto、op def)未发现正确性或安全性缺陷。所有 P2 问题集中在测试/示例代码的资源管理上,不影响生产运行。P3 问题为构建规范、死代码和文档准确性,均为可选改进项。

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

💬 仅评论

likedislike
不准确?
此处折叠了276条消息 查看更多
chenjiao成员
7月10日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月10日 添加了label:approved
CANN-robotCANN-robot成员
7月10日 关闭了关联的issue
CANN-robotCANN-robot成员
7月10日 合入了pull request
CANN-robot
CANN-robot成员
7月10日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike