Closed
[Documentation|文档反馈]: aclnnCat 参数表声明 1-8 维,错误码表漏列「维度大于8」(实测 rank=9 返回 161002) #3885
liuhanwen8Add on  17 days agoClosed at  14 days ago
liuhanwen8
liuhanwen8
17 days ago Create

现象

aclnnCat 资料参数表写明 tensors 维度为 1-8,但「第一段接口完成入参校验」的错误码表
(161002 共 5 条子项:dtype/format 不在支持范围、无法做数据类型推导、推导类型无法转为
out、非级联维度 shape 不一致、dim 超过 tensor 维度范围)没有「维度大于 8」这一项。
实测 rank=9 时第一段返回 161002,该拒绝理由在资料里查不到。

单变量对照(两输入除 dim=0 外所有维度一致、dtype 相同、dim=0 在范围内,只有 rank 变化):

组 tensors 资料声明 实测 rc
对照 rank=8 两输入,dim=0 支持(1-8) 0
缺陷 rank=9 两输入,dim=0 未声明 161002

期望

资料错误码表的 161002 子项补齐「tensors 的维度大于 8」,与参数表 1-8 的声明一致。

环境

  • Atlas A2 训练系列(Ascend 910B2)× 1 卡;Ascend-cann-toolkit 9.2.0;ops-math master 584b2ea6cbae
  • 缺陷所在仓:cann/ops-math(conversion/concat_d)
  • 相关接口:aclnnMaxDim 存在同类缺失,已另行提交并互相引用

复现步骤

  1. 将下方「复现脚本」保存为 repro.cpp;
  2. g++ -std=c++17 -o repro repro.cpp -I$ASCEND_HOME_PATH/include/aclnnop -I$ASCEND_HOME_PATH/include -L$ASCEND_HOME_PATH/lib64 -lascendcl -lnnopbase -lopapi;
  3. ./repro;
  4. 观察对照行 rc=0、缺陷行 rc=161002。

复现脚本

#include <cstdio>
#include <vector>
#include "acl/acl.h"
#include "aclnnop/aclnn_cat.h"

static aclTensor* mk(const std::vector<int64_t>& sh, void** dev) {
  int64_t n = 1; for (auto s : sh) n *= s;
  size_t bytes = (size_t)n * 4;
  aclrtMalloc(dev, bytes, ACL_MEM_MALLOC_HUGE_FIRST);
  std::vector<float> host((size_t)n, 1.0f);
  aclrtMemcpy(*dev, bytes, host.data(), bytes, ACL_MEMCPY_HOST_TO_DEVICE);
  std::vector<int64_t> st(sh.size(), 1);
  for (int64_t i = (int64_t)sh.size() - 2; i >= 0; --i) st[i] = sh[i + 1] * st[i + 1];
  return aclCreateTensor(sh.data(), sh.size(), ACL_FLOAT, st.data(), 0, ACL_FORMAT_ND,
                         sh.data(), sh.size(), *dev);
}

static void case_rank(const char* tag, int rank) {
  std::vector<int64_t> a(rank, 1), b(rank, 1);
  a[0] = 2; b[0] = 1;                       // 仅 dim=0 不同,其余维一致
  std::vector<int64_t> out(rank, 1); out[0] = 3;
  void *da = nullptr, *db = nullptr, *dout = nullptr;
  aclTensor* ta = mk(a, &da);
  aclTensor* tb = mk(b, &db);
  aclTensor* to = mk(out, &dout);
  std::vector<aclTensor*> v{ta, tb};
  aclTensorList* list = aclCreateTensorList(v.data(), v.size());
  uint64_t ws = 0; aclOpExecutor* ex = nullptr;
  int rc = (int)aclnnCatGetWorkspaceSize(list, 0, to, &ws, &ex);
  printf("  %-34s rc=%d\n", tag, rc);
}

int main() {
  aclInit(nullptr); aclrtSetDevice(7);
  case_rank("对照 rank=8(资料称 1-8)", 8);
  case_rank("缺陷组 rank=9(资料称 1-8)", 9);
  return 0;
}

实测输出


影响

与 aclnnMaxDim 同类:rank 上限的验收口径不在资料里,测试者按资料设计的用例不含该负向
路径,实测 161002 只能记为未声明行为。

建议

在 conversion/concat_d/docs/aclnnCat.md 的 161002 折叠子项中新增一行
「tensors 的维度大于 8」,与参数表 1-8 对齐。

likedislike
陈思
陈思Collaborators
16 days ago Comments:

您好,感谢反馈!核对 cann/ops-math@584b2ea6cbaeba684a51a74296d82d4d50ab3b0f 的参数及错误码说明,参数表已声明 tensors 为 1–8 维,但 161002 的五项说明确实没有列出维数超过 8 的情况。缺项在错误码说明,不能据此把 rank=9 视为参数表支持的输入。

源码的 CheckShape先检查第一个输入的最大维数,再检查其余输入维数一致、dim 合法及非级联轴的形状一致。该检查失败由 CheckParams 映射为 ACLNN_ERR_PARAM_INVALID,随后第一段入口直接返回。因此,您给出的非空 rank=9 对照即使 dim=0 合法,也会因张量维数超限被拒;轴索引合法与张量维数满足上限是两项不同约束。

可行的资料修订是在 161002 下补充“tensors 中张量维数超过 8”,并将两处 rowspan="5" 同步调整为 6,与既有 1–8 维参数约束对齐。该修订不需要改变维数上限。以上为报告版本的源码核对,尚未独立运行设备复现;我们会继续确认资料补齐方式。

likedislike
陈思陈思Collaborators
16 days ago Assign chen_0715 as responsible person
陈思陈思Collaborators
16 days ago Added label: pending-confirmation
陈思陈思Collaborators
16 days ago Removed label: pending-confirmation
CchenyifengCollaborators
14 days ago Assign Anthony0331 as responsible person
CchenyifengCollaborators
14 days ago Removed responsible person chen_0715
TtangkaidiCollaborators
14 days ago Removed responsible person Anthony0331
TtangkaidiCollaborators
14 days ago Assign tangkaidi as responsible person
tangkaidiCollaborators
14 days ago Comments:

您好,感谢您的关注和反馈。
该issue内提及的问题已确认,将会尽快合入代码。
修复PR链接:https://gitcode.com/cann/ops-math/pull/6735

likedislike
CANN-robotCANN-robotCollaborators
14 days ago Close issue
CANN-robotCANN-robotCollaborators
14 days ago Added label: resolved