Pull Request已成功合入, 合并人@CANN-robot
(感谢 镜花水月1tachi 的贡献)变更摘要
本 PR 为 Atlas A2(Ascend910B / DAV_2201)平台新增 AcosGradV2 算子,实现前向 Acos 的反向梯度计算,公式为 z = -dy / sqrt(1 - y^2)。整个算子完全新增于 experimental/math/acos_grad_v2/ 目录下,包含标准的 ACLNN 注册-调用工程结构(op_host / op_kernel / op_api / aclnn),支持 FP32 / FP16 / BF16 三种数据类型和 ND 格式,仅注册 ascend910b 平台。Kernel 采用 Ascend C 向量 API 实现,FP16/BF16 路径先转为 FP32 计算再转回,FP32 路径直接计算。
主要改动
-
算子定义与注册:在
op_host/acos_grad_v2_def.cpp中定义AcosGradV2OpDef,声明 y(前向输入)、dy(上游梯度)、z(输出梯度)三个张量的数据类型(FP16/FP32/BF16)、格式(ND)及 AiCore 配置,仅通过AddConfig("ascend910b", ...)注册 A2 平台。 -
形状与类型推导:
op_host/acos_grad_v2_infershape.cpp实现InferShape4AcosGradV2,将输出 z 的 shape 直接设为输入 y 的 shape,确保三者 shape 一致。 -
Tiling 切分逻辑:
op_host/arch32/acos_grad_v2_tiling.cpp实现AcosGradV2TilingFunc,根据 UB 大小(184KB)、元素对齐(512)、数据类型等信息计算 block 数量、UB 分块大小等参数,写入AcosGradV2TilingData结构体并通过ASCENDC_TPL_SEL_PARAM按 dtype 选择模板实例。 -
Ascend C Kernel 实现:
op_kernel/arch32/acos_grad_v2.h提供泛型模板KernelAcosGradV2<T>(FP16/BF16:Cast→FP32 计算→Cast 回原类型)和float全特化版本(直接 FP32 计算,省去 Cast),核心计算流程为Mul→Muls(-1)→Adds(1)→Sqrt→Muls(dy, -1)→Div,通过双缓冲TQue和PipeBarrier实现流水线并行。 -
ACLNN L0/L2 API:
op_api/acos_grad_v2.cpp实现l0op::AcosGradV2()(形状推导→平台/dtype 校验→AiCore 调度),op_api/aclnn_acos_grad_v2.cpp实现aclnnAcosGradV2GetWorkspaceSize和aclnnAcosGradV2(参数校验→Contiguous→ViewCopy→计算执行),对外暴露标准 ACLNN 接口。


代码审查
审查总结
| 优先级 | 数量 |
|---|---|
| P0 | 0 |
| P1 | 0 |
| P2 | 3 |
| P3 | 1 |
各文件审查结果:
| 文件 | 结论 |
|---|---|
CMakeLists.txt |
无问题 |
README.md |
无问题 |
docs/design.md |
无问题 |
examples/test_aclnn_acos_grad_v2.cpp |
P2: 资源泄漏(多条错误返回路径未释放已分配资源) |
op_api/aclnn_acos_grad_v2.cpp |
无问题 |
op_api/aclnn_acos_grad_v2.h |
无问题 |
op_api/acos_grad_v2.cpp |
P2: AllocTensor 返回值缺少空指针检查 |
op_api/acos_grad_v2.h |
无问题 |
op_host/acos_grad_v2_def.cpp |
无问题 |
op_host/acos_grad_v2_infershape.cpp |
无问题 |
op_host/arch32/acos_grad_v2_tiling.cpp |
无问题 |
op_kernel/arch32/acos_grad_v2.cpp |
无问题 |
op_kernel/arch32/acos_grad_v2.h |
P2: FP32 特化 Compute 中 Div 后缺少 PipeBarrier |
op_kernel/arch32/acos_grad_v2_tiling_data.h |
无问题 |
op_kernel/arch32/acos_grad_v2_tiling_key.h |
无问题 |
tests/reports/performance_report.md |
P3: 顶部残留文本 "zui" |
tests/reports/precision_report.md |
无问题 |
tests/st/design/03_参数定义.yaml |
无问题 |
tests/st/design/04_测试因子.yaml |
无问题 |
tests/st/design/05_约束定义.yaml |
无问题 |
tests/st/design/06_求解配置.yaml |
无问题 |
tests/st/design/07_因子值.csv |
无问题(空占位文件) |
tests/st/testcases/aclnnAcosGradV2_l0_coverage_report.yaml |
无问题 |
tests/st/testcases/aclnnAcosGradV2_l0_test_cases.csv |
无问题 |
tests/st/testcases/aclnnAcosGradV2_l1_test_cases.csv |
无问题 |
整体风险评估:中低风险。 三个 P2 问题均不会在正常执行路径上触发(AllocTensor 失败极为罕见、示例代码的错误路径在实际运行中不会走到、缺少 PipeBarrier 的 FP32 路径当前精度测试全通过),但建议修复以提升代码健壮性和一致性。算子核心计算逻辑(tiling 切分、kernel 公式实现)正确,精度与性能验证均达标。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 3 |
💬 仅评论


/check-pr


The MR can not be merged, because of CodeReview discussion not resolved
If you want to solve this problem, you can click here to do it in the FAQs.


描述
新增AcosGrad反向梯度算子的A2(Ascend 910B / DAV_2201)适配版本AcosGradV2,实现以下功能:
关联的Issue
https://gitcode.com/cann/ops-math/issues/2499
测试
已完成以下验证:
CI/工程验证:
精度测试详情(ATK,300条,high_performance 标准):
性能测试详情(加速比,标杆 = torch_npu 的 torch.acos 反向多算子链):
文档更新
类型标签