2015-06-25 5 views
0

Это концептуальный вопрос. В CUDA, gridDim, blockDim и threadIdx могут быть 1D, 2D или 3D. Интересно, как интерпретируются их 2D и 3D-версии?CUDA gridDim, blockDim и threadIdx

Более подробную информацию о том, что CUDA рассматривает многомерные gridDim, blockDim и threadIdx как линейную последовательность, аналогично тому, как C хранит многомерный массив? Если нет, то как мы должны интерпретировать многомерные gridDim, blockDim и threadIdx?

Спасибо.

Редактировать 1. Этот вопрос не дублируется. Я на самом деле столкнулся с указанным вопросом. Он спрашивает о порядке выполнения потоков GPU, а не их макетах, как это делается.

Edit 2. Кроме того, ответ на этот вопрос можно найти в http://docs.nvidia.com/cuda/cuda-c-programming-guide/#thread-hierarchy. Спасибо @talonmies, для справки. Подводя итог, многомерные gridDim, blockDim и threadIdx предназначены для удобства. Они могут быть интерпретированы так же, как большой массив упорядоченных многомерных массивов.

+2

Что вы подразумеваете под * как интерпретируются их 2D и 3D-версии? *? Не могли бы вы расширить свой вопрос еще немного? – haccks

ответ

-1

Более подробную информацию о CUDA рассматривает многомерные gridDim, blockDim и threadIdx как линейная последовательность, аналогично тому, как C хранит многомерный массив?

Да.
Все многомерные массивы линеаризуются в C. Они линеаризуются в строчном порядке - помещают все элементы одной и той же строки в последовательные местоположения, строки затем помещаются один за другим в пространство памяти.
CUDA C также использует строчную карту. Пример 2D компоновки массива:

enter image description here

+2

Это не отвечает на вопрос – talonmies

+0

@talonmies; На самом деле я ждал чемпиона CUDA! :) Пожалуйста, дополните? – haccks

+2

Вопрос не в макетах макетов. Речь идет о упорядочении нумерации потоков и блоков в сетях ядра GPU – talonmies

1

Цитирование непосредственно из CUDA programming guide

Индекс нити и ее нити ID связаны друг с другом в простым способом: Для одно- мерный блок, они одинаковы; для двумерного блока размера (Dx, Dy), идентификатор потока потока индекса (x, y) равен (x + y Dx); для трехмерного блока размера (Dx, Dy, Dz) идентификатор потока потока индекса (x, y, z) равен (x + y Dx + z Dx Dy).

Итак, да, нумерация логической нити в модели программирования последовательна, а затем размер x изменяется быстрее, а затем y-мерность, затем размер z. Это относится как к нумерации потоков внутри блоков, так и к нумерации блоков в сетке. Нумерация аналогична column major упорядоченным многомерным массивам, хотя сами переменные threadIdx и blockIdx являются только структурами, отражающими внутренние потоки и идентификационные слова блока, назначаемые планировщиком каждому потоку или блоку.

Следует отметить, что нумерация, указанная threadIdx и blockIdx, предназначена только для удобства программистов и не подразумевает ничего о порядке выполнения потоков на графическом процессоре.