Сколько циклов задержки памяти для каждого типа доступа к памяти в OpenCL / CUDA?

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

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

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

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


person smuggledPancakes    schedule 04.11.2010    source источник


Ответы (2)


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

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

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

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

person Tom    schedule 04.11.2010
comment
Стоит ли по-прежнему использовать постоянный кеш, если, например, все потоки обращаются к 1000 float? Это будет похоже на 1000 чтений из реестра? В руководстве сказано, что использование постоянного кеша таким образом линейно масштабируется, верно? - person smuggledPancakes; 04.11.2010
comment
Если все потоки обращаются к одинаковому значению в любой данной итерации цикла, вы можете использовать постоянный кеш. Кэш констант дает некоторые преимущества из-за пространственной локальности (на Fermi кеш L1 может выполнять то же самое, но это оставляет L1 свободным для других данных). Сказав это, я в основном нацелен на Fermi и никогда не использую __constant__, я просто часто использую const и позволяю компилятору разобраться в этом! Например, в вашем случае я бы передал аргумент ядра как const float * const myfloatarray. Я бы рекомендовал всегда запускать Visual Profiler для проверки сериализации на случай, если вы что-то пропустили. - person Tom; 05.11.2010
comment
Можно добавить, что строки кэша составляют 128 байт (32 байта) для L1 (L2), поэтому мы говорим об адресах, попадающих в одни и те же строки (не обязательно одинаковые адреса). Некоторые цифры по другим задержкам можно найти здесь. - person P Marecki; 09.09.2012

Для (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, хотя и не очень полезен, просто повторяет то, что вы уже ожидаете, без точных цифр.

person the swine    schedule 09.12.2015
comment
Я тоже использую Tesla K20, и я попытался запустить тот же микробенчмарк, о котором вы упомянули. Удалось ли вам запустить global.cu без проблем? Я спрашиваю, потому что столкнулся с проблемой незаконного доступа к памяти - я разместил этот вопрос здесь. Мне было интересно, внесли ли вы какие-либо изменения в код ядра, чтобы он работал на вас? - person Kajal; 05.04.2016
comment
@ kv.333 Это было некоторое время назад. Я помню, что были некоторые проблемы, и не все тесты выполнялись. Я не помню, какие именно. - person the swine; 11.04.2016