您好,感谢反馈!
问题分析
按 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 的平台条件。我们会继续确认这些资料边界,并跟踪文档与注释的一致性问题。


现象
aclnnInplaceSin的 selfRef 数据类型支持面,资料参数表、头文件注释、实现三处互不一致,另有一处错误码声明与实现不符:
FLOAT、BFLOAT16、FLOAT16fp64、complex64、complex128两段均0/0,输出与 CPU 参考一致(fp64 相对误差 <1e-15)161002:selfRef 数据类型和数据格式不在支持的范围之内FRACTAL_NZ、NDHWC、FRACTAL_Z均0/0且结果正确;源码CheckParamsSin对非 ND 只OP_LOGW三处口径成环:参数表 3 种 / 头文件 11 种 / 实测 6 种。信参数表漏用 fp64 与 complex;
信头文件会拿整型去调、白等一个 161002。
期望
DOUBLE、COMPLEX64、COMPLEX128;@param selfRef注释改成与之一致的 6 种(补 BFLOAT16、删 INT8/INT16/INT32/INT64/UINT8/BOOL);需把
CheckParamsSin的OP_LOGW改成返回ACLNN_ERR_PARAM_INVALID。环境
cann/ops-math@b7fe8ad85b879ec4ad7d358c19bddd26fe85e181(git ls-remote --heads origin的 master)a949bff62eff37ea8b049c7bf309ec5396fd0c14c4311dbfb526b2382ef5a0f8(
git show b7fe8ad:math/sin/docs/aclnnSin&aclnnInplaceSin.md | sha256sum与本地检出逐字节一致)文档链接
math/sin/docs/aclnnSin&aclnnInplaceSin.md(aclnnInplaceSin 段)https://gitcode.com/cann/ops-math/blob/master/math/sin/docs/aclnnSin%26aclnnInplaceSin.md
math/sin/op_api/aclnn_sin.h(aclnnInplaceSinGetWorkspaceSize的@param selfRef)问题文档片段
片段 1(参数表 selfRef 行「数据类型」列):
FLOAT、BFLOAT16、FLOAT16片段 2(同一节错误码表):
ACLNN_ERR_PARAM_INVALID | 161002 | selfRef数据类型和数据格式不在支持的范围之内。片段 3(头文件
aclnn_sin.h的@param selfRef注释):存在的问题
即「现象」表 3 条:① 参数表漏声明 DOUBLE/COMPLEX64/COMPLEX128;② 头文件注释多写 6 种整型/bool
且漏 BFLOAT16;③ 错误码表把 format 纳入 161002 而实现只告警。三条均属资料/注释写错,
实测不产生错误结果,故按文档问题报(P2)。
复现步骤
source /usr/local/Ascend/ascend-toolkit/set_env.sh,运行python3 repro_inplacesin_doc.py;fp64/complex64/complex128的rc1/rc2均为 0,三种非 ND 格式rc1均为 0,int32/bool的rc1为 161002;复现脚本
source /usr/local/Ascend/ascend-toolkit/set_env.sh python3 repro_inplacesin_doc.py实测输出(
python3 repro_inplacesin_doc.py; echo EXIT=$?):退出码语义:0=资料与实现一致、1=缺陷成立、2=无法判定。
影响
按参数表只能看到 3 种 dtype,
fp64与complex64/128这两类实测可用的能力没有出口;按头文件注释写代码会传整型/bool 而拿到 161002(注释引导踩坑);按错误码表预期「非 ND 报 161002」
的调用方会写出多余分支,并误判 ND 是强制约束。
建议
按「期望」三处同步改齐,使 md 参数表 / 头文件注释 / 实现白名单 三方一致;并在
op_api单测里加一条「dtype 白名单与 md 参数表一致」的断言,避免再次漂移。
与既有 issue 的关系(查重结论)
[aclnnSin] FLOAT16 精度保证范围写成 [-10^7,10^7]):本资料「约束说明」把三种 dtype写成同一范围而 fp16 上界仅 65504 —— 该段落双接口共用,已由 #4210 覆盖,本单不重复提。
[InplaceSinh] 头文件注释声明 selfRef 支持 6 种整型/bool,实测全返 161002):同族但接口不同;本单除「多写 6 种整型」外还有「漏写 BFLOAT16」「参数表少写 DOUBLE/COMPLEX」。
[InplaceSinh] 错误码表参数名写成 cost/p 且缺「维度大于8」子项):本接口的「维度大于8」子项存在且实测一致(rank 9、10 均 161002),本单讲的是 format 被纳入 161002。
[aclnnInplaceAtan2] 的 selfRef 表外 dtype 未拒绝):同「实现宽于资料」形态、不同接口,本单放行的是资料没写的 dtype,属漏声明。
附带说明(不属本单)
同批 1000 条六维用例在 A3 上:精度 906/906 通过、确定性 230 条逐位一致、错误码 3/3 匹配、
886,577 次并发无异常,未发现功能缺陷。另注:
Sinkernel 退出时VECTOR_MASK_0/1、CTRL[56]未复位,VECTOR_MASK_0残留值等于元素数(64/1024/256/32/16 逐一对应),与 #4201(Mod)、#7659(FastGelu)同一指纹,本批未观测到数值后果,仅作线索登记。