我正在学习,我对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
处理这类问题?
答案 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>>>(...);
在您的内核定义中,您将使用两个变量(比如说row
和col
)来标识线程以及为该线程处理的元素:
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)
}
也可以使用一维网格/线程块结构来处理这个问题,然后row
和col
的索引计算变得有点不同/更复杂。