设有
dim3 blocks(bx,by);
dim3 threads(tx,ty);
ker<<<blocks,threads>>>()
则每个线程块有tx行ty列的线程,x=threadIdx.x,y=threadIdx.y代表第x行第y列的那个线程;
整个网格有bx行by列的线程块,blockIdx.x,blockIdx.y代表第x行第y列的那个线程块。
行数和列数都可以从0开始,所以threadIdx.x必然小于tx...因为每个线程块总共有tx行个线程,分别第0行,第1行,第2行...第tx-1行,最大就是第tx-1行。
线程的组织格式最好与我们的数据的组织格式能够吻合,或者一一对应,这有利于编程时的逻辑思考。
当然:以上只是一种看法,线程组织在网格里实际上是一维组织的,弄成多维的只是为了思考方便,所以把x,y看成坐标也是可以的。这里我们看成第x行第y列是为了和数组的组织统一起来,因为数组a[x][y],中的x和y也是第x行第y列的意思。所以只要我们思维清晰不要混乱就行,按自己的编程习惯认定一种。