Вопрос по модели программирования CUDA - PullRequest
1 голос
/ 21 апреля 2011

Привет, я новичок в программировании CUDA, и у меня было 2 вопроса по модели программирования CUDA.

Вкратце, модель говорит, что существует иерархия памяти с точки зрения потоков, блоков и затем сеток. Потоки в блоке имеют общую память и могут легко взаимодействовать друг с другом, но не могут общаться, если они находятся в разных блоках. На устройстве GPU также есть глобальная память.

Мои вопросы:

(1) Зачем нам нужна такая иерархия памяти, состоящая из потоков и затем блоков?

Таким образом, любые два потока могут общаться друг с другом, если это необходимо, и, следовательно, вероятно, упростят процесс программирования.

(2) Почему существует ограничение на настройку потоков только до 3D-конфигураций и не более?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

1) Это позволяет вам иметь обобщенную модель программирования, которая поддерживает аппаратное обеспечение с различным числом процессоров.Это также отражение основного аппаратного обеспечения графического процессора, которое обрабатывает потоки в блоке по-разному: от потоков в разных блоках WRT до доступа к памяти и синхронизации.

Потоки могут обмениваться данными через глобальную память или разделяемую память в зависимости от соответствия их блоков.,Вы также можете использовать примитивы синхронизации, например __syncthreads.

2) Это часть модели программирования.Я подозреваю, что во многом это связано с требованием пользователя разрешить декомпозицию данных для трехмерных задач, а потребность в дальнейшей поддержке измерений была незначительной.

Руководство по программированию Cuda охватывает многие вещи такого рода.Есть также несколько доступных книг. Программирование массово параллельных процессоров: практический подход , в котором объясняется, почему аппаратное обеспечение GPU такое, какое оно есть, и как это отразилось на модели программирования.

0 голосов
/ 21 апреля 2011

(1) Локальная память используется для хранения локальных значений, которые не вписываются в регистры. Общая память используется для хранения общих данных, которые совместно используются потоками. Локальная память + регистры составляют контекст выполнения потока, а разделяемая память - это хранилище для данных, подлежащих обработке.

(2) Вы можете легко использовать 1D для представления любого D. Например, если у вас есть 1D индекс, вы можете преобразовать его в 2D-пространство, используя: x = i % width, y = i / width и обратное значение равно i = y*width + x. 2D и 3D были добавлены для вашего удобства. Это почти то же самое, что массивы N-D реализованы в C ++.

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