02 Tiled GEMM:高性能矩阵乘法进阶
本系列专注于从零构建并剖析高性能 GPU 矩阵乘法(GEMM)算子,以大模型(LLM)核心的 QKV 融合投影线性层(
文档呈现阶梯式递进设计:从最基础的共享内存分块开始,逐步演进至线程级寄存器细粒度切块(Thread Tiling),最终达到工业级向量化访存(float4)与 Bank Conflict 优化的全融合实现。
优化演进路线
1. 基础分块:共享内存协同搬运
- 核心思想:利用 Shared Memory,将大矩阵切分为适合 Block 尺寸的子矩阵 Tile
- 解决痛点:避免单线程反复直读高延迟全局显存,在 Block 内初步复用数据
- 复杂度:★☆☆☆☆
- 阅读:Step 1 · 共享内存分块
- 源码:
matmul_tiled.cu
2. 细粒度切块:线程级平铺与寄存器复用
- 核心思想:每个线程用私有寄存器计算一个
输出小矩阵 - 技术突破:将“行乘列点积”重构为外积累加,大幅提升计算访存比
- 复杂度:★★★☆☆
- 先读专题:外积形式
- 阅读:Step 2 · 线程级平铺
- 源码:
matmul_thread_tile.cu
3. 硬件极致:128-bit 向量化与 QKV 投影融合
- 核心思想:对接 GPT 类模型全连接投影层,支持
且权重无需物理转置 - 技术突破:
- 128-bit 向量化访存:全局/共享内存全面采用
float4 - 2D 几何重组与对齐:保证合并访存,避免模/除等高延迟指令
- Bank Conflict 错峰:
si_start相位偏移打散 Warp 内访问 - 算子融合:寄存器初始化时原地融合 Bias
- 128-bit 向量化访存:全局/共享内存全面采用
- 复杂度:★★★★★
- 先读专题:Bank Conflict
- 阅读:Step 3 · 向量化与 QKV 融合
- 源码:
matmul_vectorized_qkv.cu
核心专题
在阅读进阶代码前,建议先掌握:
- 外积与点积 — 为什么寄存器级外积展开能实现更高缓存复用比
- 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