dim3
是 CUDA 编程中用于定义线程块(Block)和网格(Grid)维度的三维向量结构体,本质是包含三个无符号整数成员(x
、y
、z
)的轻量级容器。以下是其核心特性与用法详解:
struct dim3 {
unsigned int x; // 第一维度(宽度)
unsigned int y; // 第二维度(高度)
unsigned int z; // 第三维度(深度)
};
1
。
dim3 grid(64)
→ 等价于 dim3(64, 1, 1)
。在启动核函数(Kernel)时,dim3
用于指定线程组织方式:
kernel_func<<>>(args); // grid 和 block 均为 dim3 类型
grid
:定义网格(Grid)的维度,表示线程块(Block)的数量。block
:定义线程块(Block)的维度,表示每个线程块中的线程数(Thread)。场景 | 定义方式 | 实际结构 | 总线程数 |
---|---|---|---|
一维任务 | dim3 block(256); |
(256, 1, 1) |
256 线程/块 |
dim3 grid(1024); |
(1024, 1, 1) |
1024 块 → 26.2万线程 | |
二维图像处理 | dim3 block(16, 16); |
(16, 16, 1) |
256 线程/块 |
dim3 grid(64, 64); |
(64, 64, 1) |
4096 块 → 104.8万线程 | |
三维体渲染 | dim3 block(8, 8, 8); |
(8, 8, 8) |
512 线程/块 |
dim3 grid(4, 4, 4); |
(4, 4, 4) |
64 块 → 3.2万线程 |
CUDA 对线程组织的维度有严格约束:
x
、y
维度 ≤ 1024z
维度 ≤ 6432x32=1024
合法,33x33=1089
非法)。x
维度最多 2^{32}-1
个线程(非块数!)y
、z
维度最多 65535 个线程块。在核函数中,通过 dim3
定义的维度可计算全局线程索引:
__global__ void kernel(float* data) {
// 计算全局线程索引(二维示例)
int idx_x = blockIdx.x * blockDim.x + threadIdx.x;
int idx_y = blockIdx.y * blockDim.y + threadIdx.y;
int global_idx = idx_y * gridDim.x * blockDim.x + idx_x;
data[global_idx] = ...; // 并行操作
}
blockDim
:当前线程块的维度(dim3
类型)。gridDim
:网格的维度(dim3
类型)。grid
/block
维度对齐,避免越界(如使用 (width + block.x - 1) / block.x
计算网格宽度)。block(1024,1,1)
可能不如 block(32,32,1)
高效)。dim3
是 CUDA 并行编程的线程组织基石,通过三维向量灵活定义网格与线程块结构,将计算任务映射到 GPU 的数千个核心上。合理设计 grid
和 block
的维度(如匹配数据空间、规避硬件限制),是优化 CUDA 程序性能的关键一步。