CUDA中网格,线程块,线程的组织关系和线程索引的计算公式

明确对应关系

线程索引计算参数错综复杂,对参数有一个明确的理解之后会达到事半功倍的效果
在这里插入图片描述
如图所示,gridDim为(4,3,2)那说明其组织形式是4x3x2的一个长方体,包含了4x3x2=24个block,每个block有自己的坐标,也就是block.x, block.y, block.z
同理,在每个block内也有自己的组织形式,这里blockDim为(4,3,2)同样说明了其组织形式是4x3x2的一个长方体,包含了4x3x2=24个thread,也就是thread.x, thread.y, thread.z

这个图片很好地指出了他们之间的对应关系
在这里插入图片描述
这里gridDim.z=1说明了z为1,也就是说明grid的组织形式是二维(三维的情况太难画了orz…),而blockDim是三维在图中也有很好的表现。


计算公式

共计九种情况,因为grid可能有一维、二维、三维组织形式,同理block也有一维、二维、三维组织形式
计算思路:先计算经过多少block,在进入到线程所在的block去计算
1.grid划分为一维,block划分为一维:
如图,第一步:经过多少block: blockIdx.x=2说明在该block之前经过了2个block,每个block有4个thread,所以2x4
第二步:在block内部,threadIdx.x=2,则经过两个thread,所以还要加2
在这里插入图片描述

2.grid划分为一维,block划分为二维:
如图,第一步:经过多少block: blockIdx.x=2说明在该block之前经过了2个block,每个block有4x2个thread,所以2x8=16
第二步:在block内部,threadIdx.y=1,则经过1x4个thread,然后threadIdx.x=2,再加2
在这里插入图片描述

3.grid划分为一维,block划分为三维:
如图,第一步:经过多少block: blockIdx.x=2说明在该block之前经过了2个block,每个block有4x2x2个thread,所以2x16=32
第二步:在block内部,threadIdx.z=1,则说明第一层有1x2x4个thread,然后threadIdx.y=1,则加4,threadIdx.z=2,再加2

在这里插入图片描述

4.grid划分为二维,block划分为三维:
如图,第一步:经过多少block: blockIdx.y=0, blockIdx.x=2说明在该block之前经过了2个block,每个block有4x2x2个thread,所以2x16=32
第二步:在block内部,threadIdx.z=1,则说明第一层有1x2x4个thread,然后threadIdx.y=1,则加4,threadIdx.z=2,再加2,所以结果没变,还是46

在这里插入图片描述
grid是三维的组织形式也是一样的,这里就由读者自己去完成了。
(水平有限,如果文章有问题欢迎指出,有不同观点也支持理性讨论)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值