Pull Request已成功合入, 合并人@CANN-robot
(感谢 eieiei 的贡献)变更摘要
该 PR 是青海大学团队针对 CANN 代码侦探第七期挑战提交的自定义 Sigmoid 算子完整实现,覆盖算子注册(op_host/sigmoid_def.cpp)、形状推导(sigmoid_infershape.cpp)、host 侧 Tiling(sigmoid_tiling.cpp)、AscendC kernel(op_kernel/sigmoid.cpp)以及构建脚本、aclnn 调用示例和基于 GoogleTest 的 UT 测试体系。整体按 8 核并行将 16384 个元素均分(每核 2048,向上取整、非整除无尾部丢弃),kernel 侧用 Muls→Exp→Adds→Div 指令链实现 y=1/(1+exp(-x)),中间精度 fp32(fp16 走 Cast 往返),统一使用 DataCopyPad 搬运,并含越界核空转与尾核截断防御。
主要改动
- 算子定义与形状推导:
sigmoid_def.cpp注册Sigmoid算子,输入x输出y,支持DT_FLOAT/DT_FLOAT16与FORMAT_ND,AddConfig("ascend910b");sigmoid_infershape.cpp的InferShapeSigmoid将输入 shape 原样拷贝到输出。 - Host 侧 Tiling 切分:
sigmoid_tiling.cpp固定BLOCK_DIM=8并调用SetBlockDim,按CeilDiv(data_sz, BLOCK_DIM)计算每核元素数blockFactor、派生ubFactor并做 UB 容量校验回退;依据输入 dtype 通过SetTilingKey选择 0(float)/1(float16),配套sigmoid_tiling_data.h定义含totalNum/blockFactor/ubFactor字段的SigmoidTilingData。 - Kernel 实现与分发:
sigmoid.cpp按 tilingKey 模板实例化NsSigmoid::Sigmoid<float>或NsSigmoid::Sigmoid<half>并执行Init/Process;sigmoid_tiling_key.h声明ASCENDC_TPL_ARGS_DECL模板参数供实例化选择。 - 构建与 aclnn 调用示例:
build.sh提供默认ascend910b的 CMake 构建流程及-u/-e/--make_clean选项;examples/test_aclnn_sigmoid.cpp通过aclnnSigmoidGetWorkspaceSize/aclnnSigmoid对 8×2048 的 float 输入调用算子。 - UT 测试体系:
tests/ut引入 GoogleTest 框架(test_sigmoid_tiling.cpp、test_sigmoid.cpp及tiling_context_faker/infershape_context_faker等上下文构造工具),并以gen_data.py/compare_data.py生成 golden 数据、按 MERE/MARE 阈值做精度比对,由run.sh统一执行 host/kernel UT 与精度校验。


代码审查
审查结论
发现统计
- P0: 0
- P1: 0
- P2: 1(UB 容量估算偏小,大输入触发 UB 溢出)
- P3: 3(build.sh 文档/实现不一致、示例未校验 aclCreateTensor 返回值、示例未回读校验输出)
- 共 4 项发现
总体风险判断
该 PR 是新增的 AscendC Sigmoid 自定义算子(host tiling + device kernel + 示例/构建脚本)。核心计算链(Muls→Exp→Adds→Div)与多核切分/尾核截断逻辑本身正确,tiling 数据与 kernel 结构体字段(int64_t)契约一致,TilingKey 与 kernel 模板实例化对应关系无误,未发现会导致构建失败或 P0/P1 级别的缺陷。主要风险集中在 tiling 侧 UB 容量校验与 kernel 实际分配不一致(fp32 路径 20B/元素 vs 估算 18B/元素),仅在输入规模较大时触发,属边界条件下的可靠性隐患;其余为示例代码与脚本的使用性/健壮性问题。
逐文件审查确认
CMakeLists.txt— 无问题(含--soc提示与 build.sh 不一致,已在 build.sh finding 中合并体现)build.sh— 发现 1 项(P3:--soc 选项未实现)examples/CMakeLists.txt— 无问题examples/run.sh— 无问题examples/test_aclnn_sigmoid.cpp— 发现 2 项(P3:aclCreateTensor 返回值未校验;P3:输出未回读校验)op_host/CMakeLists.txt— 无问题(标准模板结构)op_host/sigmoid_def.cpp— 无问题op_host/sigmoid_infershape.cpp— 无问题(官方模板样式,输入缺失时框架层已兜底)op_host/sigmoid_tiling.cpp— 发现 1 项(P2:UB 容量估算 18 字节/元素 < fp32 实际 20 字节/元素)op_kernel/CMakeLists.txt— 无问题op_kernel/sigmoid.cpp— 无问题op_kernel/sigmoid.h— 无问题(尾核截断、越界核空转、fp16/fp32 双路径逻辑正确;未触发 uint16_t blockLen 截断等边界)op_kernel/sigmoid_tiling_data.h— 无问题op_kernel/sigmoid_tiling_key.h— 无问题(schMode 0/1 与 tilingKey 0/1 映射一致)
审查结论
发现统计
- P0:0 项
- P1:0 项
- P2:2 项(infershape_case_executor.cpp 空指针解引用;BuildGoogleTest.cmake 关闭 TLS 校验的供应链风险)
- P3:5 项(workspace 校验跳过、DeterministicInfo 空指针、ExecuteTestCase 重载二义性、CreateFrom 主模板未定义、头文件 using namespace std)
总体风险评估
本 PR 为 UT 测试基础设施(含 CMake 构建脚本与上下文 faker/executor 辅助代码),不含算子 host/kernel 生产逻辑。整体风险中等偏低:无 P0/P1 级阻断问题;P2 两项集中在测试框架健壮性与第三方依赖下载安全(崩溃路径需“算子未注册”这类用例错误才触发,TLS 关闭仅影响测试构建物),P3 项为框架层面的边界/接口缺陷。这些不会影响算子功能正确性,但建议在合入前修复 P2 项。
逐文件审查确认
tests/ut/CMakeLists.txt— 已审查,no issues(变量仅作跨子目录传递、路径判断合理)tests/ut/cmake/BuildGoogleTest.cmake— 已审查,发现 1 项(TLS_VERIFY OFF,P2)tests/ut/common/any_value.h— 已审查,发现 1 项(CreateFrom 主模板未定义,P3)tests/ut/common/infershape_case_executor.cpp— 已审查,发现 1 项(GetOpImpl 空指针解引用,P2)tests/ut/common/infershape_case_executor.h— 已审查,no issuestests/ut/common/infershape_context_faker.cpp— 已审查,no issuestests/ut/common/infershape_context_faker.h— 已审查,no issuestests/ut/common/tiling_case_executor.cpp— 已审查,发现 1 项(workspace 断言被跳过,P3)tests/ut/common/tiling_case_executor.h— 已审查,发现 2 项(重载二义性、using namespace std,均 P3)tests/ut/common/tiling_context_faker.cpp— 已审查,发现 1 项(DeterministicInfo 空指针,P3)
审查结论
发现统计
- P0: 0 个
- P1: 0 个
- P2: 1 个(op_host UT 使用 C++17
<filesystem>但构建未指定-std=c++17/stdc++fs,构建机编译器较旧时整个 op_host UT 无法编译链接) - P3: 4 个(死代码陷阱函数、常量输入导致多核切分/尾核截断/负输入分支漏测、compare_data.py 缺失元素个数校验、.so 注册失败被掩盖)
总体风险评估
中低风险。本 PR 全部为 UT 测试基础设施(host tiling UT、kernel UT、数据生成/比对脚本、构建与执行脚本),无生产代码变更,未发现数据损坏、安全漏洞或 P0/P1 级缺陷。主要风险集中在两点:一是 op_host 构建缺少 C++17 编译选项,在旧编译器环境下可能导致 UT 无法构建(P2,取决于工具链,置信度中等偏低);二是测试有效性不足——常量输入使本 PR 宣称的 8 核并行切分与尾核截断逻辑实际上未得到任何有效校验,且存在死代码与比对脚本健壮性问题。整体可合入,但建议修复 P2 构建选项问题并改进测试输入覆盖。
各文件审查确认
tests/ut/common/tiling_context_faker.h— 已审查,无问题(Attr 重载忽略 attrName 属官方 faker 模式的常规做法;#endif注释与宏名不一致为纯注释风格,不上报)tests/ut/op_host/CMakeLists.txt— 已审查,相关 C++17 构建问题已并入 test_op_host_main.cpp 的 P2 发现(该文件为根因所在)tests/ut/op_host/test_op_host_main.cpp— 已审查,发现 2 项(P2 C++17 构建选项缺失;P3 .so 注册失败被掩盖)tests/ut/op_host/test_sigmoid_tiling.cpp— 已审查,无问题(expectTilingKey/TilingData 期望值与 op_host 侧 tiling 实现是否一致无法在可读范围内核实,且作者已以 TODO 注明基于模板,未作为确证缺陷上报)tests/ut/op_kernel/CMakeLists.txt— 已审查,无问题tests/ut/op_kernel/sigmoid_data/compare_data.py— 已审查,发现 1 项(P3 元素个数校验缺失)tests/ut/op_kernel/sigmoid_data/gen_data.py— 已审查,发现 1 项(P3 常量输入导致核心切分逻辑漏测)tests/ut/op_kernel/sigmoid_tiling.h— 已审查,无问题tests/ut/op_kernel/test_sigmoid.cpp— 已审查,发现 1 项(P3 未使用的 FloatToHalf/FloatToBFloat16 死代码)tests/ut/run.sh— 已审查,无问题(set -e未含set -u/pipefail、LD_LIBRARY_PATH追加空项等属脚本风格/低风险,不上报)
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


/compile


The MR can not be merged, because of CodeReview discussion not resolved
If you want to solve this problem, you can click here to do it in the FAQs.


青海大学
团队信息
成员
算子: challenge07_sigmoidcustom
8 核并行切分:host 侧 Tiling 将 16384 个元素按核均分为每核 2048 元素(向上取整,非整除无尾部丢弃),UB 单块搬运、含容量校验;kernel 侧用 AscendC 基础指令链 Muls→Exp→Adds→Div 实现 y=1/(1+exp(-x)),中间精度 fp32(fp16 走 Cast 往返),DataCopyPad 统一搬运;含越界核空转与尾核截断防御。