已关闭
[Bug-Report|缺陷反馈]: ReduceNansum 对零维 NaN 输入直接透传,未执行 NaN→0 #3983
dingxu创建于  9 天前关闭于  6 天前
dingxu
9 天前 创建

一、问题描述 (必填)

接口文档规定将 NaN 当作 0,且支持零维输入。但 reduce_nansum.cpp 第 81–83 行对 rank=0 直接返回输入,跳过 NaN 处理。

该分支可由公开 ACLNN 接口到达:L2 完成 Contiguous/Cast 后调用 L0,L0 返回原标量,随后 ViewCopy 到输出。输入为 FLOAT32 标量 NaN、输出也为 FLOAT32 时,静态推导结果仍为 NaN,而非 0。这会使标量分支与单元素向量分支的统计语义不一致。

二、环境信息 (可选)

  • 昇腾硬件建议:Atlas A2(Ascend 910B);可在 Atlas A3、Ascend 950PR/950DT 追加回归。

三、重现步骤 (可选)

  1. 基于 test_aclnn_reduce_nansum.cpp,补充 <limits>、<cmath>,将输入、输出改为:

    std::vector<int64_t> selfShape = {};
    std::vector<int64_t> outShape = {};
    std::vector<float> selfHostData = {
        std::numeric_limits<float>::quiet_NaN()
    };
    std::vector<float> outHostData = {123.0f};
    std::vector<int64_t> dimData = {0};
    bool keepDim = false;
    auto dtype = ACL_FLOAT;
    
  2. 创建零维、FLOAT32、ND 的 self/out,保留示例的两阶段调用与同步、回拷流程。

  3. 记录输出是否为 NaN,并断言 resultData[0] == 0.0f。

  4. 对照运行 shape=[1]、相同 NaN 输入,检查标量与向量语义。

四、预期结果 (可选)

两种输入均返回 FLOAT32 的 0;不应因为输入 rank=0 保留 NaN。静态代码路径推导当前标量输出为 NaN。

💡 备注(选填)
依据:aclnnReduceNansum 文档的 NaN 处理及零维约定。建议让标量路径同样执行 NaN 替换,或复用单元素计算路径;本问题不涉及新增数据类型或广播能力。

likedislike
xujiachen8成员
8 天前 评论:

您好,感谢反馈!

问题分析

接口文档 要求将 NaN 当作 0,并允许零维输入。核对调用链后,您描述的 FLOAT32 标量、dim={0} 可以通过参数检查:L2 完成连续化和类型处理后调用 L0,而 L0 的标量分支 直接返回输入,随后由 L2 复制到输出,跳过了 NaN 处理。

因此从当前代码路径推导,NaN 标量会被保留下来,与接口约定不一致;这里是静态调用链结论,尚需用您给出的标量与单元素向量对照用例核对实际输出。

处理方向

可行方向是让标量分支同样完成 NaN 替换,或复用单元素计算路径并保持标量的输出形状,同时保留有限标量、类型转换及 keepDim 的现有语义。我们会继续跟进该分支及标量/向量一致性问题。

likedislike
Xxujiachen8成员
8 天前 将 chen_0715 设为负责人
Xxujiachen8成员
8 天前 添加了label:pending-confirmation
陈思陈思成员
8 天前 删除了label:pending-confirmation
Bbaijinxiang_hw成员
7 天前 关联了pull request:fix(reduce_nansum): 0维标量输入按NaN->0语义处理,与向量路径一致(#3983)
baijinxiang_hw成员
6 天前 评论:

/assign @doufloat

likedislike
CANN-robotCANN-robot成员
6 天前 将 doufloat 设为负责人
CANN-robotCANN-robot成员
6 天前 关闭了 issue
Bbaijinxiang_hw成员
6 天前 issue状态由 进行中 改变为 已解决
CANN-robotCANN-robot成员
6 天前 添加了label:resolved