У меня есть в основном тот же вопрос, что и заданный in this discussion. В частности, я хочу обратиться к этому окончательный ответ:Мотивация для многомерной сетки блоков CUDA
Я думаю, что есть два разных вопроса смешиваются вместе в этой теме:
Есть ли выигрыш в производительности с помощью отображения 2D или 3D ввода или вывода данных в потоки? Ответ «абсолютно» для всех причин , которые вы и другие описали. Если данные или расчет имеют пространственную локальность, то так же должно быть задание работы на потоки в деформацией.
Есть ли преимущество в производительности для использования многомерных сетей CUDA для выполнения этого задания? В этом случае я не думаю, что с вы можете сделать вычисление индекса тривиально себе в верхней части ядра . Это сжигает несколько арифметических инструкций, но это должно быть пренебрежимо мало по сравнению с издержками запуска ядра.
Вот почему я думаю, что многомерные сетки предназначены как удобство в программиста, а не способ повышения производительности. Вам действительно нужно думать о каждом шаблоне доступа к памяти warp, .
Я хочу знать, сохраняется ли эта ситуация сегодня. Я хочу знать, почему существует необходимость в многомерной «внешней» сетке.
То, что я пытаюсь понять, заключается в том, есть ли для этого существенная цель (например, фактическая выгода от пространственной локальности) или она существует для удобства (например, в контексте обработки изображений, существует ли она только так что мы можем иметь CUDA знать о «патче x/y», который обрабатывает конкретный блок, чтобы он мог сообщить об этом в Visual Profiler CUDA или что-то в этом роде)?
Третий вариант заключается в том, что это не более чем удержание от более ранних версий CUDA, где это было обходным путем для ограничений аппаратного индексирования.