1

你好,我有 2Dimendions Grid 和 1Dimensions 块:

dim3 dimGrid(K,N);

dim3 dimBlock(F);

如何计算唯一线程标识符?谢谢

编辑:抱歉,dimBlock 不是 K.F 不同 K 不同 N

4

3 回答 3

3

本地线程 ID:

unsigned ltid = threadIdx.x; // Varies from 0 to K-1

块的数量可以通过以下方式计算:

unsigned num_blocks = blockIdx.y * gridDim.x + blockIdx.x;

当前块之前的线程数:

unsigned boff = num_blocks * blockDim.x; // Multiples of K * N * K

将当前线程Id加上当前block之前的线程数,就可以得到全局唯一id。

unsigned gtid = ltid + boff;

编辑

修改了答案。原文是在错误的假设下编写的。

于 2013-01-14T21:46:29.787 回答
2

纯粹为了清楚起见(其他答案也是正确的,但我发现这种方法更有利于学习),可以通过以下方式找到任何给定线程的 2D 块和网格的全局索引:

int index_x = blockIdx.x * blockDim.x + threadIdx.x;    
int index_y = blockIdx.y * blockDim.y + threadIdx.y;
int grid_width = gridDim.x * blockDim.x;
//get the global index 
int global_idx = index_y * grid_width + index_x;

如果您曾经为块大小引入第二个维度,这可能很有用,因为它会自动处理这种情况。

于 2013-01-15T18:36:27.683 回答
1

我将使用的计算是这样的:

int idx = threadIdx.x + (blockDim.x * ((gridDim.x * blockIdx.y) + blockIdx.x));

您可能还对我发布的这个问题的答案感兴趣。

于 2013-01-14T21:53:00.610 回答