Почему постоянный объем памяти ограничен в CUDA?
В соответствии с "Руководством по программированию CUDA C" постоянный доступ к памяти имеет преимущество только в случае попадания в многопроцессорный постоянный кэш (Раздел 5.3.2.4)1. В противном случае может быть даже больше запросов памяти для полуванчивания, чем в случае объединенного чтения глобальной памяти. Так почему же постоянный объем памяти ограничен 64 КБ?
Еще один вопрос, чтобы не задавать дважды. Насколько я понимаю, в архитектуре Fermi кеш текстур сочетается с кешем L2. Имеет ли смысл использование текстуры или же чтение глобальной памяти кэшируется таким же образом?
1постоянная память (раздел 5.3.2.4)
Постоянное пространство памяти находится в памяти устройства и кэшируется в постоянном кэше, упомянутом в разделах F.3.1 и F.4.1.
Для устройств с вычислительной возможностью 1.x постоянный запрос памяти для деформации сначала делится на два запроса, по одному для каждого полуэкрана, которые выдаются независимо.
Затем запрос разделяется на столько отдельных запросов, сколько есть разных адресов памяти в начальном запросе, уменьшая пропускную способность на коэффициент, равный количеству отдельных запросов.
Полученные в результате запросы затем обрабатываются при пропускной способности постоянного кэша в случае попадания в кэш или в противном случае при пропускной способности памяти устройства.
1 ответ
Постоянный объем памяти составляет 64 КБ для вычислительных возможностей устройств 1.0-3.0. Рабочий набор кеша составляет всего 8 КБ (см. Руководство по программированию CUDA v4.2 Таблица F-2).
Постоянная память используется объявленным драйвером, компилятором и переменными __device__ __constant__
, Драйвер использует постоянную память для передачи параметров, текстурных привязок и т. Д. Компилятор использует константы во многих инструкциях (см. Разборка).
Переменные, помещенные в постоянную память, могут быть прочитаны и записаны с использованием функций времени выполнения хоста. cudaMemcpyToSymbol()
а также cudaMemcpyFromSymbol()
(см. Руководство по программированию CUDA v4.2, раздел B.2.2). Постоянная память находится в памяти устройства, но доступ к ней осуществляется через постоянный кеш.
На текстуре Ферми константа, L1 и I-Cache - это кэши 1-го уровня в каждом SM или вокруг него. Все кэши уровня 1 обращаются к памяти устройства через кэш L2.
Константный предел в 64 КБ - для каждого модуля CU, который является единицей компиляции CUDA. Концепция CUmodule скрыта в среде выполнения CUDA, но доступна через API драйвера CUDA.