CUDA 线程索引公式

本文详细介绍了CUDA编程中线程的组织结构,包括线程、线程块和线程格,并提供了线程索引计算的分析,涵盖了从三维线程块到一维、二维kernel调用的各种情况。通过理解这些概念,开发者能够更好地理解和控制GPU并行计算的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、线程(thread)、线程块(block)、线程格(grid)

在这里插入图片描述

二、threadIdx、blockIdx、blockDim 和 gridDim 索引分析

1、先找到当前线程位于线程格中的哪一个线程块blockId

blockId = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;

2、找到当前线程位于线程块中的哪一个线程threadId

threadId = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;

3、计算一个线程块中一共有多少个线程M

M = blockDim.x*blockDim.y*blockDim.z

4、求得当前的线程序列号idx

idx = threadId + M*blockId;

三、全三维情况一般公式:

int blockId = blockIdx.z * (gridDim.x*gridDim.y)
+ blockIdx.y * gridDim.x
+ blockIdx.x;

int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)
+ threadIdx.z * (blockDim.x * blockDim.y)
+ threadIdx.y * blockDim.x
+ threadIdx.x;

四、不同维度的 kernel 调用

kernel调用:
kernel<<<numBlock,threadPerBlock>>>(a,b)

这是调用kernel时的参数,尖括号<<<>>>中第一个参数代表启动的线程块的数量,第二个参数代表每个线程块中线程的数量.

总的线程号:
设线程号为tid,以下讨论几种调用情况下的tid的值,这里只讨论一维/二维的情况

一维:
1.kernel<<<1,N>>>()
block和thread都是一维的,启动一个block,里面有N个thread,1维的。
tid=threadIdx.x

2.kernel<<<N,1>>>()
启动N个一维的block,每个block里面1个thread
tid=blockIdx.x

3.kernel<<<M,N>>>()
启动M个一维的block,每个block里面N个一维的thread
tid=threadIdx.x+blockIdx.x * blockDim.x

二维:
4.dim grid(m,n)
kernel<<<grid,1>>>()
启动一个二维的m*n个block,每个block里面一个thread
tid=blockIdx.x+blockIdx.y * gridDimx.x

5.dim grid(m,n)
kernel<<<grid,N>>>()
启动一个二维的m*n大小的block,每个block里面N个thread
tid=

6.dim block(m,n)
kernel<<<1,block>>>()

7.dim block(m,n)
kernel<<<N,block>>>()

8.dim grid(m,n)
dim block(i,j)
kernel<<<grid,block>>>()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_潜行者

赐予我力量吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值