Component
PTO Dialect / ODS (include/PTO/IR)
Description
lib/TileOps/tload_template.py 有两个 Cube 路径的 tload 模板(ND2NZ 和 DN2NZ),当源 view 的 valid_shape 为动态(v_row=? / v_col=?)时,两个 constraint 都返回 True,导致 select_kernel() 报二义性错误。
另外,缺少 DN2ZN(DN → transposed NZ,blayout=row_major, slayout=col_major)模板,导致 QK matmul(incore_4)的 K^T 加载失败。该模式在 pto-isa 的 C++ ISA 中已实现(TLoad.hpp:472, TLoadCubeDN2ZN),硬件通过复用 nd2nz 指令 + 行列参数互换来完成,不需要新的硬件指令。
Reproduction (minimal)
cd test/samples/Qwen3DecodeA5
# Cube kernel (tload 二义性)
ptoas qwen3_decode_incore_1.pto --pto-arch=a5 --pto-backend=vpto --pto-level=level3 -o /tmp/test.o
# Error: select_kernel() found multiple highest-priority kernels for tload:
# tload_gm_to_mat_dn2nz (priority=1) vs tload_gm_to_mat_nd2nz (priority=1)
# QK matmul (缺失 DN2ZN 模板)
ptoas qwen3_decode_incore_4.pto --pto-arch=a5 --pto-backend=vpto --pto-level=level3 -o /tmp/test.o
# Error: select_kernel() found no registered kernel after constraint evaluation for tload
Expected behavior
- 当
valid_shape 为动态时,通过源 view 的 layout 属性(#pto.layout<nd> / #pto.layout<dn>)来消歧,正确匹配 ND2NZ 或 DN2NZ 模板。
- DM→transposed NZ(
blayout=row_major, slayout=col_major)的 Cube 加载应匹配 DN2ZN 模板。
Actual behavior / error logs
Qwen3DecodeA5 的所有 Cube kernel 在 VPTO 路径下编译均失败:
| Kernel | 错误 |
|--------|------|
| incore_1/2/6/10/11 | `multiple highest-priority kernels ... tload_gm_to_mat_dn2nz vs tload_gm_to_mat_nd2nz` |
| incore_4 | `no registered kernel after constraint evaluation for tload` |
根因分析:
1. **ND2NZ/DN2NZ 二义性**:两个 constraint 都要求 `dst.blayout=COL_MAJOR, dst.slayout=ROW_MAJOR`,当 `valid_shape=[null, null]` 时,`_known_eq()` 遇 `None` 返回 `True`,两个 constraint 同时通过,`select_kernel()` 报二义性。
2. **DN2ZN 缺失**:incore_4 的 K tile 需要 `blayout=ROW_MAJOR, slayout=COL_MAJOR`(转置 NZ),不匹配任何现有模板。硬件 C++ ISA 已支持(`TLoadCubeDN2ZN`),它内部复用 `nd2nz` 硬件指令 + 行列参数互换,但 TileOps 模板库缺少对应封装。
Git commit
0
Host platform
None
Target Ascend arch (if relevant)
None
PTOAS build level (if relevant)
None
Component
PTO Dialect / ODS (include/PTO/IR)
Description
lib/TileOps/tload_template.py有两个 Cube 路径的tload模板(ND2NZ和DN2NZ),当源 view 的valid_shape为动态(v_row=?/v_col=?)时,两个 constraint 都返回True,导致select_kernel()报二义性错误。另外,缺少
DN2ZN(DN → transposed NZ,blayout=row_major, slayout=col_major)模板,导致 QK matmul(incore_4)的 K^T 加载失败。该模式在pto-isa的 C++ ISA 中已实现(TLoad.hpp:472, TLoadCubeDN2ZN),硬件通过复用nd2nz指令 + 行列参数互换来完成,不需要新的硬件指令。Reproduction (minimal)
Expected behavior
valid_shape为动态时,通过源 view 的layout属性(#pto.layout<nd>/#pto.layout<dn>)来消歧,正确匹配ND2NZ或DN2NZ模板。blayout=row_major, slayout=col_major)的 Cube 加载应匹配DN2ZN模板。Actual behavior / error logs
Git commit
0
Host platform
None
Target Ascend arch (if relevant)
None
PTOAS build level (if relevant)
None