hy,我有2Dimendions Grid和1Dimensions块:
dim3 dimGrid(K,N);
dim3 dimBlock(F);
如何计算唯一线程标识符? 感谢
编辑: 对不起,dimBlock不是K.F不同的K不同N
答案 0 :(得分: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添加到当前块之前的线程数,您可以获得全局唯一ID。
unsigned gtid = ltid + boff;
编辑
修改了答案。原文是在错误的假设下写成的。
答案 1 :(得分: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;
如果您为块大小引入第二个维度,这可能很有用,因为它会自动处理该情况。
答案 2 :(得分:1)
我将使用的计算方法如下:
int idx = threadIdx.x + (blockDim.x * ((gridDim.x * blockIdx.y) + blockIdx.x));
您可能也对我发布到this question的答案感兴趣。