文章目录
线程层次:流、 格、块、线程

函数并行:一个核函数由多个线程并行执行,每个线程执行相同工作,并且有唯一线程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
文章目录