合并受阻
变更摘要
本 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)(L0AzN)和tla.copy(l0_b, l1_b_k)(L0BnZ),由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。


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
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)


PR功能描述:
在
2026/CANN-Code-Detective/Challenge09-MatmulAddRelu/PR_code/gcw_JQJBklQH/提交 CATLASS PythonY = ReLU(A @ B + X)融合算子,固定 256×256×256、block_num=1,补全模板五处TODO:tla.copy(l1_a, gm_a)+tla.copy(l1_b, gm_b),A/B 各 128 KiB 整体按 zN 入 L1tla.copy(l0_a, l1_a_k)(L0A zN)+tla.copy(l0_b, l1_b_k)(L0B nZ)tla.mmad(l0_c, l0_a, l0_b, init_c=(k_tile == 0)),首片覆盖、其余三次累加tla.copy(ub_acc_full, l0_c, CopyL0C2DstParams(l0c2ub_mode=SPLIT_M)),两个 AIV 各 128×256acc_reg.store(tla.max(tla.add(acc_reg.load(), x_reg.load()), 0.0)),先加 X 再 ReLU,原位写回除五处
TODO外,未改动骨架的分块、mutex同步与最终 GM 写回逻辑;Template/与验证脚本保持原样。该PR关联的issue
无(活动题目,未关联 issue)
希望检视人员了解:
tla.add→tla.max(..., 0.0)),且 FixPipe 未提前启用relu_enable。mutex_l0c(CUBE↔FIX)显式同步保持一致,两种协议未混用。--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