Как блоки 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):