在阅读 math/reduce_log_sum_exp 时发现,aclnnLogSumExp 的 API 契约在头文件注释、README/docs、实际实现和 UT 中存在几处不一致,可能导致用户接入时误用,也会让 UT 对边界语义的覆盖不够明确。
math/reduce_log_sum_exp
aclnnLogSumExp
math/reduce_log_sum_exp/op_api/aclnn_logsumexp.h 中的接口注释写到:
math/reduce_log_sum_exp/op_api/aclnn_logsumexp.h
self
FLOAT16、BFLOAT16、FLOAT32
ND、NCHW、NHWC、HWCN、NDHWC、NCDHW
out
但 README.md 和 docs/aclnnLogSumExp.md 中写的是:
README.md
docs/aclnnLogSumExp.md
FLOAT、FLOAT16、BFLOAT16、INT32、INT64、INT16、INT8、UINT8、BOOL
FLOAT、FLOAT16、BFLOAT16
ND
实际实现 op_api/aclnn_logsumexp.cpp 中:
op_api/aclnn_logsumexp.cpp
CheckDtypeValid
FLOAT16/BFLOAT16/整型
FLOAT
if(self->GetStorageFormat() != Format::FORMAT_ND){ OP_LOGW("Format only support ND"); }
也就是实现层面并没有与头文件注释中的多 format 支持保持一致。
dim
aclnn_logsumexp.cpp 中的注释和实现都表明:dim->Size() == 0 时按“所有轴 reduce”处理。
aclnn_logsumexp.cpp
dim->Size() == 0
相关逻辑包括:
// dim为空时,所有轴都视为mask,与竞品一致 if (dim->Size() == 0) { dimMask.flip(); }
以及:
// 输入dim为空aclIntArray时,添加输入self的dim if (dim->Size() == 0) { op::Shape shape = self->GetViewShape(); size_t dimDum = shape.GetDimNum(); int64_t appendDim[dimDum]; for (uint64_t i = 0; i < dimDum; i++) { appendDim[i] = static_cast<int64_t>(i); } dim = uniqueExecutor.get()->AllocIntArray(appendDim, dimDum); }
但 UT 中 case_14 注释为“dim为空”,却构造了:
case_14
self shape: {2, 4} dim: {} keep_dim: false out shape: {1} EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);
如果 dim == {} 的语义是 all-reduce,则 keep_dim=false 的期望输出更可能应是 0 维标量 shape {},而不是 {1}。当前 case 实际验证的是“out shape 不匹配时报错”,并没有验证 dim 为空本身的支持语义。
dim == {}
keep_dim=false
{}
{1}
case_22 注释为“负数维度测试”:
case_22
self shape: {2, 3, 4} dim: {-2} keep_dim: false out shape: {2, 3} EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);
但对于 self={2,3,4},dim=-2 等价于 reduce 第 1 维,keepDim=false 时合理输出 shape 应为 {2,4}。当前用例失败原因更像是 out shape {2,3} 不匹配,而不是负数维度本身非法。
self={2,3,4}
dim=-2
keepDim=false
{2,4}
{2,3}
这些不一致会带来几个问题:
dim={}
aclnn_logsumexp.h
您好,感谢您提出的issue,正在安排相关人员定位分析,请耐心等待。
/assign
问题描述
在阅读
math/reduce_log_sum_exp时发现,aclnnLogSumExp的 API 契约在头文件注释、README/docs、实际实现和 UT 中存在几处不一致,可能导致用户接入时误用,也会让 UT 对边界语义的覆盖不够明确。具体不一致点
1. 头文件声明的 dtype/format 与 README/docs、实现不一致
math/reduce_log_sum_exp/op_api/aclnn_logsumexp.h中的接口注释写到:self数据类型支持FLOAT16、BFLOAT16、FLOAT32ND、NCHW、NHWC、HWCN、NDHWC、NCDHWout数据格式也支持上述格式,且需要与self一致但
README.md和docs/aclnnLogSumExp.md中写的是:self支持FLOAT、FLOAT16、BFLOAT16、INT32、INT64、INT16、INT8、UINT8、BOOLout支持FLOAT、FLOAT16、BFLOAT16ND实际实现
op_api/aclnn_logsumexp.cpp中:CheckDtypeValid也确实允许整型和 BOOL 作为输入,并在后续将FLOAT16/BFLOAT16/整型promote 到FLOAT计算;if(self->GetStorageFormat() != Format::FORMAT_ND){ OP_LOGW("Format only support ND"); }也就是实现层面并没有与头文件注释中的多 format 支持保持一致。
2.
dim为空的语义在实现和 UT 中不够一致aclnn_logsumexp.cpp中的注释和实现都表明:dim->Size() == 0时按“所有轴 reduce”处理。相关逻辑包括:
// dim为空时,所有轴都视为mask,与竞品一致 if (dim->Size() == 0) { dimMask.flip(); }以及:
// 输入dim为空aclIntArray时,添加输入self的dim if (dim->Size() == 0) { op::Shape shape = self->GetViewShape(); size_t dimDum = shape.GetDimNum(); int64_t appendDim[dimDum]; for (uint64_t i = 0; i < dimDum; i++) { appendDim[i] = static_cast<int64_t>(i); } dim = uniqueExecutor.get()->AllocIntArray(appendDim, dimDum); }但 UT 中
case_14注释为“dim为空”,却构造了:self shape: {2, 4} dim: {} keep_dim: false out shape: {1} EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);如果
dim == {}的语义是 all-reduce,则keep_dim=false的期望输出更可能应是 0 维标量 shape{},而不是{1}。当前 case 实际验证的是“out shape 不匹配时报错”,并没有验证dim为空本身的支持语义。3. 负数维度 UT 命名与实际验证目标不一致
case_22注释为“负数维度测试”:self shape: {2, 3, 4} dim: {-2} keep_dim: false out shape: {2, 3} EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);但对于
self={2,3,4},dim=-2等价于 reduce 第 1 维,keepDim=false时合理输出 shape 应为{2,4}。当前用例失败原因更像是 out shape{2,3}不匹配,而不是负数维度本身非法。影响
这些不一致会带来几个问题:
self实际支持整型/BOOL 输入;dim={}和负数维度的边界语义没有被 UT 明确覆盖,后续重构时容易回归;建议
aclnn_logsumexp.h、README.md、docs/aclnnLogSumExp.md中的 dtype 和 format 描述。dim={}增加正向 UT,明确 all-reduce 语义。case_22,区分“负数维度支持”与“out shape mismatch”两个测试目标。