已开启
【代码侦探·Challenge 09】北京科技大学 - challenge09_matmuladdrelu #4267
【代码侦探·Challenge 09】北京科技大学 - challenge09_matmuladdrelu #4267
已开启
gcw_JQJBklQH创建于 9月29日
gcw_JQJBklQH
gcw_JQJBklQH
9月29日

PR功能描述:

在 2026/CANN-Code-Detective/Challenge09-MatmulAddRelu/PR_code/gcw_JQJBklQH/ 提交 CATLASS Python
Y = ReLU(A @ B + X) 融合算子,固定 256×256×256、block_num=1,补全模板五处 TODO:

TODO 位置 补全内容
1 GM → L1 tla.copy(l1_a, gm_a) + tla.copy(l1_b, gm_b),A/B 各 128 KiB 整体按 zN 入 L1
2 L1 → L0 当前 K=64 分片:tla.copy(l0_a, l1_a_k)(L0A zN)+ tla.copy(l0_b, l1_b_k)(L0B nZ)
3 L0C 累加 tla.mmad(l0_c, l0_a, l0_b, init_c=(k_tile == 0)),首片覆盖、其余三次累加
4 L0C → UB tla.copy(ub_acc_full, l0_c, CopyL0C2DstParams(l0c2ub_mode=SPLIT_M)),两个 AIV 各 128×256
5 Vector 后处理 acc_reg.store(tla.max(tla.add(acc_reg.load(), x_reg.load()), 0.0)),先加 X 再 ReLU,原位写回

除五处 TODO 外,未改动骨架的分块、mutex 同步与最终 GM 写回逻辑;Template/ 与验证脚本保持原样。

该PR关联的issue

无(活动题目,未关联 issue)

希望检视人员了解:

  • ReLU 严格在加 X 之后执行(tla.add → tla.max(..., 0.0)),且 FixPipe 未提前启用 relu_enable。
  • L0C→UB 未启用 unit_flag 协议,与骨架给出的 mutex_l0c(CUBE↔FIX)显式同步保持一致,两种协议未混用。
  • 本地已完成前端 lowering 与 --npu-arch 3510 后端编译验证;数值 PASS 未在本机复现:当前开发机
    NPU 为 Ascend910_9362(NpuArch=2201 / dav-c220),无法执行 catlass 编译出的 c310
    (Ascend 950 系列)内核——同一环境下一个来自官方文档的最小 add_one 样例亦报
    Illegal instruction,而已确认普通 torch/torch_npu 算子在本机工作正常。
    数值验收需在 Ascend 950 环境运行:python PR_code/gcw_JQJBklQH/test_matmul_add_relu.py --device 0。

改动类型 / Change Type

测试信息 / Testing

检查清单 / Checklist

likedislike
合并受阻
gcw_JQJBklQHgcw_JQJBklQH
9月29日 创建了 pull request,commit 56fcb2a8
atomgit-bot
atomgit-bot
9月29日 评论:

变更摘要

本 PR 为 2026/CANN-Code-Detective/Challenge09-MatmulAddRelu/PR_code/gcw_JQJBklQH/ 新增了 CATLASS Python 融合算子实现与验证脚本,完成 Y = ReLU(A @ B + X) 在固定 M = N = K = 256、block_num=1 场景下的模板补全。matmul_add_relu.py 在既有骨架的分块、mutex 同步与最终 GM 写回结构基础上补齐五处 TODO,依次覆盖 GM→L1 搬运、L1→L0 分片搬运、tla.mmad 的 K 分片累加、L0C→UB 的 SPLIT_M 拆分,以及 Vector 端先加 X 再 ReLU 的后处理。test_matmul_add_relu.py 提供基于 tla.compile(..., options="--npu-arch 3510") 的数值验证流程,与 PyTorch 参考结果比对。

主要改动

  • GM → L1 数据搬运:在 mutex_l1 的 MTE2 锁区间内调用 tla.copy(l1_a, gm_a) 与 tla.copy(l1_b, gm_b),将连续行优先的 FP16 输入整体按 zN 布局搬入 L1。
  • L1 → L0 分片搬运:按 K=64 分片使用 tla.copy(l0_a, l1_a_k)(L0A zN)和 tla.copy(l0_b, l1_b_k)(L0B nZ),由 mutex_l0 保证 Cube 读取前的搬运完成。
  • 矩阵乘累加:以 tla.mmad(l0_c, l0_a, l0_b, init_c=(k_tile == 0)) 实现首片初始化、后续三次累加,仅完成乘加,X 相加与 ReLU 留在 Vector 端。
  • L0C → UB 拆分搬运:通过 tla.params.CopyL0C2DstParams(l0c2ub_mode=tla.params.L0C2UBMode.SPLIT_M) 将完整 FP32 结果按 SPLIT_M 搬到 ub_acc_full,使两个 AIV 各获得 128×256。
  • Vector Add + ReLU 后处理:在 SIMD 模式下对每个 acc_reg/x_reg 执行 acc_reg.store(tla.max(tla.add(acc_reg.load(), x_reg.load()), 0.0)),严格按先加 X 再 ReLU 的顺序原位写回。
  • 数值验证脚本:test_matmul_add_relu.py 使用随机 FP16 的 A/B 与线性分布的 X 计算 PyTorch 参考值,通过 from_dlpack 转换张量后编译执行内核,并以带容差的 torch.isfinite、非负与误差比较输出 PASS/FAIL。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月29日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
9月29日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
9月29日 评论:

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.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


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: 王艳秋, jxlang, yanyawen, 傅涛, 田晓亮) ❌ (0/1)(You can also ask: li-shengxian3, 田晓亮, jxlang, luzx66, gcw_tgPdOLZT)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)
likedislike
CANN-robot
CANN-robot成员
9月29日 评论:

CLA Signature Pass

gcw_JQJBklQH, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike