
从手写 CUDA Kernel 到工业级高性能库,理解 GPU 矩阵计算优化的差距。
矩阵乘法(GEMM, General Matrix Multiplication)是 GPU 计算中最重要的算子之一。
在深度学习中:
都大量依赖矩阵乘法。
本节通过实现并比较:
理解 GPU 矩阵计算的优化过程。

在这里插入图片描述
最基础实现:
for row
for col
sum = 0
for k
C[row][col]+=A[row][k]*B[k][col]
特点:
GPU 中:
一个线程计算 C 中一个元素
结构:
Thread(0,0) → C[0][0]
Thread(0,1) → C[0][1]
Thread(1,0) → C[1][0]
优点:
问题:
每个线程都会重复读取:
Global Memory
↓
A
B
大量访存浪费。
优化思路:
利用 Shared Memory 保存矩阵块。
计算过程:
Global Memory
↓
Tile加载
↓
Shared Memory
↓
多个线程重复使用
↓
计算结果
优势:
cuBLAS 是 NVIDIA 官方高性能线性代数库。
调用:
cublasSgemm()
内部包含大量优化:
因此性能远高于普通 CUDA Kernel。
GPU:
Tesla T4
测试:
矩阵:
512×512
1024×1024
2048×2048
数据类型:
FP32
重复次数:
512/1024: 10次
2048: 3次
计时范围:
仅计算时间
不包含:
cudaMalloc
cudaMemcpy
初始化
矩阵规模 | CPU(ms) | CUDA Naive(ms) | Shared(ms) | cuBLAS(ms) |
|---|---|---|---|---|
512×512 | 179.0797 | 0.8715 | 0.5647 | 0.1090 |
1024×1024 | 3556.6381 | 9.1899 | 5.8068 | 0.8410 |
2048×2048 | 65885.0027 | 61.3065 | 25.4595 | 2.6535 |
可以看到:
随着矩阵规模增加:
CPU差距快速扩大
cuBLAS优势越来越明显
矩阵规模 | CPU | Naive | Shared | cuBLAS |
|---|---|---|---|---|
512×512 | 1.50 | 308.02 | 475.33 | 2462.46 |
1024×1024 | 0.60 | 233.68 | 369.82 | 2553.44 |
2048×2048 | 0.26 | 280.23 | 674.79 | 6474.30 |
性能趋势:
CPU < CUDA Naive < Shared Memory < cuBLAS

在这里插入图片描述
Naive:
Thread
↓
Global Memory
↓
读取A/B
↓
计算
Shared:
Global Memory
↓
一次加载Tile
↓
Shared Memory缓存
↓
多个线程复用
减少了大量:
Global Memory访问次数
因此:
Shared > Naive
实验:
2048×2048:
Naive:
61.3 ms
Shared:
25.5 ms
提升:
2.4倍
Shared Memory Kernel:
主要优化:
Global Memory
↓
Shared Memory
↓
计算
而 cuBLAS:
Global Memory
↓
多级Tile
↓
Shared Memory
↓
Register
↓
Warp级计算
↓
Tensor Core/专用硬件
它进一步优化:
普通 Kernel:
一个线程计算一个C元素
高性能 GEMM:
一个线程计算多个C元素
更多计算放在 Register 中。
普通:
Block Tile
cuBLAS:
Block Tile
↓
Warp Tile
↓
Thread Tile
↓
Register Tile
充分利用 GPU 层次结构。
包括:
本实验得到:

在这里插入图片描述
一句话总结:
手写 CUDA Kernel 帮助理解 GPU 原理,而 cuBLAS 代表 NVIDIA 工程团队多年优化后的极限性能。实际 AI 推理和训练系统中,矩阵计算通常直接依赖 cuBLAS、cuDNN 或 CUTLASS。