Cuda,3d块中的执行线程顺序

ele*_*ect 6 cuda

作为标题,我想知道正确的执行顺序,以防我们有一个3d块

我想要记住,我已经读过一些关于它的东西了,但是不久之前,我不记得在哪里,但它是由一个看起来不那么可靠的人来的.

无论如何,我想对此有一些确认.

它是如下(在经线中划分)?

[0,0,0] ... [blockDim.x,0,0] - [0,1,0] ... [blockDim.x,1,0] - (...) - [0,blockDim .y,0] ... [blockDim.x,blockDim.y,0] - [0,0,1] ... [blockDim.x,0,1] - (...) - [0,blockDim .y,1] ... [blockDim.x,blockDim.y,1] - (...) - [blockDim.x,blockDim.y,blockDim.z]

tal*_*ies 7

是的,这是正确的顺序; 线程的排序首先是x维度变化,然后是y,然后是块内的z(相当于列主要顺序).计算可表示为

int threadID = threadIdx.x + 
               blockDim.x * threadIdx.y + 
               (blockDim.x * blockDim.y) * threadIdx.z;

int warpID = threadID / warpSize;
int laneID = threadID % warpsize;
Run Code Online (Sandbox Code Playgroud)

threadID是块内的线程号,warpID是块laneID内的warp ,是warp中的线程号.

请注意,线程不一定以与块内此排序相关的任何可预测顺序执行.执行模型保证同一warp中的线程执行"lock-step",但是你不能推断块中的线程编号.