PMPP Chapter 03: Multidimensional grids and data
多维 grid & block
- gridDim
- gridDim.x 范围:[1, 2^{31} -1]
- gridDim.y & gridDim.z 范围:[1, 2^{16} -1]
- blockDim
- 最多 1024 线程(blockDim.x blockDim.y blockDim.z <= 1024)
- blockIdx
- threadIdx
Example:
- 图中坐标规则是 (z, y, x) (最高维在前),与 C 语言中设置
dim3的 (x, y, z) 顺序相反。- 例:block (1, 0) 表示
blockIdx.y = 1, blockIdx.x = 0。 - 线程同理:thread (1, 0, 2) 表示
threadIdx.z = 1, threadIdx.y = 0, threadIdx.x = 2。
- 例:block (1, 0) 表示
- 本书后续约定:
- 多维数据维度按降序称呼:z 维 → y 维 → x 维。
- 例如:一幅在 y (列)方向有 n 个像素、x (行)方向有 m 个像素的图片,称为 n m 图片。
- 遵循 C 语言多维数组索引约定:P[y][x] 在文本和图中简写为 P_{y,x}。
- 注意:这种数据维度顺序与
gridDim/blockDim中 (x, y, z) 的顺序相反。在根据待处理的多维数组来定义线程网格维度时,尤其容易混淆。
- 多维数据维度按降序称呼:z 维 → y 维 → x 维。
- 示例配置:
- Grid:4 个 block,
gridDim = (2, 2)(x * y),无 z 维度。 - Block:每个 block 16 个线程,
blockDim = (4, 2, 2)(x y z)。 - 总线程数:4 = 64。
- Grid:4 个 block,
Mapping threads to multidimensional data
gridDim & blockDim 通常根据要处理的数据维度来定。以二维图像为例,使用 2D grid & 2D block:
- 图片 shape 为 (62, 76)
- 竖直(y)方向 62 (记做 n=62) 个像素
- 水平(x)方向 76 (记做 m=76)个像素
- blockDim: (16, 16)
- y 方向需要 (62 + 16 - 1)/16 = 4 个 blocks
- x 方向需要 (76 + 16 - 1)/16 = 5 个 blocks
- thread 负责的数据坐标计算
- 竖直(行)坐标:
blockIdx.y * blockDim.y + threadIdx.y - 水平(列)坐标:
blockIdx.x * blockDim.x + threadIdx.x - 例子:thread (0,0) of block (1,0) 处理的像素坐标计算
- \(\mathbf{Pin}_{\text{blockIdx.y}*\text{blockDim.y}+\text{threadIdx.y},\text{blockIdx.x}*\text{blockDim.x}+\text{threadIdx.x}} = \mathbf{Pin}_{1*16+0,0*16+0} = \mathbf{Pin}_{16,0}\)
- 竖直(行)坐标:
- 根据 y/x 方向像素数量 n/m 计算 gridDim:
1 | |
- 边界检查
1 | |
colorToGrayscaleConversion kernel
完整代码
1 | |
扩展到 3D 数据/block/grid,索引计算类似 2D:
1 | |
Image blur: a more complex kernel
图像模糊:输出像素由输入像素周围的若干个像素均值组成。
kernel 代码:
1 | |
- Blur Kernel 要点:
- 每个线程负责一个输出像素
out[row * width + col]。 - 遍历
(2 * BLUR_SIZE + 1)^2的邻域窗口。 - 边界检查必须同时包括
>= 0和< width/height,否则会越界访问。 pixels统计有效邻居数量,保证边缘像素只对有效邻居求平均。
- 每个线程负责一个输出像素
Matrix multiplication
每个线程计算一个输出结果版本 kernel
1 | |
- 同一线程的内存访问模式(M/N 都是 row-major)
- 对 M 访问同一行多个列,连续访问
- 对 N 跨行访问同一列,不连续
PMPP Chapter 03: Multidimensional grids and data
https://arcsin2.cloud/posts/2026/09/3085498718/