Некоторые наборы инструкций процессора, такие как x86, поддерживают хранение полноразмерных констант в качестве операндов, чередующихся с самими кодами операций. В этом случае константы, очевидно, считываются с остальной частью потока инструкций, которые запускаются ЦП, и кажется маловероятным, что их хранение в другом месте может быть быстрее.
Другие архитектуры, такие как ARM, поддерживают сохранение небольших констант и значений сдвига в кодах операций. Большинство констант, которые обычно необходимы в программе, могут быть представлены как небольшая константа плюс значение сдвига и поэтому могут храниться непосредственно внутри кодов операций.
Я не знаю, поддерживает ли SASS (собственный набор инструкций для графических процессоров NVIDIA) такие «встроенные» константы.
Учтите, что если вы храните константу в разделяемой памяти, вам нужно будет ссылаться на эту константу, и ссылка сама будет константой или будет получена из константы (такой как базовый адрес).
Кроме того, существует кеш для значений, которые обозначаются как константы. Вы можете воспользоваться этим кешем, установив значения в постоянной памяти перед вызовом ядра.
Кроме того, рассмотрите накладные расходы, связанные с настройкой константы в общей памяти в первую очередь. Значения в общей памяти могут использоваться только совместно с потоками в блоке, поэтому каждый блок должен будет снова установить константу. Поскольку потоки выполняются группами из 32, называемыми перекосами, ядро связывает 32 потока при настройке константы, каждый раз обработка начинается с нового блока.
В заключение я считаю, что лучше всего позволить компилятору обрабатывать одиночные константы, такие как один в вашем примере, и использовать постоянную память для хранения любых постоянных массивов, которые у вас могут быть.
Различные наборы инструкций GPU обеспечивают непосредственные значения, которые должны быть закодированы в некоторых инструкциях, как для целых, так и для инструкций с плавающей запятой. Компилятор воспользуется этим для компиляции констант времени, где это возможно. Если константа не может быть встроена в инструкцию, компилятор может поместить ее в один из постоянных банков, и эти данные могут быть кэшированы постоянным кешем, который имеет функцию широковещания для одновременного предоставления всех trheads в основе с одинаковой константой , Поэтому для отдельных констант можно просто положиться на компилятор. – njuffa