合并受阻
/compile


变更摘要
本 PR 为 CANN 代码侦探挑战赛(青海大学)提交的 challenge08_tanhcustom 算子工程,使用 AscendC 实现 Tanh 激活算子。host 侧在 tanh_tiling.cpp 中完成按核并行切分的 Tiling(向上取整、尾核截断防御、UB 容量校验并预留 guard 字节),kernel 侧在 tanh.cpp/tanh.h 中按 schMode 分派 fp32/fp16 双实例,通过 Exp/Muls/Add/Sub/Div 计算链实现 y=(e^x-e^-x)/(e^x+e^-x),搬运统一使用 DataCopyPad;同时配套 aclnn 调用示例、op_host/op_kernel 双层 UT 与基于 MERE/MARE 的精度比对脚本。
主要改动
- host 侧算子定义与 Tiling:
tanh_def.cpp声明Tanh算子(DT_FLOAT/DT_FLOAT16、FORMAT_ND),tanh_infershape.cpp将输入 shape 原样赋给输出,tanh_tiling.cpp依据 dtype 选择tileAlignHint、按元素数选取coreGrain计算plannedCores/coreSpan/launchCores,并在 UB 容量扣减kUbGuardBytes后计算ubFactor,最后按输入 dtype 设置tilingKey(fp16→TANH_TPL_SCH_MODE_0,fp32→TANH_TPL_SCH_MODE_1)。 - kernel 计算与分派:
tanh.h中模板类NsTanh::Tanh<T>的ComputeTanh以Exp→Muls→Exp→Add→Sub→Div顺序实现 tanh,Init按blockFactor计算各核coreOffset/activeElems_(越界核置 0 空转)并决定 compact/queue 缓冲模式;tanh.cpp通过if constexpr按schMode实例化Tanh<half>与Tanh<float>,CopyIn/CopyOut统一使用DataCopyPad。 - Tiling 数据结构与模板参数:新增
tanh_tiling_data.h定义TanhTilingData(totalNum/blockFactor/ubFactor三个字段),tanh_tiling_key.h通过ASCENDC_TPL_ARGS_DECL声明schMode模板参数及TANH_TPL_SCH_MODE_0/1两个取值。 - 示例与构建脚本:
examples/test_aclnn_tanh.cpp演示aclnnTanhGetWorkspaceSize/aclnnTanh两段式调用(含 fp16/bf16 数据转换、workspace 申请与资源释放);顶层build.sh提供-j、-u、-e、--make_clean选项,串起 cmake 构建、UT 与示例执行。 - UT 与精度比对体系:
tests/ut下提供 gtest 构建(BuildGoogleTest.cmake,强制 old ABI 以匹配 CANN 库)、TilingContextFaker/InferShapeContextFaker与对应 case executor;test_tanh_tiling.cpp校验 tiling 输出,test_tanh.cpp直接构造TanhTilingData经ICPU_RUN_KF((tanh<1>))运行 kernel,gen_data.py/compare_data.py生成 golden 并以 MERE/MARE 阈值(fp16/fp32 等按 dtype 设定)完成精度比对,run.sh汇总各阶段结果。


代码审查
审查结论
各文件审查状态
CMakeLists.txt— 已审查。无独立问题(第 29 行--soc用法提示与 build.sh 不一致,已并入 build.sh 的问题 3)。build.sh— 已审查。2 个问题(P3:--soc参数未实现但被提示使用;P3:-e分支在未安装算子包时必然失败)。examples/CMakeLists.txt— 已审查。无独立问题(依赖已安装算子包,相关风险并入 build.sh 问题 4)。examples/run.sh— 已审查。无独立问题。examples/test_aclnn_tanh.cpp— 已审查。1 个问题(P3:示例不回读/校验输出,精度回归无法被发现)。op_host/CMakeLists.txt— 已审查。无问题。op_host/tanh_def.cpp— 已审查。无问题(AddConfig 仅ascend910b,与 build.sh 默认 SOC 一致)。op_host/tanh_infershape.cpp— 已审查。无问题。op_host/tanh_tiling.cpp— 已审查。无问题(tiling key 分派与 kernel 的 fp16/fp32 双实例一致;tile 上限在 192KB UB 下 5 个缓冲区可容纳)。op_kernel/CMakeLists.txt— 已审查。无问题。op_kernel/tanh.cpp— 已审查。无问题。op_kernel/tanh.h— 已审查。2 个问题(P2:大绝对值输入 exp 溢出输出 NaN;P2:尾块 DataCopyPad 非 32B 对齐时越界读写 GM)。
问题统计
- P0:0
- P1:0
- P2:2
- P3:3
总体风险判断
整体构建与基本运行链路完整,host 侧 tiling/def/infershape 及 kernel 分派逻辑一致,未见编译级或接口级阻断问题。主要风险集中在 kernel 数值正确性与边界安全:ComputeTanh 在 |x| 较大(fp32 ≥ ~88.7、fp16 ≥ ~11.1)时因 exp 溢出产生 NaN,属于真实边界正确性缺陷(P2);输出尾块使用 DataCopyPad 在张量尺寸非 32B 对齐时存在 GM 越界读写(P2)。脚本与示例侧为便利性问题(P3)。建议合入前优先修复 tanh.h 的数值溢出与尾块越界问题,并补充大绝对值输入的校验用例。
审查结论
发现统计
- P0:0 个
- P1:0 个
- P2:2 个
- P3:3 个
总体风险判断
本次 PR 全部为 UT 基础设施与 tiling 数据/模板参数头文件(TanhTilingData、TanhTilingKey),生产算子本体(host tiling / kernel)不在 diff 内。整体风险中低:无 P0/P1 级问题,最值得关注的两点是——gtest 从外部镜像下载编译却关闭 TLS 校验且无校验和(供应链风险),以及 infershape 用例执行器缺少空指针校验(算子未注册时测试进程直接崩溃而非可诊断失败)。其余为条件触发的健壮性问题。
各文件审查确认
op_kernel/tanh_tiling_data.h— no issues(结构体三字段 int64 + 默认初始化,无对齐/溢出问题)op_kernel/tanh_tiling_key.h— no issues(标准 ASCENDC_TPL 宏用法,参数列表与模板声明一致)tests/ut/CMakeLists.txt— no issues(UT 接线常规写法;子目录 CMakeLists 不在审查范围内无法交叉验证)tests/ut/cmake/BuildGoogleTest.cmake— P2:TLS_VERIFY OFF且无URL_HASH,第三方 gtest 下载无完整性校验(供应链风险)tests/ut/common/any_value.h— no issues(shared_ptr<void>正确管理 new 对象,各 CreateFrom 特化与枚举类型一一对应)tests/ut/common/infershape_case_executor.cpp— P2:spaceRegistry/GetOpImpl()/infer_shape无判空即解引用,与 tiling 侧判空不一致,注册缺失时崩溃tests/ut/common/infershape_case_executor.h— no issuestests/ut/common/infershape_context_faker.cpp— no issues(均为 builder 直通调用)tests/ut/common/infershape_context_faker.h— no issues(Attr 重载忽略 attrName 属设计限制,本算子无属性,未达上报标准)tests/ut/common/tiling_case_executor.cpp— P3:STR(BUILD_SOC_VERSION)字符串化语义使"宏未定义"防御失效,且socToArch缺键导致 socVersion/NpuArch 静默为空tests/ut/common/tiling_case_executor.h— P3:5 参重载默认expectTilingData=""与跳过哨兵EMPTY_EXPECT_TILING_DATA不一致,默认调用产生假失败tests/ut/common/tiling_context_faker.cpp— P3:DeterministicInfo未判空即解引用指针参数,空指针调用会崩溃
审查结论
变更文件逐一核对结果
| 文件 | 结论 |
|---|---|
tests/ut/common/tiling_context_faker.h |
1 个问题(P3:Attr() 重载忽略 attrName) |
tests/ut/op_host/CMakeLists.txt |
no issues(链接/命名与 main 及 run.sh 一致;ASCEND_HOME_PATH 依赖问题并入 run.sh 发现) |
tests/ut/op_host/test_op_host_main.cpp |
no issues(.so 命名与 CMake 产物一致,gtest_main 不会产生 main 符号冲突) |
tests/ut/op_host/test_tanh_tiling.cpp |
no issues(StorageShape/initializer_list 生命周期、compileInfo 空结构均符合模板惯例) |
tests/ut/op_kernel/CMakeLists.txt |
no issues(tikicpulib REQUIRED、CANN_HOME 降级查找、编译定义齐全) |
tests/ut/op_kernel/tanh_data/compare_data.py |
1 个问题(P3:元素数不一致时未捕获 ValueError 崩溃) |
tests/ut/op_kernel/tanh_data/gen_data.py |
no issues(形状 8×2048 与 kernel UT 一致,golden 计算正确) |
tests/ut/op_kernel/tanh_tiling.h |
no issues(官方模板结构,路径正确) |
tests/ut/op_kernel/test_tanh.cpp |
3 个问题(P3:GmAlloc 未校验、内核结果未校验即回读、未使用的转换函数) |
tests/ut/run.sh |
1 个问题(P3:ASCEND_HOME_PATH 硬编码默认路径且无存在性检查) |
汇总
- 发现数:P0 = 0,P1 = 0,P2 = 0,P3 = 6。
- 总体风险评估:本 PR 为 tanh 算子的 UT 测试体系(host tiling UT + kernel UT + 精度比对 + 构建/执行脚本),不涉及生产算子逻辑本身。未发现会导致构建失败、数据损坏或安全风险的缺陷;所报 6 个问题均为测试/脚本健壮性问题(错误路径未校验、异常未捕获、死代码、环境依赖硬编码),触发时多以"崩溃/测试失败"等显式方式暴露,不会静默产生错误结论,整体风险低。其中
tiling_context_faker.h的Attr()丢名字问题属于新测试设施 API 的潜在正确性陷阱,当前用例未触发,建议尽快修正以免后续用例踩坑。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


更正:最终 head 是 ca81f7dd(上一条引用的 5ce5a535 已被替换)
上一条补记里的代码改动内容不变(infershape_case_executor.cpp 的判空、BuildGoogleTest.cmake 的 URL_HASH),但提交本身重做了,原因值得说明,避免助教看 diff 时被误导:
5ce5a535那次是在浅克隆里commit --amend得到的,产出了一个没有父提交的孤儿提交,平台因此退化成整树比对,文件改动里凭空多出 800 多个与本提交无关的“删除”;- 现已改为以当前 master 为父的单提交:
ca81f7dd,文件改动回到 36 个且全部为新增,全部位于本人提交目录内; - 过程中还因 committer 邮箱不对触发过一次 CLA 重判,现已是
cann-cla/yes。
resolve_discussion_passed 仍为 false(那几条讨论需要评审人点,提交者无权限)。麻烦 @shaoyf @fullt 帮忙把已处理的讨论标记为已解决,抱歉前后两次改动 head 造成的阅读干扰。


青海大学
团队信息
成员
算子: challenge08_tanhcustom
使用 AscendC 实现 Tanh 激活算子:host 侧 Tiling 按 8 核并行切分(向上取整、尾核截断防御、越界核空转),UB 单块搬运含容量校验;kernel 侧按 schMode 分派 fp32/fp16 双实例,采用数值稳定的 1 - 2/(e^{2x}+1) 公式(仅 1 次 Exp 运算),统一 DataCopyPad 搬运;含完整 UT 与精度比对(MERE/MARE)体系。