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

时间:2012-07-16 13:14:29

标签: 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]

1 个答案:

答案 0 :(得分: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;

此处threadID是块中的线程编号,warpID是块内的warp,laneID是warp中的线程编号。

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