当前Pull Request已关闭, 关闭人@shaoyf
变更摘要
本PR为CANN Code Detective挑战赛第一期任务提交了一个逐元素除法算子(DivCustom)的实现框架。新增了算子内核文件 div_custom.asc 和编译运行脚本 run.sh,其中定义了 KernelDiv 类、DivCustomTilingData 结构体以及配套的 kernel_div、VerifyResult 和 main 函数骨架,供后续填充具体的 Init、Process、CopyIn、Compute、CopyOut 等核心逻辑。
主要改动
- 新增
div_custom.asc算子内核骨架:定义了DivCustomTilingData分片数据结构(含totalLength和tileNum)、KernelDiv算子类及其Init/Process/CopyIn/Compute/CopyOut方法声明,以及__global__ void div_custom内核入口;所有核心方法体均留空待实现。 - 实现
VerifyResult验证函数:提供了完整的输出与期望值对比逻辑,支持打印张量前20个元素并在比较通过/失败时输出相应提示信息。 - 实现
main测试入口:构造了两组长度为8 × 2048的测试向量(valueX = 1.2f,valueY = 2.3f)并预计算黄金标准结果,等待调用kernel_div完成验证。 - 新增
run.sh编译运行脚本:激活 CANN 环境、创建build目录并通过 CMake 编译后执行div_test测试程序。


代码审查
审查总结
我对全部 3 个变更文件逐一完成了审查:
| 文件 | 审查结果 |
|---|---|
CMakeLists.txt |
无问题 — 与模板一致,ASC 构建配置正确 |
div_custom.asc |
发现 3 个问题(1×P0, 1×P2, 1×P3) |
run.sh |
发现 1 个问题(1×P2) |
按优先级统计:
- P0: 1 个 —
output变量未声明,代码无法编译 - P2: 2 个 —
kernel_div缺少 return 语句(UB 陷阱);run.sh缺少set -euo pipefail(错误静默吞掉) - P3: 1 个 —
std::equal未检查第二范围长度(潜在越界读取)
总体风险判断:高。 提交的代码与模板完全一致,所有 // 请补充…… 占位符均未实现。最致命的问题是第 94 行使用了未声明的变量 output,导致代码在任何编译器下都无法通过编译。此外 run.sh 缺乏错误处理机制,即使代码实现完成后,构建环境异常时也无法及时发现。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 2 |
⛔ 需要修改


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-cann/cann-outreach | ❌ (0/2)(You can also ask: yanyawen, 傅涛, jxlang, 田晓亮, gcw_tgPdOLZT) | ❌ (0/1)(You can also ask: gcw_tgPdOLZT, Carolina_yuan, luzx66, li-shengxian3, 傅涛) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
shaoyf, thanks for your pull request. All authors of the commits have signed the CLA. 👍


🔴 Critical
文件 div_custom.asc 第 94 行使用了变量 output:
return VerifyResult(output, golden);
但 output 在整个 main 函数中从未声明或初始化。这是一个确定性的编译错误,任何编译器都会拒绝此代码。该文件与 Template 目录中的模板完全一致,说明提交者尚未完成实现。output 应在此之前被声明并通过调用 kernel_div(x, y) 获得返回值。
建议:在第 91 行注释处添加 output 的声明和 kernel_div 调用,例如:auto output = kernel_div(x, y);


🟡 Medium Priority
文件 div_custom.asc 第 55-58 行,函数 kernel_div 的返回类型为 std::vector<float>,但函数体为空(仅有占位注释 // 请补充……),没有任何 return 语句。
std::vector
{
// 请补充……
}
根据 C++ 标准,从非 void 函数末尾流出属于未定义行为(仅有 main 函数例外)。当前 main 中尚未调用该函数(第 91 行为占位注释),因此该 UB 当前不会被触发。但一旦后续实现者在第 91 行添加 kernel_div 调用,将立即触发未定义行为。这是一个为未来开发者埋下的陷阱。
建议:在函数体中添加正确的实现和 return 语句。如果暂时不便实现完整逻辑,至少应添加 return {}; 或抛出异常以避免未定义行为。


🟡 Medium Priority
文件 run.sh 缺少 set -euo pipefail(或至少 set -e),导致脚本中命令失败时不会自动退出,错误被静默吞掉。
具体风险路径:
- 第 3 行
source "$ASCEND_TOOLKIT_HOME/set_env.sh"— 如果set_env.sh不存在或 source 失败,脚本继续执行后续命令,后续的 cmake/make 可能在错误的环境下运行。 - 第 4 行
mkdir -p build— 如果因权限不足等原因失败,第 6 行cd build/仍会尝试进入该目录(虽然&&链能保护cd → cmake → make序列)。 - 第 5 行
export ASC_DIR=...— 如果ASCEND_HOME_PATH未设置(可能因为 line 3 的 source 失败),ASC_DIR将指向错误路径/aarch64-linux/tikcpp/ascendc_kernel_cmake/,cmake 可能因此找不到 ASC 包而失败,但错误信息不够直观。
添加 set -euo pipefail 能让脚本在第一条命令失败时立即退出,避免级联错误。
建议:在第 2 行(#!/bin/bash 之后)添加 set -euo pipefail,确保任何命令失败时脚本立即退出。


变更描述 / Description
完成CANN Code Detective第一期任务
改动类型 / Change Type
关联 Issue / Related Issues
测试信息 / Testing
检查清单 / Checklist
以下为测试结果(当前为样例测试,没有实现所以结果错误,正常提交需要提供通过截图)
