作为标题,如果我们有一个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]
最佳答案
是的,那是正确的顺序;线程在一个块中的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
是块内的经线,laneID
是块内的线程号。请注意,线程不一定在块内以与此顺序有关的任何可预测顺序执行。执行模型保证了同一线程中的线程是“锁步”执行的,但是您只能从块中的线程编号中推断出更多信息。
关于cuda - Cuda,3D块中的执行线程顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11505117/