显卡(Graphics Processing Unit,GPU)最初是作为图形渲染的专用处理器出现的。1999年NVIDIA GeForce 256首次提出GPU概念时,它的主要任务就是加速3D游戏中的三角形变换与光照计算。但现代GPU已经演变为高度并行的通用计算设备,在深度学习、科学计算等领域发挥着关键作用。
GPU与CPU的核心差异在于设计哲学。CPU是"全能型选手",擅长处理复杂逻辑和随机内存访问;而GPU则是"万人马拉松选手",专为大规模并行计算优化。以NVIDIA A100为例,它包含6912个CUDA核心,而服务器级CPU通常只有几十个核心。这种差异直接反映在架构设计上:
提示:理解GPU架构时,要始终把握"吞吐量优先于延迟"这一核心理念。GPU不追求单个线程的执行速度,而是通过并行处理海量线程来实现整体高性能。
以NVIDIA Ampere架构为例,每个流式多处理器(Streaming Multiprocessor,SM)包含:
SM的工作方式体现了GPU的SIMT(单指令多线程)执行模型。当一组32个线程(称为warp)被分配到SM时:
cpp复制// 典型GPU内核代码示例
__global__ void vectorAdd(float* A, float* B, float* C, int N) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < N) C[i] = A[i] + B[i]; // 所有活跃线程同步执行这一行
}
GPU内存系统是典型的带宽优化设计:
code复制寄存器 → 共享内存 → L2缓存 → HBM显存 → 系统内存
↑ ↑ ↑
线程私有 线程块共享 所有SM共享
关键参数对比:
| 内存类型 | 延迟(周期) | 带宽(GB/s) | 容量 |
|---|---|---|---|
| 寄存器 | 1 | 8000+ | 256KB/SM |
| 共享内存 | 20-30 | 1000+ | 128KB/SM |
| L2缓存 | 100-200 | 2000+ | 40MB(GA100) |
| HBM2显存 | 300+ | 1555 | 40GB(A100) |
注意:错误的内存访问模式会导致性能急剧下降。例如,全局内存访问应满足合并访问条件(同一warp的线程访问连续地址),否则会退化为多次内存事务。
GPU计算能力经历了三次飞跃:
Tensor Core的工作原理:
python复制# 矩阵乘加运算:D = A*B + C
# A,B,C,D都是4x4矩阵
# 每个Tensor Core时钟周期完成1个4x4x4矩阵运算
for i in range(4):
for j in range(4):
for k in range(4):
D[i][j] += A[i][k] * B[k][j]
CUDA将计算任务组织为网格(Grid)-块(Block)-线程(Thread)三级结构:
内存使用原则:
最大化并行度:
__launch_bounds__指定寄存器用量cpp复制__global__ __launch_bounds__(256, 4) void kernel(...)
内存访问优化:
指令级优化:
__expf()比expf()更快)| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| 低occupancy | 寄存器/共享内存使用过多 | 减少寄存器用量,调整块大小 |
| 低内存带宽利用率 | 非合并访问 | 重构数据布局,使用共享内存中转 |
| SM利用率低 | 内核启动开销大 | 增大任务规模,使用流并行 |
CDNA(计算优化)特点:
RDNA(图形优化)特点:
推荐配置:
关键考量:
典型应用:
特殊需求:
专业显卡(如NVIDIA RTX A6000)优势:
提示:游戏卡(如RTX 4090)虽然理论性能强,但在专业软件中可能被驱动程序限制性能。