已关闭
[CANN Code Detective][Challenge01] 逐元素除法算子实现示例 #1050
shaoyf创建于 7月16日关闭于 7月16日
[CANN Code Detective][Challenge01] 逐元素除法算子实现示例 #1050
已关闭
shaoyf创建于 7月16日关闭于 7月16日
shaoyf成员
7月16日

变更描述 / Description

完成CANN Code Detective第一期任务

改动类型 / Change Type

  • Closes #
  • References #

测试信息 / Testing

检查清单 / Checklist

以下为测试结果(当前为样例测试,没有实现所以结果错误,正常提交需要提供通过截图)
image.png

likedislike
当前Pull Request已关闭, 关闭人@shaoyf
atomgit-bot
atomgit-bot
7月16日 评论:

变更摘要

本PR为CANN Code Detective挑战赛第一期任务提交了一个逐元素除法算子(DivCustom)的实现框架。新增了算子内核文件 div_custom.asc 和编译运行脚本 run.sh,其中定义了 KernelDiv 类、DivCustomTilingData 结构体以及配套的 kernel_divVerifyResultmain 函数骨架,供后续填充具体的 InitProcessCopyInComputeCopyOut 等核心逻辑。

主要改动

  • 新增 div_custom.asc 算子内核骨架:定义了 DivCustomTilingData 分片数据结构(含 totalLengthtileNum)、KernelDiv 算子类及其 Init/Process/CopyIn/Compute/CopyOut 方法声明,以及 __global__ void div_custom 内核入口;所有核心方法体均留空待实现。
  • 实现 VerifyResult 验证函数:提供了完整的输出与期望值对比逻辑,支持打印张量前20个元素并在比较通过/失败时输出相应提示信息。
  • 实现 main 测试入口:构造了两组长度为 8 × 2048 的测试向量(valueX = 1.2fvalueY = 2.3f)并预计算黄金标准结果,等待调用 kernel_div 完成验证。
  • 新增 run.sh 编译运行脚本:激活 CANN 环境、创建 build 目录并通过 CMake 编译后执行 div_test 测试程序。
likedislike
atomgit-bot
atomgit-bot
7月16日 评论:

代码审查

审查总结

我对全部 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

⛔ 需要修改

likedislike
CANN-robotCANN-robot成员
7月16日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月16日 评论:

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 /approve or /lgtm
  • Commenting /approve implies 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. 👍

likedislike
Sshaoyf成员
7月16日 修改标题为 “[CANN Code Detective][Challenge01] 逐元素除法算子shaoyf实现”,原标题为“[CANN Code Detective][Challenge01] 逐元素除法算子实现”
Sshaoyf成员
7月16日 修改了pull request 的描述
Sshaoyf成员
7月16日 修改了pull request 的描述
Sshaoyf成员
7月16日 修改了pull request 的描述
Sshaoyf成员
7月16日 修改了pull request 的描述
Sshaoyf成员
7月16日 修改了pull request 的描述
Sshaoyf成员
7月16日 修改标题为 “[CANN Code Detective][Challenge01] 逐元素除法算子shaoyf实现示例”,原标题为“[CANN Code Detective][Challenge01] 逐元素除法算子shaoyf实现”
Sshaoyf成员
7月16日 修改标题为 “[CANN Code Detective][Challenge01] 逐元素除法算子实现示例”,原标题为“[CANN Code Detective][Challenge01] 逐元素除法算子shaoyf实现示例”
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/shaoyf/DivCustom/div_custom.asc
@@ -0,0 +91,4 @@
91+ // 请补充……
92+ 
93+ std::vector<float> golden(totalLength, valueX / valueY);
94+ return VerifyResult(output, golden);
atomgit-bot
atomgit-bot7月16日评论:

🔴 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);

likedislike
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/shaoyf/DivCustom/div_custom.asc
@@ -0,0 +55,4 @@
55+std::vector<float> kernel_div(std::vector<float> &x, std::vector<float> &y)
56+{
57+ // 请补充……
58+}
atomgit-bot
atomgit-bot7月16日评论:

🟡 Medium Priority

文件 div_custom.asc 第 55-58 行,函数 kernel_div 的返回类型为 std::vector<float>,但函数体为空(仅有占位注释 // 请补充……),没有任何 return 语句。

std::vector kernel_div(std::vector &x, std::vector &y)
{
// 请补充……
}

根据 C++ 标准,从非 void 函数末尾流出属于未定义行为(仅有 main 函数例外)。当前 main 中尚未调用该函数(第 91 行为占位注释),因此该 UB 当前不会被触发。但一旦后续实现者在第 91 行添加 kernel_div 调用,将立即触发未定义行为。这是一个为未来开发者埋下的陷阱。

建议:在函数体中添加正确的实现和 return 语句。如果暂时不便实现完整逻辑,至少应添加 return {}; 或抛出异常以避免未定义行为。

likedislike
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/shaoyf/DivCustom/run.sh
@@ -0,0 +1,0 @@
1+#!/bin/bash
atomgit-bot
atomgit-bot7月16日评论:

🟡 Medium Priority

文件 run.sh 缺少 set -euo pipefail(或至少 set -e),导致脚本中命令失败时不会自动退出,错误被静默吞掉。

具体风险路径:

  1. 第 3 行 source "$ASCEND_TOOLKIT_HOME/set_env.sh" — 如果 set_env.sh 不存在或 source 失败,脚本继续执行后续命令,后续的 cmake/make 可能在错误的环境下运行。
  2. 第 4 行 mkdir -p build — 如果因权限不足等原因失败,第 6 行 cd build/ 仍会尝试进入该目录(虽然 && 链能保护 cd → cmake → make 序列)。
  3. 第 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,确保任何命令失败时脚本立即退出。

likedislike
Sshaoyf成员
7月16日 关闭了 pull request