CUDA线程模型



线程格:

gridDim.x 个线程块组成

线程块:

blockDim.x 个线程组成

下面线程格就是由 4 个线程块组成,其中每个线程块有4个线程。


定位某个线程的方法:

threadIdx.x 表示该线程于所在线程块的索引

blockIdx.x 表示线程块于线程格的索引

根据 blockIdx.x 找到线程块,再根据 threadIdx.x 找到对应的线程。

----------------------------------------------------------------------------------------------------------------------

二维形式的线程格和二维形式的线程块

线程格:

gridDim.x*gridDim.y 个线程块组成

线程块:

blockDim.x*blockDim.y 个线程组成


每个小矩形表示线程块,小矩形下面的圈表示线程。

定位某个线程的方法:

根据线程块的索引( blockIdx.xblockIdx.y )找到线程块,就是上图每个小矩形的左上角的坐标。

然后根据线程的索引( threadIdx.xthreadIdx.y )找到线程。

代码表示举例:

一维 形式:

kernel<<<N,1>>>( );

为该函数启用 N 个线程块,每个线程块启用 1 个线程。

kernel<<<1,N>>>( );

为该函数启用 1 个线程块,每个线程块启用 N 个线程。

二维形式:

dim3 grid(DIM,DIM);

kernel<<<grid,1>>>();

为该函数启用 DIM*DIM 个线程块,每个线程块启用一个线程。

dim3 blocks(DIM/16,DIM/16);

dim3 threads(16,16);

kernel<<<blocks,threads>>>( );

为该函数启用 blocks 个线程块, threads 个线程。

内存共享和同步 :

所谓的共享内存,是指同一线程块中,里面线程共享。

线程同步(通过 syncthreads 实现)也是。块与块之间不影响。

当某些线程需要执行一条指令,而其他线程不需要执行时,这种情况就成为线程发散。

cuda 架构规定,除非线程块中的每个线程都执行了 syncthreads(), 否则没有任何线程

能执行 syncthreads 之后的指令。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值