已开启
【代码侦探Challenge01-DivCustom】新增DivCustom代码提交PR样例 #1052
【代码侦探Challenge01-DivCustom】新增DivCustom代码提交PR样例 #1052
已开启
guest_shao创建于 7月16日
3 个文件变更+114-0
A2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/CMakeLists.txt+10-0
@@ -0,0 +1,10 @@
1+cmake_minimum_required(VERSION 3.16)
2+find_package(ASC REQUIRED)
3+project(kernel_samples LANGUAGES ASC CXX)
4+ 
5+add_executable(div_test
6+ div_custom.asc
7+)
8+target_compile_options(div_test PRIVATE
9+ $<$<COMPILE_LANGUAGE:ASC>:--npu-arch=dav-2201>
10+)
A2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/div_custom.asc+95-0
@@ -0,0 +1,95 @@
1+// div_custom.asc
2+ 
3+#include <cstdint>
4+#include <iostream>
5+#include <vector>
6+#include <algorithm>
7+#include <iterator>
8+#include "acl/acl.h"
9+#include "kernel_operator.h"
10+ 
11+constexpr uint32_t BUFFER_NUM = 2; // tensor num for each queue
12+ 
13+struct DivCustomTilingData
14+{
15+ uint32_t totalLength;
16+ uint32_t tileNum;
17+};
18+ 
19+class KernelDiv {
20+public:
21+ __aicore__ inline KernelDiv(){}
22+ __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, uint32_t totalLength, uint32_t tileNum)
23+ {
24+ // 请补充……
25+ // 添加注释
26+ }
27+ __aicore__ inline void Process()
28+ {
29+ // 请补充……
30+ }
31+ 
32+private:
33+ __aicore__ inline void CopyIn(int32_t progress)
34+ {
35+ // 请补充……
36+ }
37+ __aicore__ inline void Compute(int32_t progress)
38+ {
39+ // 请补充……
40+ }
41+ __aicore__ inline void CopyOut(int32_t progress)
42+ {
43+ // 请补充……
44+ }
45+ 
46+private:
47+ // 请补充……
48+};
49+ 
50+__global__ __aicore__ void div_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, DivCustomTilingData tiling)
51+{
52+ // 请补充……
53+}
54+ 
55+std::vector<float> kernel_div(std::vector<float> &x, std::vector<float> &y)
56+{
57+ // 请补充……
58+}
59+ 
60+uint32_t VerifyResult(std::vector<float> &output, std::vector<float> &golden)
61+{
62+ auto printTensor = [](std::vector<float> &tensor, const char *name) {
63+ constexpr size_t maxPrintSize = 20;
64+ std::cout << name << ": ";
65+ std::copy(tensor.begin(), tensor.begin() + std::min(tensor.size(), maxPrintSize),
66+ std::ostream_iterator<float>(std::cout, " "));
67+ if (tensor.size() > maxPrintSize) {
68+ std::cout << "...";
69+ }
70+ std::cout << std::endl;
71+ };
72+ printTensor(output, "Output");
73+ printTensor(golden, "Golden");
74+ if (std::equal(golden.begin(), golden.end(), output.begin())) {
atomgit-bot
atomgit-botatomgit-bot7月16日

🟡 Medium Priority

变更行:div_custom.asc 第 74 行 std::equal(golden.begin(), golden.end(), output.begin())

std::equal(first1, last1, first2) 仅比较 [first1, last1) 范围内的元素是否与从 first2 开始的元素一一相等,不检查两个区间的长度是否相同。因此:

  1. 越界读(UB):若 output.size() < golden.size()output.begin() 迭代器前进超过 golden.size() 步时会超出 output 的合法范围,触发未定义行为。
  2. 漏检(false positive):若 output.size() > golden.size() 且前 golden.size() 个元素恰好匹配,std::equal 返回 trueoutput 尾部多余的(可能错误)元素被完全忽略,精度验证形同虚设。

VerifyResult 不在 README 列出的"你需要完成的内容"中,是挑战提供方应保证正确的函数,此缺陷会直接影响所有参与者的验证结果可信度。

改动建议
74
- if (std::equal(golden.begin(), golden.end(), output.begin())) {
74
+ if (golden.size() == output.size() && std::equal(golden.begin(), golden.end(), output.begin())) {
应用建议
likedislike
75+ std::cout << "[Success] Case accuracy is verification passed." << std::endl;
76+ return 0;
77+ } else {
78+ std::cout << "[Failed] Case accuracy is verification failed!" << std::endl;
79+ return 1;
80+ }
81+}
82+ 
83+int32_t main(int32_t argc, char *argv[])
84+{
85+ constexpr uint32_t totalLength = 8 * 2048;
86+ constexpr float valueX = 1.2f;
87+ constexpr float valueY = 2.3f;
88+ std::vector<float> x(totalLength, valueX);
89+ std::vector<float> y(totalLength, valueY);
90+ 
91+ // 请补充……
92+ 
93+ std::vector<float> golden(totalLength, valueX / valueY);
94+ return VerifyResult(output, golden);
95+}
A2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/run.sh+9-0
@@ -0,0 +1,9 @@
1+#!/bin/bash
atomgit-bot
atomgit-botatomgit-bot7月16日

🟡 Medium Priority

变更行:run.sh 整体(新增的 9 行脚本)。

脚本缺少 set -euo pipefail(或至少 set -eu),导致以下可靠性问题:

  1. 第 3 行 source "$ASCEND_TOOLKIT_HOME/set_env.sh":若 ASCEND_TOOLKIT_HOME 环境变量未设置或为空,bash 会将此展开为 source "/set_env.sh",尝试 source 根目录下的文件。虽然该文件大概率不存在(会报错),但由于没有 set -e,脚本不会在此退出,而是继续执行后续命令
  2. 第 5 行 export ASC_DIR="$ASCEND_HOME_PATH/...":同理,若 ASCEND_HOME_PATH 未设置,ASC_DIR 会指向 /aarch64-linux/...(绝对路径从根开始),后续 cmake 会因找不到 ASC 包而失败,但错误信息不直观。
  3. 第 6–9 行的 && 链提供了部分保护,但第 3–5 行的命令不受保护。

set -euo pipefail 会在任何命令失败(-e)、使用未定义变量(-u)、管道中任意命令失败(-o pipefail)时立即退出,是 shell 脚本的基本安全网。

建议:在 #!/bin/bash 之后新增一行 set -euo pipefail

改动建议
1
- #!/bin/bash
1
+ #!/bin/bash
2
+ set -euo pipefail
应用建议
likedislike
2+# 激活cann环境,可根据实际情况修改,在线环境一般不用修改,
atomgit-bot
atomgit-botatomgit-bot7月16日

🟡 Medium Priority

run.sh 脚本缺少 set -euo pipefail(或至少 set -e),具体影响如下:

  1. source 失败被静默忽略(第 3 行):若 $ASCEND_TOOLKIT_HOME/set_env.sh 不存在或有错误,source 返回非零退出码,脚本继续执行,后续 cmake/make 在不完整的环境中运行。
  2. mkdir -p build 失败被静默忽略(第 4 行):无 set -e 且无 && 保护,若因权限等问题失败,脚本仍继续执行 cd build/
  3. 未定义变量静默展开为空ASCEND_TOOLKIT_HOMEASCEND_HOME_PATH 未设置时,分别导致 source "/set_env.sh"ASC_DIR="/aarch64-linux/...",产生错误路径。

触发条件:运行环境中 ASCEND_TOOLKIT_HOMEASCEND_HOME_PATH 未正确设置,或 set_env.sh 不存在/执行失败。

建议在 #!/bin/bash 之后立即添加 set -euo pipefail,使得任何命令失败或未定义变量引用时脚本立即退出。

建议:在 #!/bin/bash 之后添加 set -euo pipefail,使脚本在任何命令失败、引用未定义变量、或管道中任一命令失败时立即退出。

改动建议
2
- # 激活cann环境,可根据实际情况修改,在线环境一般不用修改,
2
+ #!/bin/bash
3
+ set -euo pipefail
应用建议
likedislike
3+source "$ASCEND_TOOLKIT_HOME/set_env.sh"
4+mkdir -p build
5+export ASC_DIR="$ASCEND_HOME_PATH/aarch64-linux/tikcpp/ascendc_kernel_cmake/"
6+cd build/ && \
7+cmake .. && \
8+make && \
9+./div_test