CUDA2-线性层次结构
更新日期:
文章目录
线程层次:流、 格、块、线程
函数并行:一个核函数由多个线程并行执行,每个线程执行相同工作,并且有唯一线程ID。
结构说明: (如右图)
a. 一个内核函数运行在一个线程格(Grid)上;
b. 一个线程格(Grid)由多个大小相同的线程块(Block)组成;
c. 而线程块(Block)则由多个线程(Thread)组成。
变量说明:kernel<<<Dg, Db, ns, s>>>();
a. Dg :指定grid的维度和大小
i. 类型: dim3; 最多二维: blockIdx.x blockIdx.y
ii. Dg.x * Dg.y == 启动的块数量
iii. 第一个blockIdx.x为0;
iv. 线程块(Block)的数量不超过 65535
b. Db :指定block的维度和大小
i. 类型: dim3; 最多三维: threadIdx.x threadIdx.y threadIdx.z
ii. Gb.x * Db.y * Db.z == 各块的线程数量
iii. 线程数不能超过设备属性中 maxThreadsPerBlock域的值
通常为 512
c. Ns:动态分配的共享存储区大小, 可选参数
d. S: 指定相关流, 可选参数
内置变量
gridDim 网格的维度, 即网格(Grid)中每一维的线程块(block)数量。
blockIdx 网格内的块索引
blockDim 块的维度,保存线程块(Block)中 每一维的线程(thread)数量。
threadIdx 块内的线程索引
索引转换: add<<<(N+127)/128,128>>>(dev_a,dev_b,dev_c)
<<<N,1>>>
int tid = blockIdx.x
<<<1,N>>>
int tid = threadIdx.x
<<<1,(N,M)>>>
Int tid = threadIdx.x + blockIdx.x * blockDim.x
<<<(gn,gm),(bn,bm)>>>
X = threadIdx.x + blockIdx.x * blockDim.x ;
Y = threadIdx.y + blockIdx.y* blockDim.y;
Offset = X + Y *blockDim.x * gridDim.x