Pull Request已成功合入, 合并人@CANN-robot
(感谢 TangPC 的贡献)以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入
| Module List | Reviewers | Committers |
|---|---|---|
| sig-ops-nn | zhang-wu, zhou-qilong, lileizheng, liu-wei, wangyongguang | crystalhu, tangweiwei2, chenqi317, liubo75 |


🔵 source code change are detected, tasks labels is removed in this pull request!


compile


🔵 ops-nn pipeline is running. Please wait a moment... (Link 2054)


以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入
| Module List | Reviewers | Committers |
|---|---|---|
| sig-ops-nn | fanqirui, lileizheng, zhangyuxiang0119, FelixTang7, zhang-wu | tangweiwei2, chenqi317, liubo75, crystalhu |


🔵 source code change are detected, tasks labels is removed in this pull request!


问题/功能描述
本次PR主要完成了两项核心工作。首先,为昇腾AI处理器新增了MseLoss(均方误差损失)算子的完整实现,包括图算子定义、形状推断、Tiling策略及内核实现,解决了该基础损失函数在特定硬件架构(如ascend910_95/arch35)上缺失支持的问题,并支持多种数据类型(FP16/FP32/BF16)和规约模式(none/sum/mean)。其次,新增了MaxPoolWithArgmaxV3和MaxPoolGradWithArgmaxV3两个池化算子的完整实现,包括算子定义、Tiling策略、内核实现及单元测试,解决了带最大位置索引的最大池化及其反向传播操作在昇腾平台上的功能与性能优化需求。此外,还对相关算子的构建配置、文档和版权声明进行了重构、更新和修正。
修改方案描述
针对MseLoss算子,新增了图算子定义、形状推断、Tiling实现(针对arch35架构)以及基于DAG模板的计算内核,并重构了CMake构建配置以支持特定芯片架构,同时更新了产品支持文档和API文档。针对两个池化算子,新增了完整的算子定义、形状/类型推断、针对NCHW/NHWC格式及不同场景(如大卷积核、多核并行)的Tiling策略、AscendC内核实现(包括向量化、标量、SIMT等多种模式)以及全面的单元测试。此外,统一了相关文件的版权声明格式,修正了文档中的笔误,并调整了测试代码的头文件引用路径以确保编译正确。所有实现均遵循了项目的安全编码规范,进行了充分的参数校验和错误处理。


代码结构与可维护性: 属性'reduction'的注释描述中缺少空格,格式不规范。注释中写为'reduction:An optional str',冒号后应有一个空格。虽然不影响功能,但影响代码的可读性和规范性。
问题类型: 代码结构与可维护性
文件路径: loss/mse_loss/op_graph/mse_loss_proto.h
行号: 29
问题代码:
* reduction:An optional str from sum, none, mean, Defaults to "mean".\n
修改建议:
在冒号后添加空格,修改为'reduction: An optional str from sum, none, mean, Defaults to "mean".',保持代码注释格式的一致性。
此评论由代码审查工具自动生成


宏定义命名冲突风险: 头文件保护宏的命名 'OPS_BUILT_IN_OP_PROTO_INC_NN_NORM_OPS_H_' 与注释中提到的文件名 'nn_norm_ops.h' 相关,但与当前实际文件名 'mse_loss_proto.h' 不符。这可能导致不同头文件使用相同宏定义的风险,引发编译错误或包含错误版本的头文件。
问题类型: 宏定义命名冲突风险
文件路径: loss/mse_loss/op_graph/mse_loss_proto.h
行号: 15
问题代码:
#ifndef OPS_BUILT_IN_OP_PROTO_INC_NN_NORM_OPS_H_
#define OPS_BUILT_IN_OP_PROTO_INC_NN_NORM_OPS_H_
修改建议:
将头文件保护宏的命名更新为与实际文件名一致,例如改为 'OPS_BUILT_IN_OP_PROTO_INC_MSE_LOSS_PROTO_H_'。
此评论由代码审查工具自动生成


代码结构与可维护性: 第40行创建的dimShapes向量在初始化后从未使用。该向量包含oriShape,但后续代码没有引用dimShapes。这是一个无用的变量定义,增加了不必要的内存分配和代码复杂度。
问题类型: 代码结构与可维护性
文件路径: loss/mse_loss/op_host/arch35/mse_loss_tiling.cpp
行号: 40
问题代码:
std::vector<gert::Shape> dimShapes = {oriShape};
修改建议:
删除未使用的dimShapes变量定义,或者如果该变量是为未来功能预留,应添加注释说明。考虑到这是新添加的代码,很可能是不必要的残留代码,建议直接删除。
此评论由代码审查工具自动生成


潜在的空指针解引用: 第108行size_t* currentWorkspace = tilingContext->GetWorkspaceSizes(1);获取workspace大小数组指针,然后直接通过currentWorkspace[0]赋值。如果GetWorkspaceSizes返回空指针,这里会导致未定义行为。虽然GetWorkspaceSizes可能保证在参数有效时返回非空指针,但缺乏明确的文档说明,存在风险。
问题类型: 潜在的空指针解引用
文件路径: loss/mse_loss/op_host/arch35/mse_loss_tiling_arch35.cpp
行号: 107
问题代码:
size_t* currentWorkspace = tilingContext->GetWorkspaceSizes(1);
currentWorkspace[0] = static_cast<size_t>(ASCEND_WORKSPACE);
修改建议:
添加对GetWorkspaceSizes返回值的空指针检查,或者查阅相关文档确认其行为。如果无法确认,建议添加检查:
size_t* currentWorkspace = tilingContext->GetWorkspaceSizes(1);
if (currentWorkspace != nullptr) {
currentWorkspace[0] = static_cast<size_t>(ASCEND_WORKSPACE);
}
此评论由代码审查工具自动生成


代码结构与可维护性: 第24行常量UB_RESVERVED_SIZE拼写错误,应该是UB_RESERVED_SIZE。虽然这不影响功能,但影响代码可读性和维护性。
问题类型: 代码结构与可维护性
文件路径: pooling/max_pool_grad_with_argmax_v3/op_host/arch35/max_pool_grad_with_argmax_v3_nhwc_tiling.cpp
行号: 24
问题代码:
static constexpr int64_t UB_RESVERVED_SIZE = 1024;
修改建议:
将UB_RESVERVED_SIZE更正为UB_RESERVED_SIZE。
此评论由代码审查工具自动生成


字符串比较问题: 第209行使用strncmp比较字符串,但sizeof("NCHW")/sizeof(char)计算的是5(包括空字符),而strncmp应该比较4个字符。这可能导致错误匹配。
问题类型: 字符串比较问题
文件路径: pooling/max_pool_grad_with_argmax_v3/op_host/arch35/max_pool_grad_with_argmax_v3_tiling_base.cpp
行号: 209
问题代码:
if (strncmp(inputFormatPtr, "NCHW", sizeof("NCHW") / sizeof(char)) == 0) {
修改建议:
建议使用strncmp(inputFormatPtr, "NCHW", 4) == 0,或者使用strcmp如果确定字符串以空字符结尾。
此评论由代码审查工具自动生成


代码结构与可维护性: 类MaxPoolGradWithArgmaxV3BaseTiling将inputData和hardwareData声明为public成员变量,这破坏了封装性。外部代码可以直接修改这些内部状态,可能导致对象处于不一致的状态。
问题类型: 代码结构与可维护性
文件路径: pooling/max_pool_grad_with_argmax_v3/op_host/arch35/max_pool_grad_with_argmax_v3_tiling_base.h
行号: 90
问题代码:
public:
MaxPoolGradWithArgmaxV3InputInfo inputData;
MaxPoolGradWithArgmaxV3HardwareInfo hardwareData;
修改建议:
将这些成员变量改为private或protected,并提供必要的getter/setter函数来控制访问。如果确实需要公开访问,请添加注释说明理由。
此评论由代码审查工具自动生成


代码结构与可维护性: 头文件保护宏名称中存在拼写错误:'AGRMAX'应为'ARGMAX'。这可能导致头文件保护失效,因为其他文件中可能使用正确的拼写。
问题类型: 代码结构与可维护性
文件路径: pooling/max_pool_grad_with_argmax_v3/op_host/arch35/max_pool_grad_with_argmax_v3_tiling_base.h
行号: 16
问题代码:
#ifndef AIR_CXX_RUNTIME_V2_OP_IMPL_MAX_POOL_GRAD_WITH_AGRMAX_V3_TILING_BASE_H_
#define AIR_CXX_RUNTIME_V2_OP_IMPL_MAX_POOL_GRAD_WITH_AGRMAX_V3_TILING_BASE_H_
修改建议:
将保护宏中的'AGRMAX'更正为'ARGMAX',确保与文件名和功能描述一致。
此评论由代码审查工具自动生成


compile


🔵 ops-nn pipeline is running. Please wait a moment... (Link 2065)


compile


🔵 ops-nn pipeline is running. Please wait a moment... (Link 2074)
🔵 Already succeed task list is: [Anti_Virus, Check_pr, Code_Check, Codescan, Compile_Ascend_ARM, Compile_Ascend_ARM-single, Compile_Ascend_X86, UT_Test_kernel, check-commit-message, download-business-code], will not be build again this time !


| Check Name | Build Result | Log Report | Package Link |
|---|---|---|---|
| CI_Ascend_Ops-Nn_Compile | ✅ SUCCESS | #2074 | >>> |
| check-commit-message | ✅ SUCCESS | >>> | |
| download-business-code | ✅ SUCCESS | >>> | |
| Compile_Ascend_X86 | ✅ SUCCESS | >>> | >>> |
| Compile_Ascend_ARM | ✅ SUCCESS | >>> | >>> |
| Compile_Ascend_ARM-single | ✅ SUCCESS | >>> | >>> |
| UT_Test_ophost | ✅ SUCCESS | >>> | |
| UT_Test_opapi | ✅ SUCCESS | >>> | |
| UT_Test_kernel | ✅ SUCCESS | >>> | |
| Smoke_Test_A900 | ✅ SUCCESS | >>> |


/check-pr


The following labels are not ready.
lgtm: Please wait for reviewers to review the code.
approved: Please wait for committers to review the code.


Review Guide
This Pull-Request Passes Review.
Committers who writed a comment of /approve are: liubo75.
Reviewers who writed a comment of /lgtm are: yu-xinjie62, zhou-qilong, liubo75.


描述
关联的Issue
测试
文档更新
类型标签