Pull Request已成功合入, 合并人@CANN-robot
(感谢 sujunwei3 的贡献)变更摘要
本 PR 新增了四个 AICPU 算子:TileWithAxis、TopKPQDistance、TopKV2D 和 Zeta。每个算子均包含算子原型定义(REG_OP)、AICPU 内核实现(继承 CpuKernel)、OpDef 注册、GE IR 集成测试示例以及单元测试。其中 TopKV2D 额外包含 Host 端 InferShape 逻辑。这些算子覆盖了张量沿轴复制、基于堆的 Top-K 距离筛选、沿指定维度 Top-K 查找以及 Hurwitz zeta 函数计算等场景。
主要改动
-
新增
TileWithAxis算子:在conversion/tile_with_axis/下实现沿指定轴重复张量数据的 AICPU 内核,支持 float16/float/int8~int64/uint8~uint64 共 11 种数据类型,通过 Eigen 的 broadcast 机制完成沿 axis 轴的 tiles 次复制,支持 0~8 维输入。 -
新增
TopKPQDistance算子:在math/top_k_pq_distance/下实现基于堆的 Top-K 距离筛选内核,接收动态输入actual_count、pq_distance、grouped_extreme_distance、pq_ivf、pq_index,通过两级堆(分组极值堆与距离 Top-K 堆)筛选出 K 个最大/最小距离及其对应的 IVF 桶号和索引,支持 float32/float16,并支持多批次输入。 -
新增
TopKV2D算子:在math/top_k_v2_d/下实现沿指定维度查找 K 个最大/最小值的 AICPU 内核,支持 float16/float/double/int8~int64/uint8~uint64 共 11 种数据类型,包含单调性检测优化、选择排序(小 n 小 k)、堆排序(通用路径)及全排序(k=n)四条计算路径,并通过CpuKernelUtils::ParallelFor实现多核并行。 -
新增
Zeta算子:在math/zeta/下实现 Hurwitz zeta 函数的 AICPU 内核,基于 Eigen 的numext::zeta逐元素计算,支持 float32 和 double,内置并行阈值(64K 元素以上启用ParallelFor),并对输入输出类型一致性、数据大小等进行校验。 -
新增
TopKV2D的 Host 端InferShape:在math/top_k_v2_d/op_host/top_k_v2_d_infershape.cpp中实现根据dim属性和k输入张量推导输出形状的逻辑,替换dim轴维度为 k 值,并注册为IMPL_OP_INFERSHAPE。


代码审查
审查总结
已完成对全部 33 个变更文件的逐一审查。发现共 8 个问题:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P0 | 2 | test_top_k_pq_distance.cpp 中两处 CpuKernelUtils::CpuKernelUtils:: 双重限定符,可能导致编译失败 |
| P1 | 2 | zeta_aicpu.cpp 除零错误;top_k_pq_distance_aicpu.cpp VLA 栈溢出风险 |
| P2 | 2 | tile_with_axis_aicpu_def.cpp 中 tiles 属性 OPTIONAL/REQUIRED 不一致;tile_with_axis_proto.h 声明 BF16 但 def/kernel 未实现 |
| P3 | 2 | test_geir_top_k_v2_d.cpp 和 test_geir_zeta.cpp 示例代码中 fwrite 返回值未检查 |
各文件审查结果
| 文件 | 结果 |
|---|---|
conversion/tile_with_axis/README.md |
无问题 |
conversion/tile_with_axis/examples/test_geir_tile_with_axis.cpp |
无问题 |
conversion/tile_with_axis/op_graph/tile_with_axis_proto.h |
P2: BF16 类型声明未实现 |
conversion/tile_with_axis/op_kernel_aicpu/tile_with_axis_aicpu.cpp |
无问题 |
conversion/tile_with_axis/op_kernel_aicpu/tile_with_axis_aicpu.h |
无问题 |
conversion/tile_with_axis/op_kernel_aicpu/tile_with_axis_aicpu_def.cpp |
P2: tiles 属性标记不一致 |
conversion/tile_with_axis/tests/ut/op_kernel_aicpu/test_tile_with_axis.cpp |
无问题 |
docs/zh/op_list.md |
无问题 |
math/top_k_pq_distance/CMakeLists.txt |
无问题 |
math/top_k_pq_distance/README.md |
无问题 |
math/top_k_pq_distance/examples/test_geir_top_k_pq_distance.cpp |
无问题 |
math/top_k_pq_distance/op_graph/top_k_pq_distance_proto.h |
无问题 |
math/top_k_pq_distance/op_kernel_aicpu/top_k_pq_distance_aicpu.cpp |
P1: VLA 栈溢出风险 |
math/top_k_pq_distance/op_kernel_aicpu/top_k_pq_distance_aicpu.h |
无问题 |
math/top_k_pq_distance/op_kernel_aicpu/top_k_pq_distance_aicpu_def.cpp |
无问题 |
math/top_k_pq_distance/tests/ut/op_kernel_aicpu/test_top_k_pq_distance.cpp |
P0: 双重限定符×2 |
math/top_k_v2_d/CMakeLists.txt |
无问题 |
math/top_k_v2_d/README.md |
无问题 |
math/top_k_v2_d/examples/test_geir_top_k_v2_d.cpp |
P3: fwrite 返回值未检查 |
math/top_k_v2_d/op_graph/top_k_v2_d_proto.h |
无问题 |
math/top_k_v2_d/op_host/top_k_v2_d_infershape.cpp |
无问题 |
math/top_k_v2_d/op_kernel_aicpu/top_k_v2_d_aicpu.cpp |
无问题 |
math/top_k_v2_d/op_kernel_aicpu/top_k_v2_d_aicpu.h |
无问题 |
math/top_k_v2_d/op_kernel_aicpu/top_k_v2_d_aicpu_def.cpp |
无问题 |
math/top_k_v2_d/tests/ut/op_kernel_aicpu/test_top_k_v2_d.cpp |
无问题 |
math/zeta/CMakeLists.txt |
无问题 |
math/zeta/README.md |
无问题 |
math/zeta/examples/test_geir_zeta.cpp |
P3: fwrite 返回值未检查 |
math/zeta/op_graph/zeta_proto.h |
无问题 |
math/zeta/op_kernel_aicpu/zeta_aicpu.cpp |
P1: total=0 除零 |
math/zeta/op_kernel_aicpu/zeta_aicpu.h |
无问题 |
math/zeta/op_kernel_aicpu/zeta_aicpu_def.cpp |
无问题 |
math/zeta/tests/ut/op_kernel_aicpu/test_zeta.cpp |
无问题 |
整体风险评估:该 PR 新增了 4 个 AICPU 算子(TileWithAxis、TopKPQDistance、TopKV2D、Zeta)及其配套的测试、示例和文档。核心 kernel 逻辑基本正确,但存在 2 个 P0 编译阻断问题(测试代码双重限定符)、2 个 P1 运行时风险(除零和栈溢出)以及 2 个 P2 接口一致性问题。建议优先修复 P0 和 P1 项后再合入。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 6 |
| 🟡 建议 | 3 |
⛔ 需要修改


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 | ✅ 陈娇, wangrui_, 宋恺 (3/2) | ✅ 陈娇 (1/1) |
| */*/op_graph/*_proto.h | ✅ 汤磊, wangrui_, 宋恺 (3/2) | ✅ 汤磊 (1/1) |
| repo-cann/ops-math | ✅ wangrui_, 宋恺 (2/2) | ✅ wangrui_ (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
sujunwei3, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/lgtm


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


描述
新增四个 AI CPU 算子:
每个算子包含:op_kernel_aicpu 实现、op_graph 构图定义、examples 示例、UT 单元测试、README 文档。
关联的Issue
#2294
测试
根据代码变更,测试场景如下:
tile_with_axis 单元测试 + GE IR 验证
bash build.sh -u --opkernel_aicpu --ops=tile_with_axis --soc=ascend910b,17 个 UT 全部通过execute samples success,输出 bin 文件正常top_k_pq_distance 单元测试
bash build.sh -u --opkernel_aicpu --ops=top_k_pq_distance --soc=ascend910b,5 个 UT 全部通过top_k_v2_d 单元测试 + GE IR 验证
bash build.sh -u --opkernel_aicpu --ops=top_k_v2_d --soc=ascend910b,UT 全部通过zeta 单元测试 + GE IR 验证
bash build.sh -u --opkernel_aicpu --ops=zeta --soc=ascend910b,8 个 UT 全部通过execute samples success,输出 bin 文件正常文档更新
类型标签