Урок 19: constant memory и registers
Два быстрых вида памяти находятся на двух концах иерархии. На одном конце — registers: самая быстрая память, приватная для каждого thread. Любая простая локальная переменная внутри kernel (например, аккумулятор sum) живёт в register, и обращение к ней почти бесплатно. Но количество registers на SM о
register — это личный блокнот в кармане каждого работника — самый быстрый, но если записать в него слишком много, придётся хранить страницы на далёком складе (это и есть spilling). Constant memory — это одна доска объявлений, с которой читают все: если все смотрят на одно и то же объявление, его можно прочитать вслух один раз для всех.
- registers
- Самая быстрая память, приватная для каждого thread. Простые локальные переменные живут здесь. Их количество ограничено на каждый SM.
- register spilling
- Когда kernel нужно больше registers, чем доступно, излишек хранится в local memory, которая находится в медленной global DRAM — это штраф к производительности.
- constant memory
- Небольшая область (64KB), доступная только для чтения из kernel, объявляемая через __constant__ и записываемая с host. У неё есть выделенный cache.
- broadcast из constant
- Когда все threads в warp читают одно и то же значение из constant memory, чтение транслируется (broadcast) из cache за один шаг — так же быстро, как register.