cuda的线程模型
2016-04-07 19:05
232 查看
cuda中所有的线程由一个线程格表示,线程格分为若干个线程块,每个线程块有若干个线程。还有,线程格和线程块都有一维形式和二维形式的表示。刚开始看代码觉得有点乱,
干脆自己整理一下,清晰自己的思路。
一维形式的线程格和一维形式的线程块
线程格:
由 gridDim.x 个线程块组成
线程块:
由 blockDim.x 个线程组成
下面线程格就是由 4 个线程块组成,其中每个线程块有 4 个线程。
定位某个线程的方法:
threadIdx.x 表示该线程于所在线程块的索引
blockIdx.x 表示线程块于线程格的索引
根据 blockIdx.x 找到线程块,再根据 threadIdx.x 找到对应的线程。
----------------------------------------------------------------------------------------------------------------------
二维形式的线程格和二维形式的线程块
线程格:
由 gridDim.x*gridDim.y 个线程块组成
线程块:
由 blockDim.x*blockDim.y 个线程组成
每个小矩形表示线程块,小矩形下面的圈表示线程。
定位某个线程的方法:
根据线程块的索引( blockIdx.x , blockIdx.y )找到线程块,就是上图每个小矩形的左上角的坐标。
然后根据线程的索引( threadIdx.x , threadIdx.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 之后的指令。
干脆自己整理一下,清晰自己的思路。
一维形式的线程格和一维形式的线程块
线程格:
由 gridDim.x 个线程块组成
线程块:
由 blockDim.x 个线程组成
下面线程格就是由 4 个线程块组成,其中每个线程块有 4 个线程。
定位某个线程的方法:
threadIdx.x 表示该线程于所在线程块的索引
blockIdx.x 表示线程块于线程格的索引
根据 blockIdx.x 找到线程块,再根据 threadIdx.x 找到对应的线程。
----------------------------------------------------------------------------------------------------------------------
二维形式的线程格和二维形式的线程块
线程格:
由 gridDim.x*gridDim.y 个线程块组成
线程块:
由 blockDim.x*blockDim.y 个线程组成
每个小矩形表示线程块,小矩形下面的圈表示线程。
定位某个线程的方法:
根据线程块的索引( blockIdx.x , blockIdx.y )找到线程块,就是上图每个小矩形的左上角的坐标。
然后根据线程的索引( threadIdx.x , threadIdx.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 之后的指令。
相关文章推荐
- RecyclerView利用LayoutManager查找控件的BUG
- bs4安装过程
- ReactNative学习十五-横竖布局及右上角圆点
- 奇妙华为3c手机, 出现安装未成功问题。
- O2O是机遇不是鸡肋,百度O2O的步伐不会停
- PyQt QString转成python stirng
- ANSI库续(时间函数)与文件操作初识
- Object-C中的内存管理 MRC、ARC以及Autoreleasepool的区别
- C++实现——排列组合
- js文件中直接alert()中文出来的是乱码
- 无序数组中最小的k个数
- 在iOS上实现变换
- iOS-多线程--(pthread/NSThread/GCD/NSOperation)--总结
- Android之监测手机网络状态的广播
- 理解$watch ,$apply 和 $digest --- 理解数据绑定过程
- JavaEE和JSP有什么区别
- 表达式计算器(逆波兰法)栈操作(C语言实现)
- uva11324 The Largest Clique --- 强连通+dp
- 以http形式启动uwsgi服务
- Linux查看网络即时网速