cuda多维线程的实例

1、注意:在多维中的变化时与平常的不一样,如下图所示,横向变换x,纵向变换y

2、cuda内置变量:

        1、thread(线程):

               一个线程可作为一个运算单元,多个thread可组成一个block(块).
        threadIdx.x:block中当前thread在x方向上的ID.
        threadIdx.y:block中当前thread在y方向上的ID.

        2、block(块):

                一个block中可包含多个thread,多个block可组成一个grid(网格).
                       blockIdx.x:grid中当前block在x方向上的ID.
                       blockIdx.y:grid中当前block在y方向上的ID.
                       blockDim.x:当前block中x方向上的thread数量.
                       blockDim.y:当前block中y方向上的thread数量.

        3、grid(网格):

                一个grid中可包含多个block.
         gridDim.x:当前grid中在x方向上的block数量.
       gridDim.y:当前grid中在y方向上的block数量.

3、网格与线程块大小的限制

        gridDim.x最大值--------2^31 - 1

        gridDim.y最大值--------2^16 - 1

        gridDim.z最大值--------2^16 - 1

        blockDim.x最大值----------1024

        blockDim.y最大值-----------1024

        blockDim.z最大值-----------64

        注意:线程块总的大小最大为1024!

4、二维网格、二维线程块

//二维网格、二维线程块
int tid = threadidx.y * blockDim.x + threadidx.x;
int bid =blockidx.y * gridDim.x + blockidx.x;
int id = blockId * (blockDim.x * blockDim.y) + tid;

5、三维网格、三维线程块:

//三维线程块
int tid = threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
int bid = blockIdx.z * gridDim.x * gridDim.y + blocklIdx.y * gridDim.x + blockIdx.x;
int id = bid * (blockDim.x * blockDim.y * blockDim.z) + tid;

6、其他多种组合

//一维网格、一维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x + threadIdx.x;

//二维网格、一维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = bid * blockDim.x + threadIdx.x;

//一维网格、二维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;

//二维网格、二维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = bid * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;

//一维网格、三维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y * blockDim.z
            + threadIdx.z * blockDim.y * blockDim.x
            + threadIdx.y * blockDim.x + threadIdx.x;

//二维网格、三维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y * blockDim.z
            + threadIdx.z * blockDim.y * blockDim.x
            + threadIdx.y * blockDim.x + threadIdx.x;

7 、定义多维网格和线程块(c++构造函数语法):

dim3 grid_size(Gx, Gy, Gz);        //多维网格定义
dim3 block_size(Bx, By, Bz);       //多维线程块定义 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值