Merged
【社区任务】 Equal 算子 A2/A3 实现 #5425
【社区任务】 Equal 算子 A2/A3 实现 #5425
Merged
zed123214Add on Sep 8
zed123214
Sep 8

描述

新增 Equal 算子面向 Ascend A2/A3 的直接 Ascend C 实现,完善广播推形与 Tiling,覆盖同形、标量及通用广播路径;补充 A2/A3 支持说明和 aclnn 示例。

关联的Issue

Closes #3032

测试

  • A2(Ascend 910B)与 A3(Ascend 910_93)算子包构建通过。
  • AscendOpTest 扩展用例精度 306/306 通过。
  • 306 个用例与 TBE 性能对比均满足验收阈值。
  • 按官方 cannbot Ascend C 检视 skill 完成代码规范检查和整改。

文档更新

更新 README、A2/A3 产品支持说明及 aclnn Equal 文档。

类型标签

likedislike
Pull Request has been successfully merged by CANN-robot.
(Thank you for zed123214's contribution.)
zed123214zed123214
Sep 8 Created pull request, commit c52b4512
zed123214zed123214
Sep 8 Associated issue: [Requirement|需求建议]: 【社区任务】Equal算子Ascend C A2/A3实现
atomgit-bot
atomgit-bot
Sep 8 Comments:

变更摘要

本 PR 为 Equal 算子新增面向 Ascend A2/A3 的直接 Ascend C 实现(对应 equal_def.cpp 中 AICore 配置由仅 ascend910b 扩展为同时注册 ascend910_93)。核心改动是将原基于 big/small core 拆分、经减法/取绝对值等近似判等的 kernel 重写为按调度模式与广播模式分发的 KernelEqual<T, SCHEDULE_MODE>,并配套重写 host 端 Tiling 与 EqualTilingData 结构,以覆盖同形、标量及通用广播路径;op_api 层相应收敛为直接经 l0op::Equal 调用自研 AICore kernel,不再通过 NotEqual/LogicalNot 组合实现。PR 同时更新 README、A2/A3 产品支持说明及 aclnn Equal 文档(依据 PR 描述)。

主要改动

  • 内核重写为广播感知的模板实现(op_kernel/equal.h、op_kernel/equal.cpp):KernelEqual<T, SCHEDULE_MODE> 的 Init 改为直接接收 EqualTilingData,依据 op_kernel/equal_tiling_data.h 新增的 EqualBroadcastMode 枚举(EQUAL_BROADCAST_CONTIGUOUS、X1_SCALAR、X2_SCALAR、GENERAL、SANDWICH、TAIL_REUSE)选择计算路径;Process 按 ELEMENTWISE_TPL_SCH_MODE_0/1 分别走连续/广播流程,int64_t 通过 GatherMask 拆分高低 32 位字分别比较再相乘合并,各类 dtype 改用 Compare/Select 直接判等。
  • Host 端 Tiling 全面重写(op_host/equal_tiling.cpp):新增 BroadcastInfo 结构,实现广播 shape 压缩(相邻同状态维合并)、stride 计算与模式判定,按 dtype/模式计算 totalLength、blockLength、tailBlockLength、tileLength、blockNum 并填充新的 EqualTilingData 字段,同时新增 TrySetSandwichMode、TrySetTailReuseMode 等针对通用广播的优化路径,最终通过 context->SetTilingKey(GET_TPL_TILING_KEY(scheduleMode)) 向 kernel 下发调度模式。
  • 算子定义与 shape 推导改为广播语义(op_host/equal_def.cpp、op_host/equal_infershape.cpp):输入 x1/x2/输出 y 的支持 dtype 统一重构为 10 类列表(新增 DT_INT16、DT_INT64、DT_BOOL 等);InferShapeEqual 由「将输出 shape 置为 x1 shape」改为调用 Ops::Base::InferShape4Broadcast 完成广播推形。
  • op_api 层收敛到 l0op::Equal 直算路径(op_api/aclnn_eq_scalar.cpp、op_api/aclnn_eq_tensor.cpp、op_api/equal.cpp):删除 scalar 侧 GetCastedDouble、IsDoubleEqual 等组合比较辅助函数,删除描述 Contiguous→Cast→Equal→Cast→ViewCopy 多段组合流程的注释并注明连续与广播输入均由自研 AICore kernel 统一处理;Equal 的 AICore 支持 dtype 列表扩展(新增 DT_INT64、DT_INT16、DT_BOOL 等)并补充输出张量分配失败检查,inplace 入口新增 selfRef/other 空态一致性校验;equal.h 的 include guard 与头文件引用同步收敛到 experimental/math/equal 目录。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
Sep 8 Comments:

代码审查

✅ 未发现问题

likedislike
Incorrect?
CANN-robotCANN-robotCollaborators
Sep 8 Added label: cann-cla/yes
75 messages are collapsed here。 See more
CANN-robotCANN-robotCollaborators
Sep 14 Added label: ci-pipeline-passed
CANN-robotCANN-robotCollaborators
Sep 14 Merged pull request
zed123214zed123214
Sep 15 Modify description of pull request
zed123214zed123214
Sep 15 Modify description of pull request
zed123214zed123214
Sep 15 Modify description of pull request