Сколько циклов задержки памяти на тип доступа к памяти в OpenCL / CUDA? - PullRequest
5 голосов
/ 04 ноября 2010

Я просмотрел руководство по программированию и руководство по передовым методам, и там упоминалось, что доступ к глобальной памяти занимает 400-600 циклов.Я не видел много других типов памяти, таких как текстурный кеш, постоянный кеш, разделяемая память.Регистры имеют 0 задержек памяти.

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

Совместно используемая память такая же, как регистры, если нет банковских конфликтов?Если есть, то как разворачивается задержка?

А как насчет кеша текстур?

Ответы [ 2 ]

6 голосов
/ 09 декабря 2015

Для (Kepler) Tesla K20 задержки следующие:

Глобальная память: 440 часов
Постоянная память
L1: 48 часов
L2: 120 часов
Общая память: 48 часов
Текстура памяти
L1: 108 часов
L2: 240 часов

Откуда я знаю? Я запустил микробенчмарки, описанные авторами Демистификация микроархитектуры графического процессора через микробенчмаркинг . Они обеспечивают аналогичные результаты для более старого GTX 280.

Это было измерено на кластере Linux, вычислительный узел, на котором я выполнял тесты, не использовался никакими другими пользователями или запускал какие-либо другие процессы. Это BULLX Linux с парой из 8 ядер Xeon и 64 ГБ оперативной памяти, nvcc 6.5.12. Я изменил sm_20 на sm_35 для компиляции.

В PTX ISA есть также глава стоимость операндов , хотя она не очень полезна, она просто повторяет то, что вы уже ожидали, без указания точных цифр.

4 голосов
/ 04 ноября 2010

Задержка в общей / постоянной / текстурной памяти невелика и зависит от того, какое у вас устройство.В целом, хотя графические процессоры спроектированы как архитектура пропускной способности, что означает, что при создании достаточного количества потоков латентность памяти, включая глобальную память, скрыта.

Причина, по которой гиды говорят о задержке для глобальной памяти, заключается в том, что задержка на несколько порядков выше, чем в других воспоминаниях, что означает, что она является доминирующей задержкой, которую следует учитывать при оптимизации.* Вы упомянули постоянный кеш в частности.Вы совершенно правы, что если все потоки внутри деформации (то есть группа из 32 потоков) обращаются к одному и тому же адресу, то штраф не применяется, то есть значение считывается из кэша и передается всем потокам одновременно.Однако, если потоки обращаются к разным адресам, доступ должен сериализировать , поскольку кэш-память может предоставлять только одно значение за раз.Если вы используете CUDA Profiler, то это будет отображаться под счетчиком сериализации.

Общая память, в отличие от постоянного кэша, может обеспечить гораздо более высокую пропускную способность.Посмотрите доклад CUDA Optimization для получения более подробной информации и объяснения банковских конфликтов и их влияния.

...