已关闭
[Bug-Report|缺陷反馈]: ReduceNansum 对零维 NaN 输入直接透传,未执行 NaN→0 #3983
dingxu创建于 9 天前关闭于 6 天前
xujiachen8
8 天前 评论:
8 天前 评论:
您好,感谢反馈!
问题分析
接口文档 要求将 NaN 当作 0,并允许零维输入。核对调用链后,您描述的 FLOAT32 标量、dim={0} 可以通过参数检查:L2 完成连续化和类型处理后调用 L0,而 L0 的标量分支 直接返回输入,随后由 L2 复制到输出,跳过了 NaN 处理。
因此从当前代码路径推导,NaN 标量会被保留下来,与接口约定不一致;这里是静态调用链结论,尚需用您给出的标量与单元素向量对照用例核对实际输出。
处理方向
可行方向是让标量分支同样完成 NaN 替换,或复用单元素计算路径并保持标量的输出形状,同时保留有限标量、类型转换及 keepDim 的现有语义。我们会继续跟进该分支及标量/向量一致性问题。


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


6 天前 将 doufloat 设为负责人
6 天前 关闭了 issue
6 天前 issue状态由 进行中 改变为 已解决
6 天前 添加了label:resolved
一、问题描述 (必填)
接口文档规定将 NaN 当作 0,且支持零维输入。但 reduce_nansum.cpp 第 81–83 行对 rank=0 直接返回输入,跳过 NaN 处理。
该分支可由公开 ACLNN 接口到达:L2 完成 Contiguous/Cast 后调用 L0,L0 返回原标量,随后 ViewCopy 到输出。输入为 FLOAT32 标量 NaN、输出也为 FLOAT32 时,静态推导结果仍为 NaN,而非 0。这会使标量分支与单元素向量分支的统计语义不一致。
二、环境信息 (可选)
三、重现步骤 (可选)
基于 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;创建零维、FLOAT32、ND 的 self/out,保留示例的两阶段调用与同步、回拷流程。
记录输出是否为 NaN,并断言
resultData[0] == 0.0f。对照运行 shape=[1]、相同 NaN 输入,检查标量与向量语义。
四、预期结果 (可选)
两种输入均返回 FLOAT32 的 0;不应因为输入 rank=0 保留 NaN。静态代码路径推导当前标量输出为 NaN。
💡 备注(选填)
依据:aclnnReduceNansum 文档的 NaN 处理及零维约定。建议让标量路径同样执行 NaN 替换,或复用单元素计算路径;本问题不涉及新增数据类型或广播能力。