Skip to content

02 Tiled GEMM:高性能矩阵乘法进阶 ​

本系列专注于从零构建并剖析高性能 GPU 矩阵乘法(GEMM)算子,以大模型(LLM)核心的 QKV 融合投影线性层(Y=XWT+b)为最终落地目标。

文档呈现阶梯式递进设计:从最基础的共享内存分块开始,逐步演进至线程级寄存器细粒度切块(Thread Tiling),最终达到工业级向量化访存(float4)与 Bank Conflict 优化的全融合实现。

优化演进路线 ​

1. 基础分块:共享内存协同搬运 ​

  • 核心思想:利用 Shared Memory,将大矩阵切分为适合 Block 尺寸的子矩阵 Tile
  • 解决痛点:避免单线程反复直读高延迟全局显存,在 Block 内初步复用数据
  • 复杂度:★☆☆☆☆
  • 阅读:Step 1 · 共享内存分块
  • 源码:matmul_tiled.cu

2. 细粒度切块:线程级平铺与寄存器复用 ​

3. 硬件极致:128-bit 向量化与 QKV 投影融合 ​

  • 核心思想:对接 GPT 类模型全连接投影层,支持 Y=XWT+b 且权重无需物理转置
  • 技术突破:
    • 128-bit 向量化访存:全局/共享内存全面采用 float4
    • 2D 几何重组与对齐:保证合并访存,避免模/除等高延迟指令
    • Bank Conflict 错峰:si_start 相位偏移打散 Warp 内访问
    • 算子融合:寄存器初始化时原地融合 Bias
  • 复杂度:★★★★★
  • 先读专题:Bank Conflict
  • 阅读:Step 3 · 向量化与 QKV 融合
  • 源码:matmul_vectorized_qkv.cu

核心专题 ​

在阅读进阶代码前,建议先掌握:

  1. 外积与点积 — 为什么寄存器级外积展开能实现更高缓存复用比
  2. Bank Conflict — 32 个 Bank 的映射规律,以及 128-bit 访存下的冲突规避

快速编译与运行 ​

bash
cd docs/02_matmul_tiled

# Step 1
nvcc -O3 -arch=native matmul_tiled.cu -o matmul_tiled
./matmul_tiled

# Step 2
nvcc -O3 -arch=native matmul_thread_tile.cu -o matmul_thread_tile
./matmul_thread_tile

# Step 3
nvcc -O3 -arch=native matmul_vectorized_qkv.cu -o matmul_vectorized_qkv
./matmul_vectorized_qkv

基于 tiny-attn 整理的技术博客