Вы затронули интересный вопрос, потому что эта статья была написана еще в 2008 году.
На исходных устройствах CUDA (Compute Capability 1.0 и 1.1) было важно получить доступ к глобальной памяти, используя шаблон coalesced . Это означало, что если поток 0 обращается к четырем байтам по байтовому адресу A, то последовательные потоки 1-15 должны обращаться к адресам от A + 4 до A + 60 соответственно (* 1).
Код в статье, таким образом, получает потоки 0-15 для чтения смежных и увеличивающихся адресов, сохранения в разделяемой памяти, затем чтения из разделяемой памяти в обратном порядке и записи в смежные и увеличивающиеся адреса. В результате и чтение, и запись из / в глобальную память соответствуют строгим требованиям коалесцирования.
Однако со времени написания статьи были выпущены новые устройства CUDA (Compute Capability 1.2 и 1.3, а теперь 2.0 и 2.1), которые выполняют некоторую степень автоматического объединения. В частности, в этом случае было бы вполне приемлемо читать в одном порядке и писать в обратном порядке - аппаратное обеспечение распознает, что запись является перестановкой объединенной записи, и просто переупорядочивает ее для вас.
Итак, в итоге, на устройстве с Compute Capability 1.2 или выше вам не нужно использовать общую память для решения этой конкретной проблемы. Разумеется, общая память все еще неоценима во многих других проблемах!
Для получения дополнительной информации вам следует ознакомиться с разделом о производительности памяти в Руководстве по рекомендациям CUDA (доступно на сайте разработчика CUDA ), а также с расширенными учебными занятиями по CUDA (например, this запись ).
* 1: Обратите внимание также, что адрес A должен быть выровнен по границе 64 байта.