Pull Request已成功合入, 合并人@CANN-robot
(感谢 fan926 的贡献)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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


变更摘要
本 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(无问题)。


代码审查
审查总结
共审查 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 |
💬 仅评论


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


算子说明
Global LP Pool — 计算输入张量空间维度的 Lp 范数:
y = (sum(|x|^p))^(1/p), keepdims=True
支持规格
文件清单 (20 files)