已合并
iou3d算子支持ascend950 ascendc实现 #1119
yulianjie创建于 7月13日
iou3d算子支持ascend950 ascendc实现 #1119
已合并
yulianjie创建于 7月13日
yulianjie
7月13日

描述

iou3d算子支持ascend950 ascendc实现

关联的Issue

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

测试

文档更新

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 yulianjie 的贡献)
Yyulianjie
7月13日 创建了 pull request,commit 220efd63
Yyulianjie
7月13日 关联了issue:[Requirement|需求建议]: iou3d算子支持ascend950 ascendc实现
atomgit-bot
atomgit-bot
7月13日 评论:

变更摘要

此 PR 为 Iou3D(3D 旋转框 IoU)算子新增了面向 Ascend950(arch35 / DAV_3510)芯片的 AscendC 实现。整体架构遵循 "算子定义 → 原型注册 → Tiling 切分 → Kernel 计算" 的规范流程:通过 REG_OP 注册 Iou3D 原型,在 Host 侧 Iou3DTilingFunc 中完成多核均分切分、UB 批粒度控制及空 Tensor 短路(TPL_EMPTY),在 Device 侧 iou3d.h 主模板中实现完整几何路径——BEV 旋转顶点投影、交集多边形收集、硬件 Sort32 极角排序、有符号鞋带面积、Z 轴重叠计算与 IoU 归约,并包含多处数值稳定性守卫。同时提供了 GE IR 图模式的两个测试示例及平台二进制配置。

主要改动

  • 算子原型与定义: 在 iou3d_proto.h 中通过 REG_OP(Iou3D) 注册算子(双 float32 输入 bboxes[B,7,N] / gtboxes[B,7,K],单输出 iou[B,N,K]);在 iou3d_def.cpp 中通过 OpDef 声明输入输出与 ascend950 平台的 AICore 配置。

  • Host 侧 Tiling 策略: iou3d_tiling_arch35.cppIou3DTilingFunc 实现多核切分(总 (b,i,j) 对数按 coreNum 均分)、UB 批处理(IOU3D_TILE_LEN=256)、形状校验(channel==7、同 batch、K≤2000)及空 Tensor(N==0 || K==0)时 TPL_EMPTY 短路,并通过 GetSortTmpSize 精算极角排序临时 buffer。

  • Kernel 核心几何计算: iou3d.h 中的 Iou3D<T,IS_EMPTY> 模板类实现逐对 IoU 完整路径——BoxCorners 旋转 BEV 顶点投影、PointInRect 向量投影法包含测试、SegIntersect 参数化线段求交(修复 θ=π 伪交点)、CollectCorners 幅值相对去重、SortPolygonArea 使用硬件 Sort32 极角排序 + 有符号鞋带面积,以及 ComputePairIou 中 Z 轴重叠 clamp 和 epsilon 除法守卫。

  • 空 Tensor 与多 TilingKey: iou3d_tiling_key.h 通过 ASCENDC_TPL_ARGS_DECL 声明 IS_EMPTY(0/1)两键,iou3d_empty.h 与主模板中 if constexpr (IS_EMPTY != 0) 实现空 Tensor 短路,无需分配 UB 或执行计算。

  • 形状推导与平台配置: iou3d_infershape.cpp 推导输出形状 [B,N,K] 和 dtype;iou3d_binary.json 定义 ascend950 平台的二进制算子输入输出描述;iou3d_simplified_key.ini 配置 simplified_key_mode=0

likedislike
atomgit-bot
atomgit-bot
7月13日 评论:

代码审查

审查结束 — 关闭摘要

我已逐文件审查了全部 17 个变更文件,结果如下:

文件 审查结论
docs/zh/op_list.md 无问题
objdetect/iou3d/CMakeLists.txt 发现 1 个 P3 问题(file(GLOB) 反模式)
objdetect/iou3d/README.md 无问题
objdetect/iou3d/examples/arch35/test_geir_iou3d.cpp 发现 1 个 P0(错误 include 路径)、1 个 P2(空指针)、1 个 P3(忽略返回值)
objdetect/iou3d/examples/test_geir_iou3d.cpp 发现 1 个 P2(空指针)、1 个 P3(忽略返回值)
objdetect/iou3d/op_graph/fusion_pass/.gitkeep 无问题
objdetect/iou3d/op_graph/iou3d_proto.h 无问题
objdetect/iou3d/op_host/arch35/iou3d_tiling_arch35.cpp 发现 1 个 P3(未使用变量 ubSize
objdetect/iou3d/op_host/config/ascend950/iou3d_binary.json 无问题
objdetect/iou3d/op_host/config/ascend950/iou3d_simplified_key.ini 无问题
objdetect/iou3d/op_host/iou3d_def.cpp 无问题
objdetect/iou3d/op_host/iou3d_infershape.cpp 无问题
objdetect/iou3d/op_kernel/arch35/iou3d.h 无问题(核心 kernel 逻辑正确,整数提升、边界检查、同步均到位)
objdetect/iou3d/op_kernel/arch35/iou3d_empty.h 无问题
objdetect/iou3d/op_kernel/arch35/iou3d_tiling_data.h 发现 1 个 P3(死字段 tailLen/coreNum
objdetect/iou3d/op_kernel/arch35/iou3d_tiling_key.h 无问题
objdetect/iou3d/op_kernel/iou3d.cpp 无问题

统计:P0 = 1,P2 = 2,P3 = 4,总计 7 个发现。

总体风险判断: 必须修复 P0 编译错误(arch35 示例的 include 路径),否则 examples/arch35/test_geir_iou3d.cpp 无法编译。其余 P2/P3 为测试代码防御性缺失和代码清洁度问题,不影响核心算子正确性。Kernel 侧几何计算逻辑、整数溢出防护、TilingKey 声明、并发同步(PipeBarrier 成对使用)均经过严格审查,未发现正确性或安全性缺陷。

类型 数量
🔴 阻塞 1
🟡 建议 5

⛔ 需要修改

likedislike
CANN-robotCANN-robot成员
7月13日 添加了label:cann-cla/yes
此处折叠了171条消息 查看更多
CANN-robotCANN-robot成员
7月27日 添加了label:approved
zhangzijie成员
29 天前 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
29 天前 添加了label:lgtm
CANN-robotCANN-robot成员
29 天前 关闭了关联的issue
CANN-robotCANN-robot成员
29 天前 合入了pull request