Потоки в CUDA не действуют по отдельности, они сгруппированы в основы из 32 потоков . Эти 32 потока выполняются в непрерывном режиме (обычно). Инструкция, выданная одному потоку, выдается всем 32 одновременно в одном и том же тактовом цикле.
Если эта инструкция является инструкцией, которая читает память (например), то может быть выполнено до 32 независимых операций чтения. требуется / требуется. Точные шаблоны адресов, необходимые для выполнения этих операций чтения, определяются кодом, который вы пишете. Если все эти адреса «смежны» в памяти, это будет эффективное чтение. Если эти адреса как-то «разбросаны» в памяти, это будет неэффективным чтением и будет медленнее.
Эта только что описанная базовая концепция называется «объединенным» доступом в CUDA. Ваш случай суммирования столбцов допускает объединенный доступ через деформацию, потому что адреса, сгенерированные каждым потоком в деформации, находятся в смежных столбцах, а местоположения соседствуют в памяти. Ваш случай суммирования строк ломает это. Адреса, генерируемые каждым потоком в деформации, не являются смежными (они являются «столбчатыми», отделенными друг от друга шириной массива) и, следовательно, не «объединяются».
Разница в производительности обусловленак этой разнице в эффективности доступа к памяти.
Вы можете больше узнать о объединении поведения в CUDA, изучив вводный подход к оптимизации CUDA, такой как здесь , особенно слайды 44-54.