CUDA得到了计算数据

时间:2014-04-17 13:09:35

标签: cuda parallel-processing

我正在学习,我对threadIdx.x,blockIdx.x感到困惑 如果我有一个大小为5x5的数据,并且我想使用列作为个人计算的输入

   1 2 3 4 5              1    2    3    4    5
   2 3 4 5 6              2    3    4    5    6
   3 4 5 6 7        ->    3    4    5    6    7         
   4 5 6 7 8              4    5    6    7    8
   5 6 7 8 9              5    6    7    8    9 

 original data         5 input data do same kernel computation

我应该如何使用与内核<<<par1,par2>>>对应的cuda threadIdx.x和blockIdx.x 处理这类问题?

1 个答案:

答案 0 :(得分:2)

2D数据的一种方法是启动2D线程块/网格:

#define DHEIGHT 256
#define DWIDTH 256
...
dim3 threads(16,16);
dim3 blocks((DWIDTH/threads.x)+1, (DHEIGHT/threads.y)+1);
kernel<<<blocks, threads>>>(...);

在您的内核定义中,您将使用两个变量(比如说rowcol)来标识线程以及为该线程处理的元素:

int row = threadIdx.y+blockIdx.y*blockDim.y;
int col = threadIdx.x+blockIdx.x*blockDim.x;

if ((row < DHEIGHT) && (col < DWIDTH)){

  // process element at (row, col)
}

也可以使用一维网格/线程块结构来处理这个问题,然后rowcol的索引计算变得有点不同/更复杂。