合并受阻
变更摘要
本 PR 为 CANN Summer Camps 2026 代码侦探活动 Challenge01-DivCustom 任务新增了逐元素除法算子 DivCustom 的示例实现。核心内容是在 div_custom.asc 文件中实现了一个基于 AscendC 框架的 kernel,支持两个 float32 张量的逐元素除法运算,采用 Tiling 策略分片处理,并通过 CopyIn → Compute → CopyOut 流水线优化数据搬运与计算效率。
主要改动
- 新增
div_custom.asc算子文件:新增完整的 AscendC kernel 源文件,包含DivCustomTilingData结构体、KernelDiv类以及div_customkernel 入口函数,总计 178 行代码。 - 实现
KernelDiv类的 Tiling 分片机制:KernelDiv通过totalLength、tileNum、tileLength三个参数将大数据按 tile 划分,Process方法循环迭代每个 tile 依次执行 CopyIn、Compute、CopyOut。 - 实现双缓冲流水线(Double Buffer):使用
TPipe和TQue管理 UB 队列,输入队列inQueueX、inQueueY与输出队列outQueueZ均配置BUFFER_NUM=2,通过EnQue/DeQue/FreeTensor机制实现数据搬运与计算的流水线并行。 - 实现
kernel_divhost 端封装函数:负责 device 内存的aclrtMalloc申请、host-to-device 数据拷贝、AscendC::LaunchKernel启动 kernel、device-to-host 结果回拷以及aclrtFree释放,对外提供简洁的调用接口。 - 内置验证逻辑:
main函数构造全为 1.2 的输入 x 和全为 2.3 的输入 y,计算输出后与valueX/valueY生成的 golden 数据通过VerifyResult进行对比验证。


代码审查
审查总结
已审查文件:
2026/CANN-Code-Detective/Challenge01-DivCustom/SampleUse/DivCustom/div_custom.asc— 发现 8 个问题
按优先级分布:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P0 | 1 | VerifyResult 函数未定义,代码无法通过编译 |
| P1 | 3 | 缺少 ACL 运行时初始化、aclrtMalloc 与 aclrtMemcpy 返回值未检查,运行时将崩溃 |
| P2 | 2 | tileLength 整数除法截断(非整除时丢数据)、kernel_div 忽略输入 vector 实际大小 |
| P3 | 2 | int32_t/uint32_t 符号不匹配警告、Compute() 未使用 progress 参数 |
整体风险评估:高风险。 P0 问题直接阻塞编译;P1 问题导致在真实 CANN 环境下运行时必然崩溃(未初始化 ACL + 不检查错误码);P2 问题在当前硬编码参数下恰好不触发,但代码作为 Sample 示例存在隐患,后续使用者修改参数时可能遭遇静默错误。建议优先修复 P0 和所有 P1 问题后再合入。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 4 |
| 🟡 建议 | 1 |
⛔ 需要修改


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: li-shengxian3, yanyawen, 田晓亮, yanhf, jxlang) | ❌ (0/1)(You can also ask: jxlang, 傅涛, 田晓亮, shaoyf, 王艳秋) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
m0_62011685, thanks for your pull request. All authors of the commits have signed the CLA. 👍


🟠 High Priority
变更行:第 147-148 行和第 155 行,三次 aclrtMemcpy 调用均未检查返回值。
受影响的契约:aclrtMemcpy 返回 aclError。若拷贝失败(如设备内存不可访问、权限不足),数据不会正确传输,但代码继续执行后续逻辑。
失败模式:
- H2D 拷贝(第 147-148 行)失败 → device 内存中为未初始化数据,kernel 计算结果为垃圾值。
- D2H 拷贝(第 155 行)失败 →
zvector 中为未初始化数据,VerifyResult 将误报失败或意外通过。
建议:对每个 aclrtMemcpy 调用检查返回值,失败时清理已分配资源并向上报告错误。


🟠 High Priority
变更行:main() 函数(第 165-178 行)和 kernel_div() 函数(第 126-163 行)。
受影响的契约:CANN ACL 运行时要求在调用任何 aclrt* API(如 aclrtMalloc、aclrtMemcpy、LaunchKernel)之前必须先调用 aclInit(nullptr) 初始化,运行结束后调用 aclFinalize() 释放资源。
失败模式:运行时 aclrtMalloc 等调用将返回 ACL_ERROR_RT_NOT_INIT 错误码(但因返回值未被检查而静默失败),后续对空指针的 aclrtMemcpy 导致段错误崩溃。
建议:在 main() 开头添加 aclInit(nullptr),在 return 之前添加 aclFinalize(),并检查两者的返回值。


🟠 High Priority
变更行:第 142-144 行三次 aclrtMalloc 调用均未检查返回值。
受影响的契约:aclrtMalloc 返回 aclError 类型错误码,成功返回 ACL_SUCCESS。当 device 内存不足或运行时未初始化时分配会失败,返回的 deviceX/deviceY/deviceZ 保持为 nullptr。
失败模式:若任一 aclrtMalloc 失败,后续第 147-148 行的 aclrtMemcpy(deviceX, ...) 将对空指针执行 device 端内存拷贝,导致运行时段错误或不可预期的行为。此外,若 deviceX 分配成功但 deviceY 失败,代码不会释放已成功的 deviceX(资源泄漏在崩溃时次要)。
建议:对每个 aclrtMalloc 调用检查返回的 aclError,失败时执行清理并通过异常或错误码向上传播。


🟡 Medium Priority
变更行:第 32 行 this->tileLength = totalLength / tileNum;。
受影响的契约:当 totalLength 不能被 tileNum 整除时,整数除法舍去余数,每个 tile 只处理 tileLength 个元素,循环执行 tileNum 次总计处理 tileNum * (totalLength / tileNum) 个元素,末尾 totalLength % tileNum 个元素永远不会被处理。
失败模式:在当前硬编码参数下(totalLength=16384, tileNum=8)恰好整除,不触发。但若任何人修改 totalLength 或 tileNum 使得不能整除(如 totalLength=16385),末尾元素将保持为设备内存中的未初始化数据,导致静默数据丢失和输出不正确。
建议:在 Process() 循环中动态计算每个 tile 的实际长度:若为最后一个 tile,使用 totalLength - progress * tileLength 作为实际处理长度。同时在 Init 中可对 tileNum ≤ totalLength 做断言。


🔴 Critical
变更行:第 177 行调用 VerifyResult(output, golden)。
受影响的契约:main() 函数依赖 VerifyResult 来验证输出精度。该函数在模板文件(Template/DivCustom/div_custom.asc 第 60-81 行)中已定义,但在 SampleUse 实现中被遗漏。
失败模式:编译时链接器报错 undefined reference to VerifyResult(...),代码无法通过编译。
建议:将模板中 VerifyResult 函数(第 60-81 行)完整拷贝到本文件第 164 行之前(kernel_div 函数之后、main 函数之前)。


CLA检查未通过,详情可参考这里


当前 PR 是否有 AI 参与:
[ ] 否
[x] 是
__1. AI Agent 平台: codex
__2. AI 模型: Qwen3.5
__3. Prompt 上下文: 代码文件生成、PR 描述撰写
PR 功能描述 / 为什么需要这个合入**:
完成 CANN Summer Camps 2026 代码侦探活动 Challenge01-DivCustom 任务,实现逐元素除法算子 (DivCustom)。
主要工作:
div_custom.asc算子,支持两个 float32 类型张量的逐元素除法运算该 PR 关联的 issue
(格式为 fixes #<issue 号>, 或者 resolves #<issue 号>):
fixes #215
希望检视人员了解:
改动类型 / Change Type
测试信息 / Testing
验证结果:
输入:x = 1.2, y = 2.3
输出:z = x / y ≈ 0.521739
结果符合预期
检查清单 / Checklist