Как блоки CUDA делятся на основы?

Если я начну свое ядро ​​с сетки, блоки которой имеют размеры:

dim3 block_dims(16,16);

Как блоки сетки теперь делятся на деформации? Формируют ли первые две строки такого блока один перекос или первые два столбца, или это произвольно упорядочено?

Предположим, что GPU Compute Capability 2.0.

1 ответ

Решение

Потоки пронумерованы по порядку внутри блоков, так что threadIdx.x меняется быстрее всего, то threadIdx.y второй самый быстро меняющийся, и threadIdx.z самая медленная вариация. Функционально это то же самое, что и порядок главных столбцов в многомерных массивах. Деформации последовательно строятся из потоков в этом порядке. Таким образом, расчет для 2-го блока

unsigned int tid = threadIdx.x + threadIdx.y * blockDim.x;
unsigned int warpid = tid / warpSize;

Это описано как в руководстве по программированию, так и в руководстве по PTX.

Чтобы проиллюстрировать ответ @talonmies через окно Visual Studio WarpWatch для двух последовательных перекосов (dim3 block_dims(16,16); и WarpSize = 32):

Другие вопросы по тегам