首先需要知道的是将高维坐标转换成一维坐标的公式:假如现有一个高维坐标(x,y,z),各个维度大小分别是Dx,Dy,Dz,则一维坐标的表示是:
id = z * Dx * Dy + y * Dx + x;
所以根据以上可知最终的线程ID为:
Id = blockId * blockSize + threadId;
- BlockId :当前 Block 在 grid 中的坐标(可能是1维到3维),这里转换成一维坐标。
- BlockSize :block 的大小,描述其中含有多少个 thread
- ThreadId :当前 thread 在 Block 中的坐标(同样从1维到3维),同样也转换成一维坐标。
当我们得知每个维度上的大小时,就可以利用这样的进制将三维坐标转换为1维坐标。
一般来说坐标(x, y, z)分别所在的维度大小是(Dx, Dy, Dz),一般会把 z 看成高纬度,接着是 y ,最后是 x。
即有:id = z * Dx * Dy + y * Dx + x。
我的理解:
一个立方体,坐标为(x, y, z),所在的维度大小是(Dx, Dy, Dz),从最高维看起,那就是z个Dx *Dy,y个Dx,x的话,就它自己。