
从 cuBLAS SGEMM 到 Tensor Core GEMM,探索现代 GPU 矩阵计算的核心优化路径。

前一节,我们比较了:
发现 cuBLAS 已经远超手写 CUDA Kernel。
但现代深度学习模型中的矩阵计算,还会进一步使用:
Tensor Core + Mixed Precision
例如:
大量采用 FP16/BF16 混合精度计算。
本节在 Tesla T4 上测试:
FP32 SGEMM
vs
FP16 Tensor Core GEMM
普通 CUDA Core:
一个线程
|
|
标量乘加
|
↓
a*b+c
Tensor Core:
Matrix A
|
|
Tensor Core
|
|
Matrix B ---------> Matrix C
一次完成矩阵块乘加
D = A × B + C
Tensor Core 针对矩阵计算进行了硬件优化:
GPU:
Tesla T4
Compute Capability:
7.5
测试:
项目 | 配置 |
|---|---|
输入类型 | FP16 |
累加类型 | FP32 |
输出类型 | FP32 |
计算库 | cuBLAS |
GPU | Tesla T4 |
矩阵规模 | 512~4096 |
计算流程:
FP32 Matrix A
+
FP32 Matrix B
↓
cuBLAS SGEMM
↓
FP32 Matrix C
流程:
FP32 数据
↓
转换 FP16
↓
Tensor Core
FP16 × FP16
↓
FP32 accumulate
↓
FP32 Output
关键代码:
cublasGemmEx(
handle,
...,
CUDA_R_16F,
...,
CUDA_R_16F,
...,
CUDA_R_32F,
...,
CUBLAS_COMPUTE_32F,
CUBLAS_GEMM_DEFAULT_TENSOR_OP
);
含义:
配置 | 作用 |
|---|---|
CUDA_R_16F | 输入 FP16 |
CUDA_R_32F | 输出 FP32 |
CUBLAS_COMPUTE_32F | FP32累加 |
Tensor_OP | 启用Tensor Core |
矩阵规模 | FP32(ms) | Tensor Core(ms) | 加速 |
|---|---|---|---|
512×512 | 0.0492 | 0.0299 | 1.64× |
1024×1024 | 0.2475 | 0.0946 | 2.62× |
2048×2048 | 1.4601 | 0.5835 | 2.50× |
4096×4096 | 16.2076 | 4.7007 | 3.45× |
可以看到:
随着矩阵规模增加:
Tensor Core 优势逐渐扩大
矩阵规模 | FP32 SGEMM | Mixed GEMM |
|---|---|---|
512 | 5457 GFLOPS | 8969 GFLOPS |
1024 | 8675 GFLOPS | 22694 GFLOPS |
2048 | 11766 GFLOPS | 29442 GFLOPS |
4096 | 8479 GFLOPS | 29237 GFLOPS |
性能变化:
4096矩阵:
FP32:
8.5 TFLOPS
Tensor Core:
29.2 TFLOPS
接近:
3.5倍提升
小矩阵:
计算量较少
Kernel启动
调度
缓存
占比较高
大矩阵:
更多矩阵Tile
↓
Tensor Core持续工作
↓
硬件利用率提高
因此:
N ↑
Tensor Core利用率 ↑
加速比 ↑
Matrix Size | FP32 SGEMM(ms) | Tensor Core GEMM(ms) | Speedup |
|---|---|---|---|
1024×1024 | 0.2636 | 0.1037 | 2.54× |
1023×1023 | 0.4504 | 0.1683 | 2.68× |
2048×2048 | 1.2328 | 0.4890 | 2.52× |
2047×2047 | 2.9654 | 1.1937 | 2.48× |
Matrix Size | FP32 SGEMM | Tensor Core GEMM |
|---|---|---|
1024 | 8147 GFLOPS | 20711 GFLOPS |
1023 | 4754 GFLOPS | 12723 GFLOPS |
2048 | 13935 GFLOPS | 35132 GFLOPS |
2047 | 5784 GFLOPS | 14371 GFLOPS |
非规则尺寸需要:
padding
边界处理
GPU 高性能计算非常依赖规则的数据布局
很多人认为:
FP16 = 精度差
实际上:
Tensor Core 混合精度:
输入:
FP16
计算:
FP32 accumulate
输出:
FP32
结构:
FP16
|
|
Tensor Core
|
|
FP32 Accumulate
|
|
FP32
兼顾:
速度
+
精度
本次 Tesla T4 实验得到:
CUDA Kernel 可以让我们理解 GPU 工作方式,而 Tensor Core 代表现代 GPU 矩阵计算的极致性能。 对于深度学习推理和训练,合理使用 FP16/BF16 混合精度,是获得高吞吐的重要手段。