Bootstrap

cuda的线程模型

          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之后的指令。





;