Closed
[Documentation|文档反馈]: aclnnInplaceCos 头文件注释写成「反余弦/tan^-1」且 @param 列了签名里没有的 input/out #4211
liuhanwen8Add on  12 days agoClosed at  1 day ago
liuhanwen8
liuhanwen8
12 days ago Create

现象

aclnn_cos.h 里 aclnnInplaceCosGetWorkspaceSize 的函数注释与本接口的真实语义、真实签名两处不符:

项 注释写的 实际
功能描述 「从输入矩阵的每一个元素进行反余弦操作后输出」 余弦
计算公式 out_{i}=tan^{-1}(input_{i}) out_i = cos(input_i)
@param 段 列 input 与 out 两个 tensor 签名只有 aclTensor* inputRef

原文(math/cos/op_api/aclnn_cos.h:62-84):

/**
 * @brief aclnnInplaceCos的第一段接口,根据具体的计算流程,计算workspace大小。
 * @domain aclnn_math
 * 功能描述:从输入矩阵的每一个元素进行反余弦操作后输出。
 * 计算公式:
 * out_{i}=tan^{-1}(input_{i})
 * 参数描述:
 * @param [in]   input
 * 输入Tensor,数据类型支持INT8,INT16,INT32,INT64,UINT8,BOOL,FLOAT,FLOAT16,DOUBLE,COMPLEX64,COMPLEX128。支持非连续Tensor,数据格式支持ND。
 * @param [in]   out
 * 输出Tensor,数据类型支持FLOAT,FLOAT16,DOUBLE。支持非连续Tensor,数据格式支持ND。
 * @param [out]  workspaceSize   返回用户需要在npu device侧申请的workspace大小。
 * @param [out]  executor         返回op执行器,包含了算子计算流程。
 * @return       aclnnStatus      返回状态码
 */
ACLNN_API aclnnStatus aclnnInplaceCosGetWorkspaceSize(aclTensor* inputRef, uint64_t* workspaceSize,
                                                      aclOpExecutor** executor);

三处佐证实现确实是余弦、且只需一个 inputRef:

  1. 同文件上方的 aclnnCos 注释写的是「对输入矩阵的每一个元素求余弦后输出」「out_{i}=cos(input_{i})」;
  2. 实现 math/cos/op_api/aclnn_cos.cpp:190-196 把 inputRef 直接当 out 传入执行体,内部调 l0op::Cos(余弦核);
  3. 资料 math/cos/docs/aclnnCos&aclnnInplaceCos.md 的 aclnnInplaceCos 参数表只有 inputRef 一行,功能说明为「对输入矩阵的每个元素进行余弦操作」。

实测也确认是余弦:aclnnInplaceCos 对 inputRef=1.0 输出 0.540302(= cos(1)),若为反余弦应为 0.000000(= acos(1))。

期望

注释与实现对齐:

  • 功能描述改为「对输入矩阵的每一个元素进行余弦操作后输出」,公式改为 out_{i}=cos(input_{i});
  • @param 段只保留 inputRef(输入/输出同体),删掉 input / out 两行;
  • inputRef 的 dtype 列表按实现白名单补全:实现走 GetDtypeSupportListV2(ASCEND910B_OUTPUT_DTYPE_SUPPORT_LIST, ASCEND910_OUTPUT_DTYPE_SUPPORT_LIST)(aclnn_cos.cpp:74-81),910B 分支实际放行 FLOAT/FLOAT16/DOUBLE/COMPLEX64/COMPLEX128/BFLOAT16,与注释写的「含 INT8/INT16/INT32/INT64/UINT8/BOOL」相反(实测 int8 返回 161002)。

环境

  • 硬件:Ascend 910B2(179.162.4.2,单卡 npu:1)
  • CANN 9.2.0(npu-smi 26.1.1)、TorchNPU 2.12.0.post3
  • 仓:cann/ops-math master 9bff1815(2026-10-29)

复现步骤

  1. 取本仓 master,将下方「复现脚本」存为 doc_repro_inplacecos_header.py
  2. 在仓根执行:python3 doc_repro_inplacecos_header.py .
  3. 观察输出:脚本打出 3 条 [DEFECT],退出码 1

实测输出:

[DEFECT] D-1 注释写成反余弦:含「反余弦」、公式 tan^{-1}(L62-76)
[DEFECT] D-2 @param 列了签名里不存在的形参 ['input', 'out'](注释 @param=['input', 'out'];签名 aclTensor*=['inputRef'])
[DEFECT] 佐证:(实现侧调 l0op::Cos,即余弦,与注释的 arccos 相反)
结论:aclnnInplaceCos 的头文件注释与实现/资料不一致,缺陷成立。

复现脚本

#!/usr/bin/env python3
# 退出码:0=资料符合预期 / 1=缺陷成立 / 2=无法判定
import io, os, re, sys

REL = "math/cos/op_api/aclnn_cos.h"

def main():
    root = sys.argv[1] if len(sys.argv) > 1 else "."
    path = os.path.join(root, REL)
    if not os.path.isfile(path):
        print("[UNKNOWN] 找不到 %s" % path); return 2
    lines = io.open(path, encoding="utf-8", errors="replace").read().splitlines()

    idx = next((i for i, ln in enumerate(lines) if "aclnnInplaceCos的第一段接口" in ln), None)
    if idx is None:
        print("[UNKNOWN] 注释块里找不到「aclnnInplaceCos的第一段接口」"); return 2
    start = idx
    while start > 0 and "/**" not in lines[start]:
        start -= 1
    end = idx
    while end < len(lines) - 1 and "*/" not in lines[end]:
        end += 1
    block = "\n".join(lines[start:end + 1])

    defects = []
    if "反余弦" in block or re.search(r"tan\^\{-1\}|tan\^-1", block):
        defects.append("D-1 注释写成反余弦(L%d-%d)" % (start + 1, end + 1))

    params = re.findall(r"@param\s*\[[^\]]*\]\s*(\w+)", block)
    sig = ""
    for ln in lines[end + 1:end + 6]:
        if "aclnnInplaceCosGetWorkspaceSize" in ln:
            sig = ln.strip(); break
    sig_params = re.findall(r"(?:const\s+)?aclTensor\s*\*\s*(\w+)", sig)
    skip = {"workspaceSize", "executor"}
    bad = sorted(set(params) - skip - set(sig_params))
    if bad:
        defects.append("D-2 @param 列了签名里不存在的形参 %s(签名 aclTensor*=%s)" % (bad, sig_params))

    impl = os.path.join(root, "math/cos/op_api/aclnn_cos.cpp")
    if os.path.isfile(impl) and "l0op::Cos(" in io.open(impl, encoding="utf-8", errors="replace").read():
        defects.append("佐证:实现侧调 l0op::Cos(余弦),与注释的 arccos 相反")

    for d in defects:
        print("[DEFECT] %s" % d)
    return 1 if defects else 0

if __name__ == "__main__":
    sys.exit(main())
likedislike
陈思
陈思Collaborators
11 days ago Comments:

您好,感谢反馈!核对 cann/ops-math@ae087b184,这几处头文件注释确实与原地余弦接口不一致:注释及声明同时出现“反余弦”、反正切公式和不存在的 input/out 参数;实际声明只有输入输出同体的 inputRef。原地实现在校验后把 inputRef 同时作为输入和输出复用 Cos 计算流程。

一个可行的资料修订方向是将功能和公式统一为原地余弦 inputRef_i ← cos(inputRef_i),用 [in,out] inputRef 描述替代独立的 input/out,并保留 workspaceSize、executor 等真实参数。类型说明也应按原地接口的产品支持列表整理:当前源码 910B 输出类型列表与原地校验包含 FLOAT、FLOAT16、DOUBLE、COMPLEX64、COMPLEX128、BFLOAT16,没有整型或 BOOL;其他产品需保留相应差异,不能直接套用非原地输入名单。这属于注释对齐问题,现有证据没有表明实际执行成了反余弦或反正切。我们会继续跟踪资料的一致性。

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 sakuraqqz as responsible person
CchenyifengCollaborators
11 days ago Removed responsible person chen_0715
SsakuraqqzCollaborators
6 days ago Associated pull request
CANN-robotCANN-robotCollaborators
1 day ago Close issue
CANN-robotCANN-robotCollaborators
1 day ago changed custom state from 进行中 to 已完成
CANN-robotCANN-robotCollaborators
1 day ago Added label: resolved