7

作为标题,我想知道正确的执行顺序,以防我们有 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]

4

1 回答 1

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内的经线,是经线内laneID的线程号。

请注意,线程不一定以与块内此顺序相关的任何可预测顺序执行。执行模型保证同一个warp中的线程被“锁步”执行,但是你不能从块内的线程编号推断出更多。

于 2012-07-16T13:35:27.510 回答