Closed
[Documentation|文档反馈]: [aclnnInplaceSin] selfRef dtype 支持面三处不一致(资料 3 种/头文件 11 种/实测 6 种)且 161002 错误码把 format 写进 dtype 校验 #4212
liuhanwen8Add on  12 days agoClosed at  7 days ago
liuhanwen8
liuhanwen8
12 days ago Create

现象

aclnnInplaceSin 的 selfRef 数据类型支持面,资料参数表、头文件注释、实现三处互不一致,
另有一处错误码声明与实现不符:

# 问题 资料/头文件声明 实测(CANN 9.2.0 / Atlas A3)
1 参数表少写 3 种已支持 dtype 只列 FLOAT、BFLOAT16、FLOAT16 fp64、complex64、complex128 两段均 0/0,输出与 CPU 参考一致(fp64 相对误差 <1e-15)
2 头文件注释既多又少 列 11 种,含 DOUBLE/COMPLEX64/COMPLEX128、漏 BFLOAT16 支持面 = {FLOAT, FLOAT16, BFLOAT16, DOUBLE, COMPLEX64, COMPLEX128};多写的 6 种整型/bool 全返 161002
3 错误码表把「数据格式」列入 161002 161002:selfRef 数据类型和数据格式不在支持的范围之内 FRACTAL_NZ、NDHWC、FRACTAL_Z 均 0/0 且结果正确;源码 CheckParamsSin 对非 ND 只 OP_LOGW

三处口径成环:参数表 3 种 / 头文件 11 种 / 实测 6 种。信参数表漏用 fp64 与 complex;
信头文件会拿整型去调、白等一个 161002。

期望

  • 参数表 selfRef「数据类型」列补 DOUBLE、COMPLEX64、COMPLEX128;
  • 头文件 @param selfRef 注释改成与之一致的 6 种(补 BFLOAT16、删 INT8/INT16/INT32/INT64/UINT8/BOOL);
  • 错误码表删掉「数据格式」,或改为「仅支持 ND,非 ND 只告警并按 ND 解释」;若要求拒绝,
    需把 CheckParamsSin 的 OP_LOGW 改成返回 ACLNN_ERR_PARAM_INVALID。

环境

  • 基线:cann/ops-math@b7fe8ad85b879ec4ad7d358c19bddd26fe85e181(git ls-remote --heads origin 的 master)
  • 资料 sha256:a949bff62eff37ea8b049c7bf309ec5396fd0c14c4311dbfb526b2382ef5a0f8
    (git show b7fe8ad:math/sin/docs/aclnnSin&aclnnInplaceSin.md | sha256sum 与本地检出逐字节一致)
  • 硬件:Atlas A3(IT22HMDA_4_S),8 NPU / 16 device,npu-smi 26.1.1
  • 软件:CANN 9.2.0(toolkit + A3-ops),Python 3.12.15,torch 2.12.0+cpu / torch_npu

文档链接

问题文档片段

片段 1(参数表 selfRef 行「数据类型」列):FLOAT、BFLOAT16、FLOAT16

片段 2(同一节错误码表):ACLNN_ERR_PARAM_INVALID | 161002 | selfRef数据类型和数据格式不在支持的范围之内。

片段 3(头文件 aclnn_sin.h 的 @param selfRef 注释):

数据类型支持INT8、INT16、INT32, INT64, UINT8、BOOL、FLOAT、FLOAT16、
DOUBLE、COMPLEX64、COMPLEX128

存在的问题

即「现象」表 3 条:① 参数表漏声明 DOUBLE/COMPLEX64/COMPLEX128;② 头文件注释多写 6 种整型/bool
且漏 BFLOAT16;③ 错误码表把 format 纳入 161002 而实现只告警。三条均属资料/注释写错,
实测不产生错误结果,故按文档问题报(P2)。

复现步骤

  1. A3 + CANN 9.2.0 环境 source /usr/local/Ascend/ascend-toolkit/set_env.sh,运行 python3 repro_inplacesin_doc.py;
  2. 对照输出:fp64/complex64/complex128 的 rc1/rc2 均为 0,三种非 ND 格式 rc1 均为 0,int32/bool 的 rc1 为 161002;
  3. 与 md 参数表(3 种)、md 错误码表(format 应 161002)、头文件注释(11 种)三方比对。

复现脚本

source /usr/local/Ascend/ascend-toolkit/set_env.sh
python3 repro_inplacesin_doc.py

实测输出(python3 repro_inplacesin_doc.py; echo EXIT=$?):

[D1] 资料 selfRef dtype 声明:'FLOAT、BFLOAT16、FLOAT16'
[D1] fp64        接受(rc=0/0)
[D1] complex64   接受(rc=0/0)
[D1] complex128  接受(rc=0/0)
[D1] int32       拒绝 rc1=161002(资料未声明,符合契约)
[D1] bool        拒绝 rc1=161002(资料未声明,符合契约)
[D2] format=FRACTAL_NZ  rc=0/0(资料错误码表声明非 ND 应 161002)
[D2] format=NDHWC       rc=0/0(资料错误码表声明非 ND 应 161002)
[D2] format=FRACTAL_Z   rc=0/0(资料错误码表声明非 ND 应 161002)
[D3] 头文件 aclnnInplaceSin 注释:含 DOUBLE=True,含 BFLOAT16=False
==== 结论 ====
  [缺陷] D1: fp64/complex64/complex128 被接受(资料未声明)
  [缺陷] D2: FRACTAL_NZ/NDHWC/FRACTAL_Z 未按资料返回 161002(ret rc1=0)
  [缺陷] D3: 头文件注释列 DOUBLE 却漏 BFLOAT16(与 md 及实测三方不一致)
退出码 1(缺陷成立)
EXIT=1

退出码语义:0=资料与实现一致、1=缺陷成立、2=无法判定。

影响

按参数表只能看到 3 种 dtype,fp64 与 complex64/128 这两类实测可用的能力没有出口;
按头文件注释写代码会传整型/bool 而拿到 161002(注释引导踩坑);按错误码表预期「非 ND 报 161002」
的调用方会写出多余分支,并误判 ND 是强制约束。

建议

按「期望」三处同步改齐,使 md 参数表 / 头文件注释 / 实现白名单 三方一致;并在 op_api 单测里加
一条「dtype 白名单与 md 参数表一致」的断言,避免再次漂移。

与既有 issue 的关系(查重结论)

  • #4210([aclnnSin] FLOAT16 精度保证范围写成 [-10^7,10^7]):本资料「约束说明」把三种 dtype
    写成同一范围而 fp16 上界仅 65504 —— 该段落双接口共用,已由 #4210 覆盖,本单不重复提。
  • #4146([InplaceSinh] 头文件注释声明 selfRef 支持 6 种整型/bool,实测全返 161002):
    同族但接口不同;本单除「多写 6 种整型」外还有「漏写 BFLOAT16」「参数表少写 DOUBLE/COMPLEX」。
  • #4147([InplaceSinh] 错误码表参数名写成 cost/p 且缺「维度大于8」子项):本接口的
    「维度大于8」子项存在且实测一致(rank 9、10 均 161002),本单讲的是 format 被纳入 161002。
  • #4200([aclnnInplaceAtan2] 的 selfRef 表外 dtype 未拒绝):同「实现宽于资料」形态、不同接口,
    本单放行的是资料没写的 dtype,属漏声明。

附带说明(不属本单)

同批 1000 条六维用例在 A3 上:精度 906/906 通过、确定性 230 条逐位一致、错误码 3/3 匹配、
886,577 次并发无异常,未发现功能缺陷。另注:Sin kernel 退出时 VECTOR_MASK_0/1、CTRL[56] 未复位,
VECTOR_MASK_0 残留值等于元素数(64/1024/256/32/16 逐一对应),与 #4201(Mod)、#7659(FastGelu)
同一指纹,本批未观测到数值后果,仅作线索登记。

likedislike
陈思
陈思Collaborators
11 days ago Comments:

您好,感谢反馈!

问题分析

按 cann/ops-math@ae087b184300bbbf175e6d2e5825ed966638d15f 核对,您指出的文档和头文件注释差异仍然存在,相关文件与报告基线 b7fe8ad85b879ec4ad7d358c19bddd26fe85e181 一致,报告提供的文档 SHA256 也相符。

aclnnInplaceSinGetWorkspaceSize 参数表 确实只列 FLOAT、BFLOAT16、FLOAT16;头文件注释 列出了六种整型/BOOL 和五种浮点/复数类型,遗漏了 BFLOAT16。实际前端校验 先执行独立的 CheckInplaceDtypeValid,其名单不含 INT8、INT16、INT32、INT64、UINT8、BOOL,因此这些类型会在第一段返回 161002,不能套用非原地 aclnnSin 接收整型后转 FLOAT 计算的说明。

类型名单还受产品分支影响:GetDtypeSupportListV2 对 DAV_2201 或 IsRegBase 分支选择 FLOAT、FLOAT16、BFLOAT16、DOUBLE、COMPLEX64、COMPLEX128,其余分支选择不含 BFLOAT16 的五种类型。因此文档应同时交代产品限制,不能把六种类型不加条件地写成所有产品的统一支持面。您在 Atlas A3/CANN 9.2.0 上提供的六种类型及计算正确性结果目前依据报告中的实测记录;本轮核查确认的是源码校验与文档的差异。

格式方面,Inplace 接口以同一 selfRef 作为输入输出,继续进入 CheckParamsSin;该函数对非 ND 存储格式只记录告警,没有因为“非 ND”直接返回 161002。这与错误码表将“数据格式不在支持范围”笼统列为该返回条件存在口径差异。但未在这里拒绝某个格式,不等于承诺该格式在所有形状和实际存储布局下都可正确执行;后续仍有连续化、格式适配和写回流程,不能由这几组成功用例推出“所有非 ND 都按 ND 解释”。

调整方向

一个可行的修订方向是按产品同步参数表与头文件中的 Inplace 类型说明:补充 DOUBLE、COMPLEX64、COMPLEX128,去掉 Inplace 不接受的六种整型/BOOL,并明确 BFLOAT16 的产品条件;同时保留原有维度不大于 8 等约束。

错误码说明可以更精确地对应现有前置检查,区分“文档声明的 ND 使用范围”和“非 ND 在该检查处仅告警”的行为。若考虑将非 ND 改为强制拒绝,那属于接口行为调整,需要另行评估既有调用的兼容性。您建议的防漂移校验也可以考虑按产品分支覆盖类型接受与拒绝规则,避免仅按文字列表比较而遗漏 BFLOAT16 的平台条件。我们会继续确认这些资料边界,并跟踪文档与注释的一致性问题。

likedislike
陈思陈思Collaborators
11 days ago Assign chen_0715 as responsible person
陈思陈思Collaborators
11 days ago Added label: pending-confirmation
陈思陈思Collaborators
11 days ago Removed label: pending-confirmation
CchenyifengCollaborators
11 days ago Assign gcw_SUaZx3UQ as responsible person
CchenyifengCollaborators
11 days ago Removed responsible person chen_0715
Zzhangqijia1Collaborators
8 days ago Associated pull request
CANN-robotCANN-robotCollaborators
7 days ago Close issue
CANN-robotCANN-robotCollaborators
7 days ago Added label: resolved