1. CUDA执行模型基础概念
在GPU编程领域,理解CUDA的执行模型是写出高效并行代码的基础。CUDA采用分层执行模型,将计算任务分解为网格(Grid)、线程块(Block)和线程(Thread)三个层级。这种设计让开发者能够灵活地组织并行计算任务,充分发挥GPU的并行计算能力。
1.1 线程层级结构
CUDA的线程组织采用三层结构:
- Grid:最高层级,包含多个线程块
- Block:中间层级,包含多个线程
- Thread:最基础的执行单元
这种层级结构不是随意设计的,而是为了匹配GPU的硬件架构。现代GPU由多个流式多处理器(SM)组成,每个SM可以同时执行多个线程块。线程块内部的线程可以通过共享内存高效通信,而不同线程块之间则是相对独立的。
重要提示:一个线程块内的线程数量不是越多越好,通常建议设置为32的倍数(如128、256等),这与GPU的warp调度机制有关。
1.2 核函数(Kernel)基础
核函数是CUDA编程的核心概念,它是在GPU上执行的并行函数。定义核函数时需要使用__global__修饰符,表示这个函数可以从主机(CPU)调用,但在设备(GPU)上执行。
一个简单的核函数定义示例:
cpp复制__global__ void addVectors(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];
}
}
这个示例展示了向量加法的核函数实现,其中:
blockIdx.x表示当前线程块在网格中的索引blockDim.x表示线程块的维度(包含的线程数)threadIdx.x表示当前线程在线程块中的索引
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 编写第一个正确的CUDA核函数
2.1 核函数的基本结构
一个正确的CUDA核函数需要包含以下几个关键部分:
- 线程索引计算:确定当前线程处理的数据位置
- 边界检查:防止线程访问越界
- 计算逻辑:实际的并行计算部分
以矩阵乘法为例,一个基本的核函数实现如下:
cpp复制__global
