TileLang Kernel Library

TileKernels

基于 TileLang 的高性能 GPU 算子库,通过分块(Tiling)优化技术实现极致的内存访问效率与计算并行度

0
核心算子
0
cuBLAS 性能%
0
支持 GPU 架构
0
后端目标

分块(Tiling)优化原理

通过将大矩阵分解为适合共享内存的小块,最大化数据复用

矩阵 A (M × K)

全局内存
尺寸: 1024 × 1024 未分块

矩阵 B (K × N)

全局内存
尺寸: 1024 × 1024 未分块
分块大小:

共享内存 (Shared Memory)

带宽: ~15 TB/s
全局内存访问次数 2,097,152
共享内存访问次数 0
计算吞吐量 12.5%

TileLang 执行流水线

双缓冲(Double Buffering)隐藏内存延迟

①

全局内存加载

GMEM → SMEM

②

数据同步

__syncthreads()

③

矩阵乘法

mma.sync.aligned

④

累加更新

C += A × B

+=
⑤

结果写回

SMEM → GMEM

双缓冲流水线时序

Buffer 0
Load
Compute
Load
Compute
Buffer 1
Idle
Load
Compute
Load

TileLang 代码示例

声明式算子定义,自动代码生成

matmul_tile.py
import tilelang as tl
from tilelang import profiler

@profiler.annotate
def matmul(M, N, K, block_M=128, block_N=128, block_K=32):
    """
    高性能矩阵乘法算子
    使用双缓冲和异步拷贝隐藏内存延迟
    """
    # 定义布局
    A = tl.Tensor([M, K], "float16")
    B = tl.Tensor([K, N], "float16")
    C = tl.Tensor([M, N], "float32")
    
    # 分块配置
    with tl.Kernel(
        tiles=[(M + block_M - 1) // block_M, 
               (N + block_N - 1) // block_N],
        threads=256
    ) as (bx, by):
        # 分配共享内存
        A_shared = tl.SharedBuffer([block_M, block_K], "float16")
        B_shared = tl.SharedBuffer([block_K, block_N], "float16")
        
        # 寄存器累加器
        acc = tl.Accumulator([block_M, block_N], "float32")
        acc.clear()
        
        # 双缓冲指针
        buf_idx = 0
        
        for k in tl.range(0, K, block_K):
            # 异步加载 A 块到共享内存
            tl.copy(A[bx * block_M:(bx+1)*block_M, 
                       k:k+block_K], 
                    A_shared, 
                    async_copy=True)
            
            # 异步加载 B 块到共享内存
            tl.copy(B[k:k+block_K, 
                       by * block_N:(by+1)*block_N], 
                    B_shared, 
                    async_copy=True)
            
            # 等待拷贝完成
            tl.sync()
            
            # 矩阵乘累加 (使用 Tensor Core)
            tl.mma(A_shared, B_shared, acc)
        
        # 写回全局内存
        tl.copy(acc, C[bx * block_M:(bx+1)*block_M,
                        by * block_N:(by+1)*block_N])

# 编译并测试
kernel = tl.compile(matmul(4096, 4096, 4096))
C = kernel(A, B)

# 性能分析结果
# > Achieved 95.2% of cuBLAS peak performance
# > Memory bandwidth: 1.8 TB/s
# > Compute utilization: 92.5%

算子性能对比 (A100, FP16)

cuBLAS (Baseline) 312 TFLOPS
TileKernels MatMul 298 TFLOPS
PyTorch Inductor 245 TFLOPS
Triton 287 TFLOPS

生成的 CUDA 代码特性

Tensor Core MMA
wmma.mma.sync.aligned.m16n8k16
异步数据拷贝
cp.async.ca.shared.global
双缓冲流水线
自动隐藏 95% 内存延迟
自动边界检查
predicated loads, zero padding

支持的算子库

覆盖 Transformer 核心计算模式

×

MatMul

通用矩阵乘法

FP16 BF16 INT8
∑

Softmax

在线 softmax

Stable Fused
⚡

FlashAttention

内存高效注意力

V1 V2
N

LayerNorm

层归一化

RMS Fused
G

GeLU / SiLU

激活函数

Approx Exact
R

RoPE

旋转位置编码

Fused Neox

多后端代码生成

同一套 TileLang 代码,多目标平台部署

CUDA

NVIDIA GPU

SM70 (V100)
SM80 (A100)
SM90 (H100)

ROCm

AMD GPU

MI100
MI200
MI300X

OpenCL / SYCL

跨平台

Intel GPU
Mobile GPU
FPGA (实验性)