CUDA编程之Grid、Block、Thread线程模型
一、线程模型:Grid、Block、Thread概念
1. 层级定义
-
Thread(线程)
CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间。 -
Block(线程块)
由多个线程组成(通常为32的倍数),是逻辑上的并行单元。同一Block内的线程可通过共享内存(Shared Memory)协作,并支持同步操作(如__syncthreads()
)。一个Block内的线程会被划分为多个Warp(32线程为一组,以SIMT方式执行)。 -
Grid(网格)
由多个Block构成,代表完整的核函数执行空间。Grid内的Block可分配到不同SM(流多处理器)上并行执行,但不同Block之间无法直接通信。
2. 维度与索引
-
维度定义
Grid和Block均支持一维、二维或三维结构。例如,处理图像时常用二维Block(如16x16线程) -
魔方图
二、索引计算
- 全局索引:通过
blockIdx
(Block在Grid中的位置)、threadIdx
(线程在Block中的位置)和blockDim
(Block维度)计算全局位置。例如:int global_x = blockIdx.x * blockDim.x + threadIdx.x; // 一维示例
-
// 二维示例(如图像处理) int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y;
blockIdx:线程块在对应 grid 中的编号。
threadIdx:线程在对应线程块中的编号。
两者都是uint3向量类型,包含 x, y, z 三个 uint 成员。gridDim:grid 的维度,即每一维的 block 数量。对应调用 kernel 时的 gridSize。
blockDim:block 的维度,即每一维的 thread 数量。对应调用 kernel 时的 blockSize。
两者都是dim3向量类型,包含 x, y, z 三个 uint 成员。例:
gridDim.x:当前 grid 中线程块的数量(一维)/