cuda网格二维线程标识符

cuda网格二维线程标识符,cuda,Cuda,hy,我有2维网格和1维块: dim3 dimGrid(K,N); dim3 dimBlock(F); 如何计算唯一的线程标识符? 谢谢 编辑: 很抱歉,dimBlock不是K。F different K different N本地线程Id: unsigned ltid = threadIdx.x; // Varies from 0 to K-1 块数可通过以下公式计算: unsigned num_blocks = blockIdx.y * gridDim.x + blockIdx.x;

hy,我有2维网格和1维块:

dim3 dimGrid(K,N);

dim3 dimBlock(F);
如何计算唯一的线程标识符? 谢谢

编辑: 很抱歉,dimBlock不是K。F different K different N

本地线程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;
编辑

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

本地线程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;
编辑


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

我将使用如下计算:

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

您可能还对我发布到的答案感兴趣。

我将使用如下计算:

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

您可能还对我发布到的答案感兴趣。

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

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;

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

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

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;

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

我不确定这是否完整。首先,对于1D threadblock,threadIdx.y始终是1。我不确定这是否完整。首先,对于1D threadblock,threadIdx.y始终为1。