博主自己学习,仅此记录,并方便学过c、已经配置好cuda的朋友交流学习。(我机子cuda9.0)
ok,记录一下gridIdx, blockIdx 和 threadIdx的区别和联系,因为使用add<<
这里,我们先讲一维情况,再说一下二维的情况
int tid = threadIdx.x + blockIdx.x*blockDim.x;
简单理解一下:
线程和线程块都是一维排列的,因为都是一维排列,所以都是.x的继承。具体用下图做个说明,blockIdx.x索引从线程块0~N-1,threadIdx.x从线程0到线程N-1,blockDim.x就是block在一维上的维度(图中是4)
借由《GPU高性能编程CUDA实战中文版》中一个图,分析二维情况 ,首先明确二维索引情况意义,为了每一个线程对应一个像素的运算,我们必须要知道这样一个映射函数:f(像素坐标,某一线程),这有点类似数据结构二维索引的感觉,像素坐标很简单(x, y);线程如下索引,这个x,y对应图像的x, y。
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
offset 会这样排列
0
1
2
3
4
5
6
7
8
下面两个图方便理解线程,线程块,网格的关系。
下面的图是另一个博主那找的(该博客有些错误),方便理解 https://blog.csdn.net/qq_34488063/article/details/52162454
参考:《cuda高性能并行计算》
nvidia:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#introduction
手机扫一扫
移动阅读更方便
你可能感兴趣的文章