【Super Point】Spine-Triton 编译器:make_block_ptr 对全局 tensor 和 tile tensor 一刀切检查导致大 tensor 无法使用

系统版本 / 镜像

项目 信息
系统 Bianbu 4.0.1 (Resolute Raccoon)
内核 6.18.3-generic
架构 RISC-V 64 (rv64gc)
SoC SpacemiT Key Stone K3
AI 核 8× A100, VLEN=1024, 60 TOPS
相关库 Spine-Triton (SpacemiT 定制版)
开发板 SpacemiT K3 Pico ITX

使用场景或测试目标

使用 Spine-Triton 在 A100 AI 核上进行GEMM 运算。

GEMM 矩阵规模为:

  • col : 518400 × 27(或 144)
  • weight : 16 × 27(或 144 × 16)
  • 总元素数:518400 × 27 = 13,996,800 > 1M

为了在 A100 上执行,采用了 K 维分块策略:

python

分块策略 for k_start in range(0, K, max_K): block = a[:, k_start:k_start+max_K] @ b[k_start:k_start+max_K, :] # max_K = min(1048576 // N, K) # 确保分块后 <=1M

这样每个 make_block_ptr 只指向当前 K 分块(≤1M 元素),而非整个 tensor。

操作步骤

1. 编写 Spine-Triton kernel

python

@triton.jit def gemm_kernel(a_ptr, b_ptr, c_ptr, M, N, K, …): # 获取当前 program 的块索引 pid_m = tl.program_id(0) pid_n = tl.program_id(1) pid_k = tl.program_id(2) # K 维分块 # 使用 make_block_ptr 指向分块后的数据 a_block = tl.make_block_ptr( base=a_ptr, shape=(M, K_block), # K_block ≤ 1M strides=(K, 1), # stride 基于原始 K offsets=(m_off, k_off), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0) ) # …

2. 编译 kernel

bash

python3 -c " import triton import triton.language as tl @triton.jit def test_kernel(…): # 包含 make_block_ptr 的 kernel pass # 尝试编译 test_kernel(1,1,1) "

3. 观察编译器错误

text

RuntimeError: make_block_ptr cannot be used on tensors with numel > 1048576

结果数据 / 截图 / 日志

编译器错误

text

RuntimeError: make_block_ptr cannot be used on tensors with numel > 1048576

编译器检查逻辑(推测)

python

当前检查逻辑(在 spine-triton 编译器中) def check_make_block_ptr(tensor): if tensor.numel() > MAX_TENSOR_NUMEL: # 1048576 raise RuntimeError(“make_block_ptr cannot be used on tensors with numel > 1048576”)

分块前后的对比

场景 K 分块后 K_block 元素数 编译器检查结果
无分块 518400 13,996,800 :x: 失败
K 分块 (max_K=1048576//N) 65536 1,769,472 :x: 仍 >1M
K 分块 (max_K=1048576//N) 32768 884,736 :white_check_mark: <1M 但 N 太小

问题在于:编译器检查的是基 tensor 的总元素数 ,而不是 make_block_ptr 实际指向的分块大小

实际内存占用

数据 位置 说明
原始 tensor CPU 内存 由 Python numpy 管理
分块数据 A100 Scratchpad 仅加载当前 K 分块 (≤1M)

编译器的一刀切检查阻止了用户手动分块的意图——虽然分块后的数据可以放入 Scratchpad,但编译器仍拒绝编译。

遇到的问题

核心问题 :Spine-Triton 编译器对所有 make_block_ptr 做一刀切检查,没有区分“这个 tensor 是否需要完全驻留在 Scratchpad 上”和“这个 tensor 只是被分块访问”。

检查项 预期 实际
分块后 tensor 元素数 ≤1M :white_check_mark: :white_check_mark:
编译器检查通过 :white_check_mark: 应该通过 :x: 拒绝编译
编译器检查的对象 分块后的视图 原始 tensor

影响范围

  • K 维分块 A100 GEMM 无法工作

你的判断 / 改进建议

判断

  1. 编译器检查过于激进make_block_ptr 的检查应该基于实际 pointer 指向的视图大小 ,而非基 tensor 的总大小。用户已经通过分块策略确保了每个 make_block_ptr 指向的数据 ≤1M。
  2. Triton 设计意图 :在标准 Triton (CUDA) 中,make_block_ptrshape 参数就是实际分块形状,编译器应基于 shape 而非基 tensor 的 numel() 做检查。SpacemiT 版本可能修改了此行为。
  3. 性能影响 :如果此问题不修复,A100 在 K3 上的可用性将严重受限——任何需要处理大 tensor 的 GEMM 都无法使用 A100,只能回退到 CPU。

Package registry · archive / pypi · GitLab spine-triton更新一下,这都是旧版的限制

官方最新版是a5,但是1M限制还在

TRITON_MAX_TENSOR_NUMEL = 1048576
if numel > TRITON_MAX_TENSOR_NUMEL:
raise ValueError(f"numel ({numel}) exceeds triton maximum tensor numel ({TRITON_MAX_TENSOR_NUMEL})")

a5 仍有 1048576 限制,请问具体是哪个版本修复了这个问题?或者需要从哪个分支源码编译?"

现在检查的就是block_shape的元素数,请问你的block_shape是多大,是否元素数已超过1048576

“我的 BLOCK_SIZE_M=128, BLOCK_SIZE_K=2048, SUB_BLK_K=256, MICRO_M=16, MICRO_K=8。每个 view 的元素数都 ≤ 32768,远小于 1M。但 IR 阶段仍报 Maximum allowed number of elements is 1048576,tensor<32x131072xf32>。这是 descriptor_load 内部产生的中间 tensor 吗?”

能给一下你当前运行的完整python代码吗

import torch
import triton
import triton.language as tl
import triton.language.extra.smt as smt
from triton.backends.spine_triton.driver import CPUDriver

triton.runtime.driver.set_active(CPUDriver())

M, N, K = 32, 129600, 1440

A = torch.randn(M, K, dtype=torch.float32)
B = torch.randn(K, N, dtype=torch.float32)
C = torch.empty(M, N, dtype=torch.float32)

from spine_gemm import _compute
_compute(M, N, K, A, B, C)
print(“PASS”)

“能否将 TRITON_MAX_TENSOR_NUMEL 从 1048576(1M)提升到 134217728(128M)?当前限制阻碍了较大矩阵的 GEMM 使用 A100。或者提供一个环境变量让用户自定义这个值。”

如果官方不愿意放宽全局限制,可以建议加一个环境变量:

python

_utils.py 中改为可配置 TRITON_MAX_TENSOR_NUMEL = int(os.environ.get(“TRITON_MAX_TENSOR_NUMEL”, 1048576))

这样用户可以通过 export TRITON_MAX_TENSOR_NUMEL=134217728 自行调整,不影响默认行为。