Учебное пособие д-р Доббс CUDA (реверсивные массивы) - PullRequest
2 голосов
/ 15 августа 2010

Я читал Суперкомпьютинг для масс: Часть 5 на Dr.Dobb, и у меня есть вопрос, касающийся кода автора для (быстрых) реверсивных массивов.

Я понимаю необходимость использования разделяемой памяти, но я не получил прироста производительности в коде reverseArray_multiblock_fast.cu

В reverseArray_multiblock_fast.cu элемент массива передается из глобальной памяти в общую память, а затем из общей памяти в глобальную память. Я не могу понять, почему это лучше, чем непосредственное чтение элемента массива из глобальной памяти и запись его в другой индекс в глобальной памяти.

Не могли бы вы объяснить это мне?

Ответы [ 3 ]

4 голосов
/ 15 августа 2010

Ответ таков: графические процессоры, такие как чтение и запись блоков выровненных последовательных данных (в cuda, называемых объединением), поэтому в быстрой реализации вы идеальным образом читаете блок в разделяемую память, затем обращаете его обратно и только затем записываете егов последовательном порядке.Обратите внимание, что поток, который выполняет переупорядочение, не обязательно является потоком, который записывает данные обратно в глобальную память.

3 голосов
/ 17 августа 2010

проверить Суперкомпьютинг для масс: часть 6
все объясняет ...

2 голосов
/ 20 августа 2010

Вы затронули интересный вопрос, потому что эта статья была написана еще в 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 байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...