我试图通过CUDA使用平铺(块方法)来转置方阵,我已经成功地完成了它,但是当每个维度输入一个线程时,如下面的Host函数:
dim3 dimGrid((nEven + TILE_DIM - 1) / TILE_DIM, (nEven + TILE_DIM - 1) / TILE_DIM, 1);
dim3 dimBlock(1, 1, 1);
考虑:nEven矩阵+ TILE_DIM是块大小块 我真的很难理解线程如何在GPU中工作,所以我设法编码为我的内核下面的代码,每个块只有一个线程:
__global__ void transposeMain(int *idata)
{
__shared__ int tile2[TILE_DIM][TILE_DIM ];
int yy = blockIdx.y * TILE_DIM + threadIdx.y;
int xx = blockIdx.x * TILE_DIM + threadIdx.x;
if (xx < nEven && yy < nEven)
{
for (int i = 0; i < TILE_DIM; i++)
for (int j = 0; j < TILE_DIM; j++)
tile[i][j] = idata[(i + xx)*nEven + (j + yy)];
__syncthreads();
for (int i = 0; i < TILE_DIM; i++)
for (int j = 0; j < TILE_DIM; j++){
temp1 = tile[i][j];
idata[(j + yy)*nEven + (i + xx)] = temp1;
}
}
请帮助我如何管理多个线程进入我的平铺,因为我觉得我错过了一些东西,我尝试了很多方法,但它不断超出内存并提供错误的数据, 非常感谢
答案 0 :(得分:1)
块中的每个线程表示x和y维度中范围[0..TILE_DIM-1]
中的值。因此,使用xx
和yy
的单条指令将覆盖您图块中的整个区域。无需额外的for
循环。