2010-11-04 2 views
5

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

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

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

Что относительно текстурного кеша?

ответ

4

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

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

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

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

+0

Стоит ли использовать постоянный кеш, если, например, все потоки получают доступ к 1000 поплавкам? Это будет похоже на 1000 просмотров из реестра? Гид сказал, что использование постоянного кеша таким образом масштабируется линейно правильно? – smuggledPancakes

+0

Если все потоки получают доступ к * одинаковому * значению в любой заданной итерации цикла, вы можете использовать постоянный кеш. Постоянный кеш предоставит некоторую выгоду из-за пространственной локальности (на Fermi кеш L1 может достичь того же, но это оставляет L1 бесплатным для других данных). Сказав это, я больше ориентируюсь на Ферми и никогда не использую '__constant__', я просто использую const много и дайте компилятору понять это! Например, в вашем случае я передал бы ядро ​​arg как 'const float * const myfloatarray'. Я бы рекомендовал всегда запускать Visual Profiler для проверки на сериализацию на случай, если вы что-то пропустили. – Tom

+0

Можно добавить, что строки кэша составляют 128 байт (32 байт) для L1 (L2), поэтому мы говорим о том, что адреса попадают в одни и те же строки (не обязательно одинаковые адреса). Некоторые номера других задержек можно найти здесь (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –

6

В (Kepler) Тесла K20 в задержках заключаются в следующем:

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

Как я знаю? Я запустил микрочипы, описанные авторами Demystifying GPU Microarchitecture through Microbenchmarking. Они дают аналогичные результаты для старого GTX 280.

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

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

+0

Я тоже использую Tesla K20, и я попытался запустить тот же микрофон, который вы упомянули. Могли ли вы запускать 'global.cu' без проблем? Я спрашиваю, потому что я столкнулся с проблемой с незаконным доступом к памяти - я опубликовал этот вопрос [здесь] (http://stackoverflow.com/questions/36416843/how-to-write-a-pointer-chasing-benchmark-using- 64-битовые указатели-в-CUDA). Мне было интересно, если вы внесли какие-либо изменения в код ядра, чтобы заставить его работать на вас? – Kajal

+0

@ kv.333 Это было какое-то время назад. Я помню, что были некоторые проблемы, и не все тесты проходили. Я не помню, какие из них. –

Смежные вопросы