Каковы времена жизни постоянной памяти CUDA?

У меня возникли проблемы с тем, чтобы обернуть голову вокруг ограничений на постоянную память CUDA.

  1. Почему мы не можем выделить __constant__ память во время выполнения? Почему мне нужно скомпилировать переменную фиксированного размера с почти глобальной областью действия?
  2. Когда постоянная память фактически загружена или выгружена? Я это понимаю cudaMemcpytoSymbol используется для загрузки определенного массива, но использует ли каждое ядро ​​свое распределение постоянной памяти? Связано, есть ли стоимость связывания и отмены привязки, аналогичная старой стоимости связывания текстур (иначе говоря, использование текстур добавляло стоимость к каждому вызову ядра)?

  3. Где находится постоянная память на чипе?

CUDA Архитектура

Меня в первую очередь интересуют ответы, поскольку они касаются Паскаля и Вольты.

1 ответ

Решение

Вероятно, проще всего ответить на эти шесть вопросов в обратном порядке:

Где находится постоянная память на чипе?

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

Есть ли стоимость связывания и отмены привязки, аналогичная старой стоимости связывания текстур (иначе говоря, использование текстур добавляло стоимость к каждому вызову ядра)?

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

Я это понимаю cudaMemcpytoSymbol используется для загрузки определенного массива, но использует ли каждое ядро ​​свое распределение постоянной памяти?

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

Когда постоянная память фактически загружена или выгружена?

Это зависит от того, что вы подразумеваете под "загружен" и "выгружен". Загрузка на самом деле является двухфазным процессом - во-первых, получить символ и загрузить его в контекст (если вы используете API времени выполнения, это выполняется автоматически), а во-вторых, любые пользовательские операции времени выполнения, чтобы изменить содержимое постоянной памяти с помощью cudaMemcpytoSymbol,

Почему мне нужно скомпилировать переменную фиксированного размера с почти глобальной областью действия?

Как уже отмечалось, постоянная память - это в основном логическое адресное пространство в иерархии памяти PTX, которое отражается зарезервированной областью конечного размера карты DRAM GPU и требует от компилятора одинакового доступа к определенным инструкциям через выделенный на кеше кеш или кэши. Учитывая его статическую природу анализа, основанного на анализе компилятора, имеет смысл, что его реализация на языке также будет в основном статической.

Почему мы не можем выделить __constant__ память во время выполнения?

Прежде всего потому, что NVIDIA решила не выставлять это. Но учитывая все ограничения, изложенные выше, я не думаю, что это ужасно плохой выбор. Отчасти это может быть историческим, поскольку постоянная память была частью дизайна CUDA с самого начала. Почти все оригинальные функции и возможности в дизайне CUDA соответствуют аппаратным функциям, которые существовали для первой цели оборудования, а именно для графических API-интерфейсов, которые предназначены для поддержки графических процессоров. Поэтому некоторые из того, о чем вы спрашиваете, могут быть связаны с историческими особенностями или ограничениями OpenGL или Direct 3D, но я не достаточно знаком с этим, чтобы сказать наверняка.

Другие вопросы по тегам