已关闭
[Documentation|文档反馈]: aclnnBitwiseNot 头文件注释写 out 数据类型可转换,资料与实现要求严格一致 #3950
liuhanwen8创建于  10 天前关闭于  6 天前
liuhanwen8
liuhanwen8
10 天前 创建

一、文档链接 (必填)

https://gitcode.com/cann/ops-math/blob/master/math/bitwise_not/docs/aclnnBitwiseNot.md
https://gitcode.com/cann/ops-math/blob/master/math/bitwise_not/op_api/aclnn_bitwise_not.h

二、问题文档片段 (必填)

math/bitwise_not/docs/aclnnBitwiseNot.md:93「shape与self相同,数据类型需要与self一致。」
math/bitwise_not/op_api/aclnn_bitwise_not.h:43「数据类型需要是self可转换的数据类型」

现象

同一接口三处口径不一致:

来源 口径
资料 md:93 out dtype 与 self 一致
头文件注释 .h:43 out dtype 是 self 可转换的类型
实现 op_api/aclnn_bitwise_not.cpp:82 OP_CHECK_DTYPE_NOT_MATCH(self, y->GetDataType(), return false) 严格相等

实测 self=INT16、out=INT32(两个类型都在 :84/:94 的支持列表内,且 INT16 可转换到 INT32)时首段直接返回 161002,错误信息 Tensor self expected dtype is DT_INT32 but found DT_INT16.:实现与 md:93 一致,头文件注释「可转换」与两者冲突。

期望

头文件注释改为「数据类型需要与 self 一致」,与 md:93、op_api:82 对齐;若要支持可转换 dtype,需同时改资料与实现。

环境

  • cann/ops-math master,commit 584b2ea6cbaeba684a51a74296d82d4d50ab3b0f(2026-10-24)
  • Atlas A2 910B2(8 卡),CANN 9.2.0 + ops 9.2.0
  • 同接口既有 issue #3936 是 self 空指针返回 561103,与本条(dtype 契约措辞)不同

复现步骤

  1. git clone https://gitcode.com/cann/ops-math && cd ops-math
  2. 存下方脚本为 probe.cpp
  3. g++ -std=c++17 -O2 probe.cpp -o probe -I$ASCEND_HOME_PATH/include -I$ASCEND_HOME_PATH/include/aclnnop -L$ASCEND_HOME_PATH/lib64 -lascendcl -lopapi -lnnopbase
  4. export LD_LIBRARY_PATH=$ASCEND_HOME_PATH/lib64:/usr/local/Ascend/driver/lib64:$LD_LIBRARY_PATH; ./probe
  5. 比对第 2、3 行的首段返回码与 .h:43 的「可转换」口径

复现脚本

对照组 self/out 同 dtype,缺陷组按头文件口径传可转换 dtype:

// build: g++ -std=c++17 -O2 probe.cpp -o probe -I$ASCEND_HOME_PATH/include -I$ASCEND_HOME_PATH/include/aclnnop \
//        -L$ASCEND_HOME_PATH/lib64 -lascendcl -lopapi -lnnopbase
#include <cstdio>
#include <vector>
#include "acl/acl.h"
#include "aclnnop/aclnn_bitwise_not.h"
static aclrtStream gStream;
static aclTensor* Mk(const std::vector<int64_t>& s, aclDataType dt) {
  size_t n = 1; for (auto v : s) n *= v;
  void* d = nullptr; aclrtMalloc(&d, n * 2, ACL_MEM_MALLOC_HUGE_FIRST);
  std::vector<int16_t> h(n, 0);
  aclrtMemcpy(d, n * 2, h.data(), n * 2, ACL_MEMCPY_HOST_TO_DEVICE);
  std::vector<int64_t> st(s.size(), 1);
  return aclCreateTensor(s.data(), s.size(), dt, st.data(), 0, ACL_FORMAT_ND, s.data(), s.size(), d);
}
static void Run(const char* tag, aclDataType sdt, aclDataType odt) {
  std::vector<int64_t> shp = {4, 2};
  aclTensor* self = Mk(shp, sdt); aclTensor* out = Mk(shp, odt);
  uint64_t ws = 0; aclOpExecutor* ex = nullptr;
  aclnnStatus r1 = aclnnBitwiseNotGetWorkspaceSize(self, out, &ws, &ex);
  void* wsa = nullptr;
  if (r1 == ACL_SUCCESS && ws > 0) aclrtMalloc(&wsa, ws, ACL_MEM_MALLOC_HUGE_FIRST);
  aclnnStatus r2 = (r1 == ACL_SUCCESS) ? aclnnBitwiseNot(wsa, ws, ex, gStream) : r1;
  printf("%-34s first=%-6d second=%-6d\n", tag, (int)r1, (int)r2);
  if (r1 != ACL_SUCCESS) printf("    err: %s\n", aclGetRecentErrMsg());
  aclDestroyTensor(self); aclDestroyTensor(out);
}
int main() {
  aclInit(nullptr); aclrtSetDevice(0); aclrtCreateStream(&gStream);
  Run("对照: self=INT16 out=INT16", ACL_INT16, ACL_INT16);
  Run("缺陷: self=INT16 out=INT32", ACL_INT16, ACL_INT32);
  Run("缺陷: self=INT32 out=INT64", ACL_INT32, ACL_INT64);
  aclrtDestroyStream(gStream); aclrtResetDevice(0); aclFinalize();
  return 0;
}

实测输出(err 行保留原文,仅省略 PID 与时间戳前缀):

对照: self=INT16 out=INT16       first=0      second=0
缺陷: self=INT16 out=INT32       first=161002 second=161002
    err: Tensor self expected dtype is DT_INT32 but found DT_INT16.
缺陷: self=INT32 out=INT64       first=161002 second=161002
    err: Tensor self expected dtype is DT_INT64 but found DT_INT32.

影响

使用者按头文件注释传「可转换」dtype(如 INT16→INT32)会被 161002 拒绝,错误信息还指向 self,定位成本高;两份公开文档口径相反,无法判定以哪份为准。

建议

统一为「out 数据类型需要与 self 一致」;若后续要放开转换,再同步修改 md:93 与 op_api:82。

likedislike
liuhanwen8liuhanwen8
10 天前 添加了label:documentation
陈思
陈思成员
9 天前 评论:

您好,感谢反馈!已核对提交 584b2ea6,头文件注释确实写成了输出是 self 可转换的类型,而参数资料要求二者类型一致。实现也直接检查 self 与 out 类型相等,不相等时首段返回 161002。因此,INT16→INT32 等组合即使通常可以转换,也不满足当前接口约束;这与报告的首段返回码相符,本次未新增硬件复测。

建议将该处头文件表述改为“数据类型需要与 self 一致”,对齐现有资料和实现。后续若要扩展为允许类型转换,需要单独评估并同步修改接口约束与实现。本条与 #3936 的空指针错误码映射位置不同,可分别跟踪。后续将继续核对并跟踪头文件注释与公开资料的一致性。

likedislike
陈思陈思成员
9 天前 将 chen_0715 设为负责人
陈思陈思成员
9 天前 添加了label:pending-confirmation
陈思陈思成员
9 天前 删除了label:pending-confirmation
Nice tryNice try成员
8 天前 将 Nice_try 设为负责人
Nice tryNice try成员
7 天前 关联了pull request:[WIP]fix some docs
CANN-robotCANN-robot成员
6 天前 关闭了 issue
CANN-robotCANN-robot成员
6 天前 添加了label:resolved