д-р Доббс cuda (реверсивные массивы) учебник


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

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

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

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

3 2

3 ответа:

Проверьте суперкомпьютер для масс: Часть 6
это все объясняет...

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

Вы подняли интересный вопрос, потому что эта статья была написана еще в 2008 году.

На оригинальных устройствах CUDA (вычислительные возможности 1.0 и 1.1) было критически важно получить доступ к глобальной памяти с использованием шаблона "сращенный". Это означало, что если поток 0 обращается к четырем байтам по адресу байта A, то последовательные потоки 1-15 должны обращаться к адресам A+4 и A+60 соответственно (*1).

Поэтому код в статье получает потоки 0-15 для чтения непрерывных и возрастающих адресов., хранить в общей памяти, затем считывать из общей памяти в обратном порядке и записывать на непрерывные и увеличивающиеся адреса. В результате как чтение, так и запись из/в глобальную память соответствуют строгим требованиям коалесцирования.

Однако с момента написания статьи были выпущены новые устройства CUDA (вычислительные возможности 1.2 и 1.3, а теперь 2.0 и 2.1), которые выполняют некоторую степень автоматической коалесцировки. В частности, в данном случае это было бы идеально допустимо читать в одном порядке и писать в обратном - аппаратное обеспечение распознает, что запись является перестановкой коалесцированной записи, и просто переупорядочивает ее для вас.

Таким образом, в целом, на устройстве с вычислительной способностью 1.2 или выше вам не нужно выполнять этап через общую память для этой конкретной проблемы. Общая память по-прежнему бесценна во многих других проблемах, конечно!

Для получения дополнительной информации вы должны проверить раздел о производительности памяти в CUDA Best Практическое руководство (доступно на сайте разработчика CUDA ), а также расширенные учебные сессии CUDA (например, эта запись).

*1: Обратите внимание также, что адрес A должен быть выровнен по 64-байтовой границе.