Closed
[Documentation|文档反馈]: aclnnInplaceCos 头文件注释写成「反余弦/tan^-1」且 @param 列了签名里没有的 input/out #4211
liuhanwen8Add on 12 days agoClosed at 1 day ago
陈思
11 days ago Comments:
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;其他产品需保留相应差异,不能直接套用非原地输入名单。这属于注释对齐问题,现有证据没有表明实际执行成了反余弦或反正切。我们会继续跟踪资料的一致性。


11 days ago Assign chen_0715 as responsible person
11 days ago Added label: pending-confirmation
11 days ago Removed label: pending-confirmation
11 days ago Assign sakuraqqz as responsible person
11 days ago Removed responsible person chen_0715
1 day ago Close issue
1 day ago changed custom state from 进行中 to 已完成
1 day ago Added label: resolved
现象
aclnn_cos.h里aclnnInplaceCosGetWorkspaceSize的函数注释与本接口的真实语义、真实签名两处不符:out_{i}=tan^{-1}(input_{i})out_i = cos(input_i)@param段input与out两个 tensoraclTensor* 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:aclnnCos注释写的是「对输入矩阵的每一个元素求余弦后输出」「out_{i}=cos(input_{i})」;math/cos/op_api/aclnn_cos.cpp:190-196把inputRef直接当out传入执行体,内部调l0op::Cos(余弦核);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)。环境
179.162.4.2,单卡npu:1)cann/ops-mathmaster9bff1815(2026-10-29)复现步骤
doc_repro_inplacecos_header.pypython3 doc_repro_inplacecos_header.py .[DEFECT],退出码1实测输出:
复现脚本
#!/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())