已合并
【代码侦探Challenge07】青海大学 - challenge07_sigmoidcustom #3805
【代码侦探Challenge07】青海大学 - challenge07_sigmoidcustom #3805
已合并
eieiei创建于 9月15日
eieiei
eieiei
9月15日

青海大学

团队信息

成员

算子: challenge07_sigmoidcustom

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

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 eieiei 的贡献)
eieieieieiei
9月15日 创建了 pull request,commit 7b60910c
atomgit-bot
atomgit-bot
9月15日 评论:

变更摘要

该 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 与精度校验。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月15日 评论:

代码审查

审查结论

发现统计

  • 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 issues
  • tests/ut/common/infershape_context_faker.cpp — 已审查,no issues
  • tests/ut/common/infershape_context_faker.h — 已审查,no issues
  • tests/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

💬 仅评论

likedislike
不准确?
eieiei
eieiei
9月15日 评论:

/compile

likedislike
CANN-robotCANN-robot成员
9月15日 添加了label:cann-cla/yes
此处折叠了60条消息 查看更多
fulltower成员
13 天前 评论:

/check-pr

likedislike
CANN-robot
CANN-robot成员
13 天前 评论:

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.

likedislike
Ffulltower成员
13 天前 解决了最后一个问题
fulltower成员
13 天前 评论:

/check-pr

likedislike
CANN-robotCANN-robot成员
13 天前 合入了pull request