2012-06-11 2 views
2

есть ли какое-либо преимущество в сохранении постоянного значения в общей памяти? например:общая память и константы

A[tid] = CONSTANT * B[tid],

где А и В являются массивами, КОНСТАНТА является постоянным значением, например, 4. и tid - индекс потока (элемент массива = одиночный поток).

Каждый поток должен читать значение CONSTANT, поэтому общая память должна быть полезна, не так ли?

Как я думаю, это работает: Чтение из глобальной памяти занимает много времени, поэтому читайте значение constatnt из глобальной памяти один раз в общую память, а затем потоки могут быстро ее прочитать. так как существует много потоков (постоянное значение должно быть прочитано много раз), то общая память должна ускорить его.

ответ

4

Некоторые наборы инструкций процессора, такие как x86, поддерживают хранение полноразмерных констант в качестве операндов, чередующихся с самими кодами операций. В этом случае константы, очевидно, считываются с остальной частью потока инструкций, которые запускаются ЦП, и кажется маловероятным, что их хранение в другом месте может быть быстрее.

Другие архитектуры, такие как ARM, поддерживают сохранение небольших констант и значений сдвига в кодах операций. Большинство констант, которые обычно необходимы в программе, могут быть представлены как небольшая константа плюс значение сдвига и поэтому могут храниться непосредственно внутри кодов операций.

Я не знаю, поддерживает ли SASS (собственный набор инструкций для графических процессоров NVIDIA) такие «встроенные» константы.

Учтите, что если вы храните константу в разделяемой памяти, вам нужно будет ссылаться на эту константу, и ссылка сама будет константой или будет получена из константы (такой как базовый адрес).

Кроме того, существует кеш для значений, которые обозначаются как константы. Вы можете воспользоваться этим кешем, установив значения в постоянной памяти перед вызовом ядра.

Кроме того, рассмотрите накладные расходы, связанные с настройкой константы в общей памяти в первую очередь. Значения в общей памяти могут использоваться только совместно с потоками в блоке, поэтому каждый блок должен будет снова установить константу. Поскольку потоки выполняются группами из 32, называемыми перекосами, ядро ​​связывает 32 потока при настройке константы, каждый раз обработка начинается с нового блока.

В заключение я считаю, что лучше всего позволить компилятору обрабатывать одиночные константы, такие как один в вашем примере, и использовать постоянную память для хранения любых постоянных массивов, которые у вас могут быть.

+4

Различные наборы инструкций GPU обеспечивают непосредственные значения, которые должны быть закодированы в некоторых инструкциях, как для целых, так и для инструкций с плавающей запятой. Компилятор воспользуется этим для компиляции констант времени, где это возможно. Если константа не может быть встроена в инструкцию, компилятор может поместить ее в один из постоянных банков, и эти данные могут быть кэшированы постоянным кешем, который имеет функцию широковещания для одновременного предоставления всех trheads в основе с одинаковой константой , Поэтому для отдельных констант можно просто положиться на компилятор. – njuffa

1

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

Смежные вопросы