индексирование потока cuda - PullRequest
2 голосов
/ 25 марта 2012

это правильное выражение для индексации матрицы (dim3 threadBlock = (A, B, 1), dim3 blockGrid = (C, D, 1), где A, B, C, D - некоторые числа)?

int i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x;
int j = (blockIdx.x * gridDim.y + blockIdx.y) * blockDim.y + threadIdx.y;

Ответы [ 2 ]

5 голосов
/ 25 марта 2012

Это не выглядит правильным для моих глаз.Индексы (i,j) любого потока в двумерной сетке CUDA равны

int idx_i = blockIdx.x * blockDim.x + threadIdx.x;
int idx_j = blockIdx.y * blockDim.y + threadIdx.y;

Если вы обращаетесь к массиву, хранящемуся в линейной памяти, эквивалентный индекс (i,j) равен либо

int mindex_colmajor = idx_i + idx_j * LDA;

или

int mindex_rowmajor = idx_j + idy_i * LDA;

в зависимости от того, хранится ли массив в мажорной строке или мажорном порядке столбца с первым измерением в памяти (или эквивалентным шагом), равным LDA.Затем вы получаете доступ к памяти как

value = array[mindex]

, где mindex - это индекс основной или основной строки, рассчитанный выше.

1 голос
/ 25 марта 2012

Это один из способов индексации в матрице из потоков, но не единственный способ.Например, я мог бы изменить ядро ​​так, чтобы каждый поток имел дело с более чем одним элементом матрицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...