2013-12-06 5 views
1

Разделение работы CUDA накладывается на блоки логично, потому что оно отражает аппаратное обеспечение (некоторое количество потоков выполнения в одном исполнительном модуле, все в одном «блоке»).Мотивация CUDA для многомерного выполнения ядра

Однако, поскольку я ищу реализацию алгоритмов обработки изображений, не совсем понятно, почему у меня должны быть двумерные решетки блоков, каждая из которых представляет собой 2D-сетку потоков. Почему бы не сделать 1D? В конце концов, вызов ядра обычно просто видит изображение как линейный 1D-массив пикселей в любом случае и должен вычислить его глобальный индекс, умножив обычный столбец строки * столбца + в столбце.

Предполагается, что у меня есть пространственная локальность. We обычно вычислить материал для пикселя на основе пикселей вокруг него, поэтому 2D-сетка потоков гарантирует, что все соседние пиксели работают в одном и том же исполнительном устройстве, таким образом, могут совместно использовать локальную память и т. Д. Это правильно? Что-нибудь еще мне не хватает? Может быть, простота программирования какой-то образом (хотя это трудно поверить, так как код вычисления 1D смещения в любом случае)

Заранее спасибо

ответ

1

AFAIK единственной причиной для 2D/3D сетки, если он относится к данным. Если у вас есть 2D-данные (изображение ...) или 3D-данные (система частиц и т. Д.), Вы можете сделать код более читаемым, используя соответствующие блокировки блоков. Кроме того, на более старых картах было 65535 предел количества блоков в одном измерении, поэтому для его использования использовались другие измерения.

Не должно быть разницы в производительности, используете ли вы 1D-блок потоков или 2D/3D-блок.

+0

Но код не читается, так как в любом случае данные, передаваемые в ядра, почти всегда являются 1D-массивом, и вам нужно пересчитать смещение от ваших координат. – zlatanski

+0

@zlatanski: это действительно зависит от данных, я бы не сказал, что это «почти всегда 1D-массив» :) –

+0

Я имею в виду, что все образцы обработки изображений, которые вы находите, имеют данные, входящие как 'uchar4 *', - а затем вы вычислите свое местоположение внутри этого массива из глобального индекса потока. Тот факт, что глобальный индекс потока 2D вряд ли помогает сделать код более читаемым – zlatanski

Смежные вопросы