Я просмотрел руководство по программированию и руководство по лучшим практикам, и он отметил, что доступ к глобальной памяти занимает 400-600 циклов. Я не видел много других типов памяти, таких как кеш текстуры, постоянный кеш, разделяемая память. Регистры имеют 0 задержку памяти.Сколько циклов латентности памяти для каждого типа доступа к памяти в OpenCL/CUDA?
Я думаю, что постоянный кеш совпадает с регистрами, если все потоки используют один и тот же адрес в постоянном кеше. Хуже того, я не уверен.
Общая память совпадает с регистрами, если нет конфликтов банков? Если есть, то как происходит задержка?
Что относительно текстурного кеша?
Стоит ли использовать постоянный кеш, если, например, все потоки получают доступ к 1000 поплавкам? Это будет похоже на 1000 просмотров из реестра? Гид сказал, что использование постоянного кеша таким образом масштабируется линейно правильно? – smuggledPancakes
Если все потоки получают доступ к * одинаковому * значению в любой заданной итерации цикла, вы можете использовать постоянный кеш. Постоянный кеш предоставит некоторую выгоду из-за пространственной локальности (на Fermi кеш L1 может достичь того же, но это оставляет L1 бесплатным для других данных). Сказав это, я больше ориентируюсь на Ферми и никогда не использую '__constant__', я просто использую const много и дайте компилятору понять это! Например, в вашем случае я передал бы ядро arg как 'const float * const myfloatarray'. Я бы рекомендовал всегда запускать Visual Profiler для проверки на сериализацию на случай, если вы что-то пропустили. – Tom
Можно добавить, что строки кэша составляют 128 байт (32 байт) для L1 (L2), поэтому мы говорим о том, что адреса попадают в одни и те же строки (не обязательно одинаковые адреса). Некоторые номера других задержек можно найти здесь (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –