mit einem Klick
triton-ascend-case-matmul-large-k
// 矩阵乘法矩阵乘法 A[M, K] @ B[K, N] = C[M, N]中,大K维度矩阵乘法(K>>M,N)优化:针对M/N较小但K极大(如M=N=256,K=131072)的场景,Split-K切分K维度并行化、Workspace+Reduce替代全局同步,实现显著性能提升
// 矩阵乘法矩阵乘法 A[M, K] @ B[K, N] = C[M, N]中,大K维度矩阵乘法(K>>M,N)优化:针对M/N较小但K极大(如M=N=256,K=131072)的场景,Split-K切分K维度并行化、Workspace+Reduce替代全局同步,实现显著性能提升
Triton Ascend hard API restrictions and forbidden syntax. MUST-follow rules that apply to every kernel: forbidden control flow (return/break/continue/lambda/while), tensor slice/index restrictions, scalar conversion rules, BLOCK_SIZE upper bound. Violating any of these produces a compile or runtime error on Ascend.
Triton Ascend 性能优化通用策略: BLOCK_SIZE 选择 (1024-2048 for elementwise, must be <65536), grid configuration (use VEC_CORE_NUM / CUBE_CORE_NUM, 2D/3D grid for matmul / conv / reduce, 1D grid + inner loop for elementwise / pointwise), 256B alignment for memory transfers, autotune block-size patterns, fp16 / fp32 precision conversion. Bind via keywords like matmul, elementwise, reduce, block_size, grid, autotune, alignment, fp16, fp32, tile, interleaved-loop, cube-core, vec-core.
通过 adaptive_search 或 evolve 搜索式 workflow 生成优化算子。 后台 silent mode 执行,轮询监控进度。
适用于归约(reduce)类算子和含归约子步骤的复合算子(如归一化)的优化指南。典型算子包括:sum, mean, max, min, prod, argmax, argmin, cumsum, cumprod, softmax, logsoftmax, layernorm, rmsnorm, groupnorm, instancenorm, batchnorm, l1norm, l2norm, frobeniusnorm, var, std, average_pooling, sum_pooling 等。特别重要:当归约维度不是最后一维(如 dim=1 归约 shape=[B,F,D1,D2]),需要正确处理多维索引和两阶段归约。包含 PyTorch normalized_shape 多轴归一化语义说明。不适用于纯逐元素运算或矩阵乘法。如果算子是损失函数(先逐元素计算再全局归约),应选择 elementwise-reduce-fused 指南。
CPU C++ 算子核心概念、标准结构模式、KernelBench 代码规范和内嵌扩展方法
ARM CPU 架构性能优化技巧、NEON SIMD 向量化、数值稳定性和调试策略
| name | triton-ascend-case-matmul-large-k |
| description | 矩阵乘法矩阵乘法 A[M, K] @ B[K, N] = C[M, N]中,大K维度矩阵乘法(K>>M,N)优化:针对M/N较小但K极大(如M=N=256,K=131072)的场景,Split-K切分K维度并行化、Workspace+Reduce替代全局同步,实现显著性能提升 |
| category | case |
| version | 1.0.0 |
| metadata | {"backend":"ascend","dsl":"triton_ascend","hardware":"Atlas A2, Atlas A3, Atlas A5"} |
M=256, N=256, K=131072, BLOCK_M=64, BLOCK_N=64:
输出块数 = ceil(256/64) × ceil(256/64) = 4 × 4 = 16
可用核数 = 32
→ 16 块 < 32 核, 一半核空闲!
→ 每个核的 K-loop = 131072/256 = 512 次, 单核计算量极大
当输出块数 < 核心数时,将 K 维度切分成 SPLIT_K 段,让多个核并行计算同一输出块的不同 K 区间,用 tl.atomic_add 将划分后的partial结果累加到 C。另外,如果把SPLIT_K参数放在 grid 中,调整核数,可以使得无核空转。
# grid = (NUM_MN_BLOCKS, SPLIT_K)
# 例如:AI_Cude=32,M=N=256, BLOCK=128: NUM_MN_BLOCKS = 2*2 = 4
# grid = (4, 16) → 64 , 32核每核处理2块数据
@triton.jit
def matmul_splitk_kernel(A_ptr, B_ptr, C_ptr, M, N, K, ...,
BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr,
BLOCK_K: tl.constexpr):
pid = tl.program_id(0) # 输出块 ID
split_id = tl.program_id(1) # K 分段 ID
acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)
for k_idx in range(k_block_start, k_block_end):
a = tl.load(A_ptr + ...)
b = tl.load(B_ptr + ...)
acc += tl.dot(a, b)
# 原子加: 多个 split 的 partial 直接累加到 C
tl.atomic_add(C_ptr + ..., acc, mask=...)
SPLIT_K 越大并行度越高,但 atomic_add 竞争也越多全局同步(如 tl.debug_barrier)会让所有核在同一点等待,等同于将 CUBE 计算和 VEC 归约完全串行化,性能极差。这里不像 AscendC 有 AIC/AIV 硬件并行操作实现,核内直接将 CUBE 结果写到 workspace,然后外部调用Reduce进行归约。另外,workspace的大小应该尽可能的装满,不要申请的过大。
@triton.jit
def matmul_splitk_to_ws_kernel(A_ptr, B_ptr, WS_ptr, M, N, K, ...,
BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr,
BLOCK_K: tl.constexpr):
pid = tl.program_id(0)
split_id = tl.program_id(1)
# ... K 分段计算 ...
acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)
for k_idx in range(k_block_start, k_block_end):
acc += tl.dot(tl.load(A_ptr + ...), tl.load(B_ptr + ...))
# 直接 store 到 workspace, 不做任何归约
tl.store(WS_ptr + split_id * stride_ws_s + ..., acc, mask=...)
# host 端
...
# 归约
C = torch.sum(workspace, dim=0)
tl.debug_barrier 全局同步将所有核阻塞,相当于串行化,性能最差torch.sum 实现,避免了核内 CUBE-VEC 串行问题,实测比全局同步方案快 1 倍以上针对 K 远大于 M/N 的矩阵乘法场景(如 M=N=256, K=131072),三个优化可组合使用:
tl.atomic_add 累加。torch.sum 外部归约,避免核内全局同步的串行化问题。比 debug_barrier 方案快 1 倍以上