已合并
[CANNBot]新增points_in_polygons算子 #1282
huangzhiyuan创建于 8月12日
[CANNBot]新增points_in_polygons算子 #1282
已合并
huangzhiyuan创建于 8月12日
huangzhiyuan
huangzhiyuan成员
8月12日

描述

新增 points_in_polygons 算子,归类为 image 类目下 LayoutTransform 计算范式,面向 Ascend 950PR/950DT(ascend950 / arch35 tiling)。 PointsInPolygons 是点-四边形从属关系判定算子:给定 N 个二维点与 M 个四边形(每个四边形由 4个顶点按顺序展开为 8 个标量,形状 (8, M)),对每个 (点, 四边形) 组合判定该点是否落在该四边形内部,输出 N×M 的二值浮点矩阵,1.0表示在内、0.0 表示在外。

关联的Issue

https://gitcode.com/cann/ops-cv/issues/753

测试

二级冒烟,黑盒测试

文档更新

新增 image/points_in_polygons/README.md:包含产品支持情况、功能说明(含计算公式)、参数说明表格、约束说明、调用说明。 更新 docs/zh/op_list.md:在算子列表中登记 points_in_polygons。

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 huangzhiyuan 的贡献)
huangzhiyuanhuangzhiyuan成员
8月12日 创建了 pull request,commit 4eb03ff6
atomgit-bot
atomgit-bot
8月12日 评论:

变更摘要

此 PR 新增了 PointsInPolygons 算子,用于判定 N 个二维点与 M 个四边形之间的从属关系,基于 PNPOLY 射线法。实现覆盖了完整的 CANN 算子开发流程:算子定义与注册(OpDef、REG_OP)、形状推断与数据类型推断、Host 侧 Tiling(三路分支:空 tensor 短路 / 沿 M 轴向量化 / 沿 N 轴向量化)、Device 侧 Kernel(PointsInPolygonsKernel<T,KEY> 模板类,包含 VF 寄存器级射线法计算链、NDDMA 尾轴转置、MTE2→V→MTE3 三级流水)、aclnn 通用 API 封装(aclnnPointsInPolygons / aclnnPointsInPolygonsGetWorkspaceSize)及示例程序。

主要改动

  • 新增 PointsInPolygons 算子定义与注册:在 points_in_polygons_def.cpp 中通过 OpDef 定义算子接口(points(N,2) / polygons(M,8) 输入,output(N,M) 输出,仅 DT_FLOAT),在 points_in_polygons_proto.h 中通过 REG_OP 注册;并配套实现了 InferShape(输出 shape=(N,M))与 InferDataType(仅 float32 校验)

  • Host 侧三路 Tiling 分支:TilingFuncPointsInPolygons 实现了完整的输入校验链(dtype→format→rank→固定维),并根据 N/M 取值路由到三个分支—— ComputeBranch0Tiling(空 tensor 零哨兵短路)、ComputeBranch1Tiling(FindTileNM 从 UB 预算反推 tileN/tileM + MultiCoreSplit 多核切分)、ComputeBranch2Tiling(M≤16 且 N≥256 时沿 N 轴向量化),通过 ASCENDC_TPL 的 tilingKey 编译期实例化三份 sub-kernel

  • Device 侧 Kernel VF 寄存器级射线法:在 points_in_polygons.h 中实现了 RayCastComputeVF<T> 和 RayCastComputeVF_N<T> 两个 __simd_vf__ 函数,将 S3–S8 射线法中间量(cond/safe_dy/xint/cross/count)全部在 RegTensor<float> 寄存器内融合计算(不落 UB),通过 asc_vf_call 从 Compute 侧调用,支持 VL=64 分块处理

  • 通用 API 层封装与 L0 算子:aclnn_points_in_polygons.cpp 实现了 aclnnPointsInPolygonsGetWorkspaceSize(含 Contiguous 连续化 + ViewCopy 视图复制 + workspace 查询)和 aclnnPointsInPolygons(CommonOpExecutorRun 执行),points_in_polygons.cpp 实现了 L0 算子 PointsInPolygons 的 OP_TYPE_REGISTER 与 ADD_TO_LAUNCHER_LIST_AICORE 注册

  • TilingData POD 结构体与 TilingKey 枚举:在 points_in_polygons_tiling_data.h 中定义了跨 Host/Kernel 共享的 PointsInPolygonsTilingData(含 shape、双轴分块参数、多核切分字段、N-vec 专用字段);在 points_in_polygons_tiling_key.h 中定义了 POINTS_IN_POLYGONS_KEY_EMPTY/NORMAL/N_VEC 三个枚举值与 ASCENDC_TPL_ARGS_DECL / ASCENDC_TPL_SEL 模板声明

likedislike
不准确?
atomgit-bot
atomgit-bot
8月12日 评论:

代码审查

我已经完成了对所有 8 个文件的全面审查。以下是最终总结:


审查总结

文件 审查结果
image/points_in_polygons/CMakeLists.txt 1 个 P3 建议(GLOB 目录发现)
image/points_in_polygons/examples/arch35/test_aclnn_points_in_polygons.cpp 4 个 P2 问题
image/points_in_polygons/examples/test_aclnn_points_in_polygons.cpp 4 个 P2 问题
image/points_in_polygons/op_api/aclnn_points_in_polygons.cpp 无问题
image/points_in_polygons/op_api/aclnn_points_in_polygons.h 无问题
image/points_in_polygons/op_api/points_in_polygons.cpp 无问题
image/points_in_polygons/op_api/points_in_polygons.h 无问题
image/points_in_polygons/op_graph/fusion_pass/.gitkeep 无问题

按优先级统计:

  • P0:0
  • P1:0
  • P2:8(分布在两个测试文件中:aclCreateTensor 空指针 ×2、%ld 格式符号错误 ×4、资源泄漏 ×2)
  • P3:1(CMakeLists.txt GLOB)

整体风险评估:中等。 核心算子 API 层代码(aclnn_points_in_polygons.cpp、points_in_polygons.cpp 及对应头文件)质量良好:空指针检查齐全、ADD_TO_LAUNCHER_LIST_AICORE 返回值经 OP_CHECK 校验、Contiguous/ViewCopy 等 L0 调用均有 CHECK_RET 保护。问题集中在两个测试/示例文件中,属于从已有代码模板复制时引入的格式符号不一致(%ld vs %d)、aclCreateTensor 缺空指针检查、以及错误路径资源泄漏——这些均可通过局部修改修复,不影响算子运行时代码。


审查总结

共审查了该 PR 的 8 个变更文件,逐文件结果如下:

文件 发现数 评估
image/points_in_polygons/op_graph/points_in_polygons_graph_infer.cpp 1 (P3) 存在不可达死代码(冗余 dtype 检查)
image/points_in_polygons/op_graph/points_in_polygons_proto.h 0 无问题
image/points_in_polygons/op_host/arch35/points_in_polygons_tiling_arch35.cpp 2 (P3) totalTiles 注释与实现不一致、BranchOutputs::tilingKey 未被使用
image/points_in_polygons/op_host/arch35/points_in_polygons_tiling_arch35.h 1 (P3) N-vec UB 布局注释与实际分配不一致
image/points_in_polygons/op_host/points_in_polygons_def.cpp 0 无问题
image/points_in_polygons/op_host/points_in_polygons_infershape.cpp 0 无问题
image/points_in_polygons/op_kernel/arch35/points_in_polygons.h 0 无问题
image/points_in_polygons/op_kernel/arch35/points_in_polygons_tiling_data.h 0 无问题(注释问题关联到 tiling_arch35 文件)

按优先级统计: P0: 0, P1: 0, P2: 0, P3: 4

整体风险评估:低风险。 本次变更未引入任何 P0–P2 级别的正确性、安全或可靠性问题。所有发现均为 P3 级别的注释/死代码问题,不影响运行时行为。核心 Tiling 计算逻辑、Kernel 流水线同步(SetFlag/WaitFlag 配对、NDDMA 转置、Double Buffer 槽复用)、UB 预算反推公式、多核切分均经过仔细审查,逻辑自洽。三个分支(EMPTY / NORMAL / N_VEC)的 TilingData 填写与 Kernel 消费合约一致。



最终扫描(Final Sweep)

对已报告位置及其邻域重新审查边界值、热点路径、并列缺陷:

  • 边界值:KEY = {0, 1, 2} 均为简单枚举值,无边界溢出风险。
  • 热点路径:kernel 入口函数 points_in_polygons 是单次启动调用,内部无重复分配/加载,无性能回归。
  • 并列缺陷:已报告位置(apt.cpp 第 6、10–12、22 行)均为纯注释行,其邻域代码(第 29–47 行)逻辑正确、调用链闭合。tiling_key.h 全部代码(第 11–37 行)include guard、宏定义、模板声明均无误。未发现第二个独立缺陷。

审查总结

文件 审查结果
image/points_in_polygons/op_kernel/arch35/points_in_polygons_tiling_key.h 无问题
image/points_in_polygons/op_kernel/points_in_polygons_apt.cpp 1 个 P3 注释不一致问题
image/points_in_polygons/tests/.gitkeep 无问题(空占位文件)
  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 1

整体风险判断:低。 唯一的发现是 apt.cpp 中多处注释将 sub-kernel 数量误写为 2(实际为 3),属于文档准确性问题,不影响编译和运行时正确性。两个文件的代码逻辑一致、模板声明正确、调用链闭合。

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

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月12日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月12日 评论:

CLA Signature Pass

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

likedislike
此处折叠了337条消息 查看更多
CANN-robotCANN-robot成员
8月17日 添加了label:lgtm
chenjiao成员
8月18日 评论:

/approve

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