В CUDA я считаю, что лучшей рекомендацией будет использование так называемого кэша «только для чтения». Это имеет как минимум два возможных преимущества по сравнению с системой __constant__
память / постоянный кеш:
- Не ограничивается 64 КБ, как
__constant__
Память.
- Он не ожидает и не требует «единообразного доступа», как это делает константный кеш, для обеспечения полной пропускной способности доступа / наилучшей производительности. Равномерный доступ относится к идее, что все потоки в деформации получают доступ к одному и тому же местоположению или одному и тому же постоянному значению памяти (за цикл чтения / инструкцию).
Кэш только для чтения описан в Руководстве по программированию CUDA . Возможно, самый простой способ его использования - украсить ваши указатели , переданные ядру CUDA, с помощью __restrict__
(при условии, что вы не совмещаете указатели ) и украсить указатель, который ссылается на большие постоянные данные с const ... __restrict__
. Это позволит компилятору генерировать соответствующие инструкции LDG для доступа к постоянным данным, вытягивая их через механизм кэширования только для чтения.
Этот механизм кэширования только для чтения поддерживается только на графических процессорах cc 3.5 или выше, но он охватывает некоторые графические процессоры поколения Kepler и все графические процессоры Maxwell, Pascal (включая GTX 1080 ti), Volta и Turing.
Если у вас графический процессор меньше чем cc3.5, возможно, лучшее предложение для аналогичных преимуществ (больше, чем __const__
, не требующее единообразного доступа) тогда будет использовать текстурную память. Это также задокументировано в другом месте в руководстве по программированию, есть различные примеры кодов CUDA, которые демонстрируют использование памяти текстур, и множество вопросов здесь по тегу SO cuda
, охватывающему это.