Pull Request已成功合入, 合并人@CANN-robot
(感谢 yulianjie 的贡献)变更摘要
此 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.cpp中Iou3DTilingFunc实现多核切分(总(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。


代码审查
审查结束 — 关闭摘要
我已逐文件审查了全部 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 |
⛔ 需要修改


/lgtm


描述
iou3d算子支持ascend950 ascendc实现
关联的Issue
https://gitcode.com/cann/ops-cv/issues/617
测试
文档更新
类型标签