作为标题,我想知道正确的执行顺序,以防我们有一个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]
答案 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”,但你不能推断出块中线程编号的那些。