им пытаются сделать транспонирование квадратной матрицы с использованием разбиения (блоков метод) с помощью CUDA, я успешно сделал это, но onnly при входе в один поток для каждого измерения, как показано ниже в функции хоста:CUDA транспонировать более одного потока
dim3 dimGrid((nEven + TILE_DIM - 1)/TILE_DIM, (nEven + TILE_DIM - 1)/TILE_DIM, 1);
dim3 dimBlock(1, 1, 1);
с учетом: nИниверситет размера матрицы + TILE_DIM является блоком размера плитки У меня действительно возникли проблемы с пониманием того, как работают потоки в графическом процессоре, поэтому ive удалось кодировать как ниже мое ядро, которое работает только с одним потоком на блок:
__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;
}
}
Пожалуйста, помогите мне, как я могу управлять более чем одним потоком в моем плитке, так как я чувствую, что я что-то не хватает, я пробовал много способов, но он все время выходит из связанной памяти и дает неверные данные, большое спасибо
Этот [блог] (http://devblogs.nvidia.com/parallelforall/efficient-matrix-transpose-cuda-cc/) может представлять интерес. –