作为标题,如果我们有一个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/

10-10 06:13