Размеры блока в CUDA - PullRequest
       2

Размеры блока в CUDA

5 голосов
/ 04 ноября 2011

У меня есть NVIDIA GTX 570 с возможностью вычислений 2.0 и cuda-4.0.

Исполняемый файл deviceQuery в CUDA SDK предоставляет мне информацию о моем устройстве CUDA и его различных свойствах. Две строки на выходе:

Максимальное количество потоков в блоке: 1024

Максимальные размеры каждого измерения блока: 1024 x 1024 x 64

Почему третье измерение блока ограничено 64 потоками, только если размеры X и Y могут варьироваться до 1024 потоков?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

РЕДАКТИРОВАТЬ2: ТАКЖЕ, пожалуйста, возьмите это с зерном соли; Это чисто гипотетический ответ или предположение. Действительно, может быть четкая аппаратная причина, почему 64 - максимум. Честно говоря, я не знаю, и мой ответ основан на предположении, что такого аппаратного ограничения как такового не существует.

Вероятно, это комбинация из трех вещей: во-первых, существует ограничение на количество потоков, которые могут быть резидентными внутри блока; во-вторых, размеры блоков обычно кратны 32, а еще чаще степени 2 больше 32; в-третьих, системы координат, используемые при решении многомерных задач, чаще всего ориентированы так, что вы смотрите на сцену напрямую (т. е. важные биты распределены в X и Y больше, чем в Z).

CUDA, естественно, должен поддерживать 1D-доступ, так как это очень распространенный и эффективный шаблон доступа, когда это применимо. Чтобы поддержать это, размер X должен изменяться во всем диапазоне 1024 потоков.

Для поддержки 2D-доступа, который является менее распространенным, CUDA должна минимально поддерживать до 512 в измерении X (используя соглашение, что измерение X должно быть ориентировано в системе координат, чтобы он измерял самый большой разброс) и 32 измерение Y. Он должен поддерживать до 1024 в измерении X, и я предполагаю, что они ослабляют требование, чтобы размер X был не меньше размера Y, и допускали полный диапазон значений Y в 1024. Однако, в моем понимании, 32 было бы достаточно большим для максимума измерения Y.

Чтобы поддерживать трехмерный доступ, поддерживая X, Y> = Z и пытаясь достичь 1024, кажется, что в лучшем случае X = Y = Z = 10; так что нет реальных аргументов в пользу того, чтобы Z был больше 10, учитывая мои предположения

Таким образом, я не понимаю, почему они не смогли сделать максимумы (1024, 32, 10). Мой вопрос: зачем их делать (1024, 1024, 64)? Единственный ответ, к которому я все время возвращаюсь, - дать программистам некоторую гибкость в нарушении соглашения системы координат X> = Y> = Z

Редактировать: учитывая мое резюме и гипотетический ответ, реальный ответ на ваш вопрос таков: это произвольное решение.

0 голосов
/ 05 ноября 2011

Мое странное предположение состоит в том, что потому что threadIdx.x, threadIdx.y и threadIdx.z хранятся в отдельном 32-битном регистре, возможно, даже с некоторыми другими дополнительными данными.Может быть, варп ID?Или, может быть, идентификатор блока мультипроцессора, чтобы определить, какой блок обрабатывает данный поток, если данный мультипроцессор запускает более одного?

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

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