Каковы времена жизни постоянной памяти CUDA?
У меня возникли проблемы с тем, чтобы обернуть голову вокруг ограничений на постоянную память CUDA.
- Почему мы не можем выделить
__constant__
память во время выполнения? Почему мне нужно скомпилировать переменную фиксированного размера с почти глобальной областью действия? Когда постоянная память фактически загружена или выгружена? Я это понимаю
cudaMemcpytoSymbol
используется для загрузки определенного массива, но использует ли каждое ядро свое распределение постоянной памяти? Связано, есть ли стоимость связывания и отмены привязки, аналогичная старой стоимости связывания текстур (иначе говоря, использование текстур добавляло стоимость к каждому вызову ядра)?Где находится постоянная память на чипе?
Меня в первую очередь интересуют ответы, поскольку они касаются Паскаля и Вольты.
1 ответ
Вероятно, проще всего ответить на эти шесть вопросов в обратном порядке:
Где находится постоянная память на чипе?
Это не так. Постоянная память хранится в статически зарезервированной физической памяти вне кристалла и доступна через кэш для каждого SM. Когда компилятор может определить, что переменная хранится в области памяти логической константы, он будет генерировать специальные инструкции PTX, которые разрешают доступ к этой статической памяти через постоянный кэш. Также обратите внимание, что существуют специальные зарезервированные банки постоянной памяти для хранения аргументов ядра на всех поддерживаемых в настоящее время архитектурах.
Есть ли стоимость связывания и отмены привязки, аналогичная старой стоимости связывания текстур (иначе говоря, использование текстур добавляло стоимость к каждому вызову ядра)?
Нет. Но здесь также нет "привязки" или "отмены привязки", потому что резервирование выполняется статически. Единственными затратами времени выполнения являются передачи памяти между устройствами и стоимость загрузки символов в контекст как часть установления контекста.
Я это понимаю
cudaMemcpytoSymbol
используется для загрузки определенного массива, но использует ли каждое ядро свое распределение постоянной памяти?
Нет. Существует только одно "выделение" для всего графического процессора (хотя, как отмечалось выше, для аргументов ядра существуют специальные банки постоянной памяти, поэтому в некотором смысле можно сказать, что существует постоянная память для каждого ядра).
Когда постоянная память фактически загружена или выгружена?
Это зависит от того, что вы подразумеваете под "загружен" и "выгружен". Загрузка на самом деле является двухфазным процессом - во-первых, получить символ и загрузить его в контекст (если вы используете API времени выполнения, это выполняется автоматически), а во-вторых, любые пользовательские операции времени выполнения, чтобы изменить содержимое постоянной памяти с помощью cudaMemcpytoSymbol
,
Почему мне нужно скомпилировать переменную фиксированного размера с почти глобальной областью действия?
Как уже отмечалось, постоянная память - это в основном логическое адресное пространство в иерархии памяти PTX, которое отражается зарезервированной областью конечного размера карты DRAM GPU и требует от компилятора одинакового доступа к определенным инструкциям через выделенный на кеше кеш или кэши. Учитывая его статическую природу анализа, основанного на анализе компилятора, имеет смысл, что его реализация на языке также будет в основном статической.
Почему мы не можем выделить
__constant__
память во время выполнения?
Прежде всего потому, что NVIDIA решила не выставлять это. Но учитывая все ограничения, изложенные выше, я не думаю, что это ужасно плохой выбор. Отчасти это может быть историческим, поскольку постоянная память была частью дизайна CUDA с самого начала. Почти все оригинальные функции и возможности в дизайне CUDA соответствуют аппаратным функциям, которые существовали для первой цели оборудования, а именно для графических API-интерфейсов, которые предназначены для поддержки графических процессоров. Поэтому некоторые из того, о чем вы спрашиваете, могут быть связаны с историческими особенностями или ограничениями OpenGL или Direct 3D, но я не достаточно знаком с этим, чтобы сказать наверняка.