CUDA: назначение идентификатора нити в 2D сетке

Предположим, у меня есть вызов ядра с двумерной сеткой, например:

dim3 dimGrid(x, y); // not important what the actual values are
dim3 dimBlock(blockSize, blockSize);
myKernel <<< dimGrid, dimBlock >>>();

Теперь я прочитал, что многомерные сетки просто предназначены для облегчения программирования — базовое оборудование будет когда-либо использовать только 1D линейно кэшированную память (если вы не используете текстурную память, но это здесь не актуально).

Мой вопрос: в каком порядке потоки будут назначаться индексам сетки во время планирования деформации? Будут ли они назначены горизонтально («повторять» x, затем y) или вертикально («повторять» y, затем x)? Это может быть важно для улучшения объединения памяти, в зависимости от того, как я обращаюсь к своей памяти в ядре.

Чтобы сделать это более понятным, предположим, что следующее представляет идентификаторы потока применительно к моей (воображаемой) сетке с «горизонтальным» распределением:

[ 0  1  2  3 ]
[ 4  5  6  7 ]
[ 8  9 10 11 ]
[ ...        ]

И «вертикальное» распределение будет:

[ 0  4  8 .. ]
[ 1  5  9 .. ]
[ 2  6 10 .. ]
[ 3  7 11 .. ]

Я надеюсь, что вы можете увидеть, как это может повлиять на объединение: в каждом варианте будет определенный оптимальный способ доступа к буферу памяти моего устройства.

К сожалению, я не нашел никакой подробной информации по этому вопросу ..

1

Решение

Горизонтально и вертикально произвольно. Но потоки имеют четко определенные измерения x, y и z. Потоки сгруппированы в основы в порядке x, y, z. Таким образом, блок потоков 16×16 будет иметь потоки в следующем порядке в первом 32-поточном перекосе:

полоса деформации: идентификатор потока (x, y, z)

  • 0: 0,0,0
  • 1: 1,0,0
  • 2: 2,0,0
  • 3: 3,0,0
  • 15: 15,0,0
  • 16: 0,1,0
  • 17: 1,1,0
  • 18: 2,1,0
  • 19: 3,1,0
  • 31: 15,1,0
3

Другие решения

Других решений пока нет …