我们知道在cuda中设置global函数的调用方式的时候,可以传进多维参数。形如
dim3 dimen1(4, 4); dim3 dimen2(3, 3); addKernel << <dimen1, dimen2 >> >(devA, devB, devC);
这种时候我们如何知道一个线程所处的位置以及这个线程属于第几个线程呢?
可以看出图中便是我们分配线程的布局。
对于处于某个线程格(block)中的某个线程(thread),我们已知的量有
该线程所在线程格的横纵坐标===>blockIdx.x,blockIdx.y
该线程在当前线程格中所处的横纵坐标===>threadIdx.x,threadIdx.y
每个线程格x,y方向的最大值blockDim.x,blockDim.y
每行/列线程格个数gridDim.x,gridDim.y
以上两条分别对应图中上下两个方格
那么就可以知道,这个线程所在的x,y坐标为
x = threadIdx.x + blockIdx.x * blockDim.x
y = threadIdx.y + blockIdx.y * blockDim.y
则可以知道当前线程的标号为 offset = 当前行中所处的位置 + 行数 * 每行线程个数
offset = x + y * blockIdx.x * gridDim.x