2015-03-06 14 views
0

им пытаются сделать транспонирование квадратной матрицы с использованием разбиения (блоков метод) с помощью 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; 

} 

} 

Пожалуйста, помогите мне, как я могу управлять более чем одним потоком в моем плитке, так как я чувствую, что я что-то не хватает, я пробовал много способов, но он все время выходит из связанной памяти и дает неверные данные, большое спасибо

+1

Этот [блог] (http://devblogs.nvidia.com/parallelforall/efficient-matrix-transpose-cuda-cc/) может представлять интерес. –

ответ

1

Каждая нить в блок представляет значение в диапазоне [0..TILE_DIM-1], как в размерах x, так и y. Таким образом, одна команда, работающая с xx и yy, будет охватывать всю площадь вашей плитки. Нет необходимости в дополнительных петлях for.

+0

okay получил это @cygnus thax, я изменил код, но я столкнулся с другой проблемой, если его нормально спросить, код работает, но только при ограниченных размерах, что означает, что когда я тестирую Tile = 32 + size square 160 x 160, это просто работает над матрицей, а не общей матрицей, если я уменьшаю размер матрицы, она отлично работает, я отправляю код выше, PLS любые идеи, почему? – userTasim

+0

, @robert в блоге спасибо за это, но можете ли вы пояснить, почему они используют константу «BLOCK_ROWS = 8»? я не получил этот момент вообще, идея состоит в том, чтобы скопировать 32 данных в массив плитки, зачем цикл с +8 рядами? pls советуют, большое спасибо – userTasim

+0

Нехорошо редактировать ваши вопросы, применяя к нему ответ, потому что, когда кто-то третий видит вопрос, ответ становится устаревшим/неправильным/отстраненным. Если у вас есть следующий вопрос, просто задайте новый вопрос. – CygnusX1

Смежные вопросы