1. GPU计算架构深度解析
现代GPU早已超越传统图形处理的范畴,成为通用计算的利器。NVIDIA的CUDA架构采用SIMT(单指令多线程)执行模型,每个流式多处理器(SM)包含数十个CUDA核心,通过warp调度器同时管理32个线程的执行。这种设计使得GPU特别适合处理高度并行的计算任务,比如矩阵运算、图像处理等数据密集型工作负载。
在硬件层面,以Ampere架构为例,每个SM包含:
- 64个FP32 CUDA核心
- 4个第三代Tensor Core
- 128KB L1缓存/共享内存
- 4个纹理单元
这种结构决定了编程模型的特点:需要将计算任务分解为大量可以并行执行的线程块(block),每个block包含多个线程(thread),通过grid-block-thread三级结构组织计算任务。
关键提示:GPU的并行效率高度依赖于内存访问模式。不连续的全局内存访问会导致严重的性能下降,应当尽量使用共享内存和寄存器。
1.1 CUDA编程模型精要
CUDA C扩展了标准C语言,引入了几个关键概念:
__global__修饰的函数(核函数)在设备端执行<<<grid, block>>>语法指定执行配置- 内置变量如threadIdx、blockIdx等用于线程定位
一个典型的向量加法核函数如下:
c复制__global__ void vecAdd(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];
}
调用时通常这样配置:
c复制int threadsPerBlock = 256;
int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
vecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, n);
1.2 内存层次优化策略
GPU包含复杂的内存层次:
- 寄存器:最快,每个线程私有
- 共享内存:block内共享,延迟低
- 常量内存
