CUDA转置多个线程

时间:2015-03-06 17:44:03

标签: cuda

我试图通过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;

}

}

请帮助我如何管理多个线程进入我的平铺,因为我觉得我错过了一些东西,我尝试了很多方法,但它不断超出内存并提供错误的数据, 非常感谢

1 个答案:

答案 0 :(得分:1)

块中的每个线程表示x和y维度中范围[0..TILE_DIM-1]中的值。因此,使用xxyy的单条指令将覆盖您图块中的整个区域。无需额外的for循环。