Второй способ - единственный способ убедиться, что массив скомпилирован в постоянную память CUDA и правильно доступен через кэш постоянной памяти.Но вы должны спросить себя, как будет осуществляться доступ к содержимому этого массива в блоке потоков.Если каждый поток будет обращаться к массиву равномерно, то будет иметь преимущество в производительности при использовании постоянной памяти, потому что есть механизм широковещания из кеша постоянной памяти (он также экономит пропускную способность глобальной памяти, потому что постоянная память хранится в оперативной памяти DRAM и кешеуменьшает количество транзакций DRAM).Но если доступ случайный, то может произойти сериализация доступа к локальной памяти, что отрицательно скажется на производительности.
Типичными вещами, которые могут подходить для памяти __constant__
, могут быть коэффициенты модели, веса и другие постоянные значения, которые необходимо установить во время выполнения.Например, на графических процессорах Fermi список аргументов ядра хранится в постоянной памяти.Но если доступ к содержимому осуществляется неравномерно, а тип или размер членов не постоянен от вызова к вызову, тогда предпочтительна обычная глобальная память.
Также имейте в виду, что существует ограничение в 64 КБ постоянной памяти на контекст GPU, поэтому нецелесообразно хранить очень большие объемы данных в постоянной памяти.Если вам нужно много доступного только для чтения хранилища с кешем, возможно, стоит попробовать привязать данные к текстуре и посмотреть, какова производительность.На картах pre-Fermi это обычно дает удобный выигрыш в производительности, на Fermi результаты могут быть менее предсказуемыми по сравнению с глобальной памятью из-за улучшенной структуры кэша в этой архитектуре.