已关闭
[Documentation|文档反馈]: aclnnMaxV2 资料错误码表 161002 缺少「out 形状与归约推导不符」子项 #4262
liuhanwen8创建于  5 天前关闭于  2 天前
liuhanwen8
liuhanwen8
5 天前 创建

现象

docs/aclnnMaxV2.md 的「返回值」表格中,161002(ACLNN_ERR_PARAM_INVALID)只列出三个子项:

  • self 或 out 的数据类型不在支持的范围内
  • dims 数组中元素超出输入 tensor 的维度范围
  • dims 数组中元素重复

但 op_api/aclnn_max_v2.cpp 的 CheckParams 在 CheckShape 失败时同样返回 161002(op_api/aclnn_max_v2.cpp:173-184 与 :198-199):

    reduce_maxInferShape(self->GetViewShape(), dims, keepDims, noopWithEmptyDims, reduceShape);
    // out的shape必须满足Infer shape
    OP_CHECK_SHAPE_NOT_EQUAL_WITH_EXPECTED_SIZE(out, reduceShape, return false);
...
    // 4. 检查out的shape是否满足reduce推导
    CHECK_RET(CheckShape(self, dims, keepDims, noopWithEmptyDims, out), ACLNN_ERR_PARAM_INVALID);

即 out 形状与 reduce_maxInferShape 的推导不一致时也返回 161002,资料错误码表缺少该子项。

期望

docs/aclnnMaxV2.md 的 161002 子项中补充一条:out 的 shape 与按 dims/keepDims/noopWithEmptyDims 推导的结果不一致。

环境

  • 硬件:Ascend 910B3(Atlas A2 系列)
  • CANN:9.2.0(/usr/local/Ascend/cann-9.2.0,version.info 显示 26.1.1)
  • 代码基线:cann/ops-math 347457003073e2ebc9b08ab5f8275ec1b6417cfb(2026-10-29)

复现步骤

  1. 将下方 repro_maxv2.cpp 保存到任意目录。
  2. 执行 source /usr/local/Ascend/cann-9.2.0/set_env.sh。
  3. 编译:g++ -std=c++17 -O1 repro_maxv2.cpp -o repro_maxv2 -I/usr/local/Ascend/cann-9.2.0/include -L/usr/local/Ascend/cann-9.2.0/aarch64-linux/lib64 -lopapi_math -lnnopbase -lopapi -lascendcl -Wl,-rpath,/usr/local/Ascend/cann-9.2.0/aarch64-linux/lib64
  4. 运行 ./repro_maxv2,观察首段返回码。

复现脚本

// aclnnMaxV2 out 形状与归约推导不符时的返回码探针
#include <cstdio>
#include <unistd.h>
#include <vector>
#include "acl/acl.h"
#include "aclnnop/aclnn_max_v2.h"

int main() {
  if (aclInit(nullptr) != ACL_SUCCESS) { return 2; }
  if (aclrtSetDevice(0) != ACL_SUCCESS) { return 2; }
  aclrtStream stream = nullptr;
  aclrtCreateStream(&stream);

  // 静态数组:aclCreateTensor 不保证复制 shape/strides
  static int64_t selfShape[2] = {4, 6};
  static int64_t selfStride[2] = {6, 1};
  static int64_t outShape[2] = {1, 6};   // 正确应为 [6]
  static int64_t outStride[2] = {6, 1};

  void* selfDev = nullptr;
  void* outDev = nullptr;
  aclrtMalloc(&selfDev, 4 * 6 * sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST);
  aclrtMalloc(&outDev, 1 * 6 * sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST);
  std::vector<float> hostSelf(24, 1.0f), hostOut(6, 0.0f);
  aclrtMemcpy(selfDev, 24 * sizeof(float), hostSelf.data(), 24 * sizeof(float),
              ACL_MEMCPY_HOST_TO_DEVICE);
  aclrtMemcpy(outDev, 6 * sizeof(float), hostOut.data(), 6 * sizeof(float),
              ACL_MEMCPY_HOST_TO_DEVICE);

  aclTensor* self = aclCreateTensor(selfShape, 2, ACL_FLOAT, selfStride, 0,
                                    ACL_FORMAT_ND, selfShape, 2, selfDev);
  aclTensor* out = aclCreateTensor(outShape, 2, ACL_FLOAT, outStride, 0,
                                   ACL_FORMAT_ND, outShape, 2, outDev);
  static int64_t dimsData[1] = {0};
  aclIntArray* dims = aclCreateIntArray(dimsData, 1);

  uint64_t wsSize = 0;
  aclOpExecutor* executor = nullptr;
  auto ret = aclnnMaxV2GetWorkspaceSize(self, dims, false, false, out, &wsSize, &executor);
  printf("aclnnMaxV2GetWorkspaceSize ret=%d (expect 161002)\n", static_cast<int>(ret));
  fflush(stdout);
  _exit(ret == 0 ? 1 : 0);
}

实测输出:

aclnnMaxV2GetWorkspaceSize ret=161002 (expect 161002)
probe_exit=0

同一形态另有 8 条变体(out 比推导多一维 / 少一维 / 元素数不符 / keepDims 取反 / noop 取反 / 多维顺序错 / 全 1),首段同样返回 161002。

影响

  • 契约面:资料声明 3 个子项,实际校验面有 4 个,按资料无法完整解释首段返回码。
  • 使用侧:调用方把 out 形状写错(例如 self=[4,6]、dims=[0] 时把 out 建成 [1,6])会拿到 161002,按现有资料会误判成「dtype 不支持」或「dims 非法」,排查方向被带偏。

建议

在 161002 子项中补充「out 的 shape 与按 dims/keepDims/noopWithEmptyDims 推导的结果不一致」,与 CheckShape 的四处校验保持一致。

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

您好,核对 ae087b184,CheckShape / CheckParams 会根据 dims、keepDims、noopWithEmptyDims 推导归约形状,输出不满足现有检查时返回 161002;错误码表 目前只列出类型、轴越界和重复轴,确实遗漏了这类原因。

建议补充“out 的形状不满足按 dims/keepDims/noopWithEmptyDims 推导的结果要求”,同步更新表格 rowspan,并保持与既有形状比较规则一致。此项是返回码说明补充,无需改变现有校验或支持面;设备返回码依据您提供的 910B3 记录,本轮未重复设备测试。

likedislike
陈思陈思成员
4 天前 将 chen_0715 设为负责人
陈思陈思成员
4 天前 添加了label:pending-confirmation
陈思陈思成员
4 天前 删除了label:pending-confirmation
Cchenyifeng成员
4 天前 将 m0_55003149 设为负责人
Cchenyifeng成员
4 天前 移除了负责人 chen_0715
weikeweike成员
3 天前 关联了pull request:docs(reduce): 澄清 MeanV2/MaxV2/AminmaxAll 接口约束
CANN-robotCANN-robot成员
2 天前 关闭了 issue
CANN-robotCANN-robot成员
1 天前 添加了label:resolved