Разделение работы CUDA накладывается на блоки логично, потому что оно отражает аппаратное обеспечение (некоторое количество потоков выполнения в одном исполнительном модуле, все в одном «блоке»).Мотивация CUDA для многомерного выполнения ядра
Однако, поскольку я ищу реализацию алгоритмов обработки изображений, не совсем понятно, почему у меня должны быть двумерные решетки блоков, каждая из которых представляет собой 2D-сетку потоков. Почему бы не сделать 1D? В конце концов, вызов ядра обычно просто видит изображение как линейный 1D-массив пикселей в любом случае и должен вычислить его глобальный индекс, умножив обычный столбец строки * столбца + в столбце.
Предполагается, что у меня есть пространственная локальность. We обычно вычислить материал для пикселя на основе пикселей вокруг него, поэтому 2D-сетка потоков гарантирует, что все соседние пиксели работают в одном и том же исполнительном устройстве, таким образом, могут совместно использовать локальную память и т. Д. Это правильно? Что-нибудь еще мне не хватает? Может быть, простота программирования какой-то образом (хотя это трудно поверить, так как код вычисления 1D смещения в любом случае)
Заранее спасибо
Но код не читается, так как в любом случае данные, передаваемые в ядра, почти всегда являются 1D-массивом, и вам нужно пересчитать смещение от ваших координат. – zlatanski
@zlatanski: это действительно зависит от данных, я бы не сказал, что это «почти всегда 1D-массив» :) –
Я имею в виду, что все образцы обработки изображений, которые вы находите, имеют данные, входящие как 'uchar4 *', - а затем вы вычислите свое местоположение внутри этого массива из глобального индекса потока. Тот факт, что глобальный индекс потока 2D вряд ли помогает сделать код более читаемым – zlatanski