Политики размещения кэша — это политики, которые определяют, где конкретный блок памяти может быть помещен при его переходе в кэш ЦП . Блок памяти не обязательно может быть помещен в произвольное место в кэше; он может быть ограничен определенной строкой кэша или набором строк кэша [1] политикой размещения кэша. [2] [3]
Для размещения блока памяти в кэше доступны три различные политики: прямое отображение, полностью ассоциативное и наборно-ассоциативное. Первоначально это пространство организаций кэша описывалось с использованием термина «отображение конгруэнтности». [4]
В структуре кэша с прямым отображением кэш организован в несколько наборов [1] с одной строкой кэша на набор. На основе адреса блока памяти он может занимать только одну строку кэша. Кэш может быть представлен в виде матрицы столбцов n × 1. [5]
Рассмотрим основную память объемом 16 килобайт, организованную в виде 4-байтовых блоков, и кэш с прямым отображением объемом 256 байт с размером блока 4 байта. Поскольку основная память имеет объем 16 килобайт, нам нужно минимум 14 бит для уникального представления адреса памяти.
Поскольку каждый блок кэша имеет размер 4 байта, общее количество наборов в кэше составляет 256/4, что равно 64 наборам.
Входящий адрес в кэш делится на биты для смещения , индекса и тега .
Ниже приведены адреса памяти и пояснения, к какой строке кэша они относятся:
0x0000
(тег - 0b00_0000
, индекс – 0b00_0000
, смещение – 0b00
) соответствует блоку 0 памяти и отображается на набор 0 кэша.0x0004
(тег - 0b00_0000
, индекс – 0b00_0001
, смещение – 0b00
) соответствует блоку 1 памяти и отображается на набор 1 кэша.0x00FF
(тег – 0b00_0000
, индекс – 0b11_1111
, смещение – 0b11
) соответствует блоку 63 памяти и отображается в набор 63 кэша.0x0100
(тег – 0b00_0001
, индекс – 0b00_0000
, смещение – 0b00
) соответствует блоку 64 памяти и отображается на набор 0 кэша.В полностью ассоциативном кэше кэш организован в единый набор кэшей с несколькими строками кэша. Блок памяти может занимать любую из строк кэша. Организация кэша может быть представлена в виде матрицы строк размером 1 × m . [5]
Рассмотрим основную память объемом 16 килобайт, организованную в виде 4-байтовых блоков, и полностью ассоциативный кэш объемом 256 байт и размером блока 4 байта. Поскольку основная память имеет объем 16 килобайт, нам нужно минимум 14 бит для уникального представления адреса памяти.
Общее количество наборов в кэше равно 1, и набор содержит 256/4=64 строки кэша, поскольку размер блока кэша составляет 4 байта.
Входящий адрес в кэш делится на биты для смещения и тега.
Поскольку любой блок памяти может быть сопоставлен с любой строкой кэша, блок памяти может занимать одну из строк кэша на основе политики замещения.
Ассоциативный кэш представляет собой компромисс между кэшем с прямым отображением и полностью ассоциативным кэшем.
Ассоциативный кэш можно представить как матрицу n × m . Кэш делится на 'n' наборов, и каждый набор содержит 'm' строк кэша. Блок памяти сначала отображается на набор, а затем помещается в любую строку кэша набора.
Диапазон кэшей от кэшей с прямым отображением до полностью ассоциативных представляет собой континуум уровней ассоциативности наборов. (Кэш с прямым отображением является однонаправленно ассоциативным набором, а полностью ассоциативный кэш с m строками кэша является m -направленно ассоциативным набором.)
Многие процессорные кэши в современных конструкциях являются либо кэшами с прямым отображением, либо двухсторонними наборно-ассоциативными, либо четырехсторонними наборно-ассоциативными. [5]
Рассмотрим основную память объемом 16 килобайт, организованную в виде 4-байтовых блоков, и 2-канальный ассоциативный кэш объемом 256 байт с размером блока 4 байта. Поскольку основная память имеет объем 16 килобайт, нам нужно минимум 14 бит для уникального представления адреса памяти.
Поскольку каждый блок кэша имеет размер 4 байта и является двухсторонним наборно-ассоциативным, общее количество наборов в кэше составляет 256/(4 * 2), что равно 32 наборам.
Входящий адрес в кэш делится на биты для смещения, индекса и тега.
Ниже приведены адреса памяти и пояснения того, к какой строке кэша в каком наборе они относятся:
0x0000
(тег - 0b000_0000
, индекс – 0b0_0000
, смещение – 0b00
) соответствует блоку 0 памяти и отображается в набор 0 кэша. Блок занимает строку кэша в наборе 0, определяемую политикой замены для кэша.0x0004
(тег - 0b000_0000
, индекс – 0b0_0001
, смещение – 0b00
) соответствует блоку 1 памяти и отображается в набор 1 кэша. Блок занимает строку кэша в наборе 1, определяемую политикой замены для кэша.0x00FF
(тег – 0b000_0001
, индекс – 0b1_1111
, смещение – 0b11
) соответствует блоку 63 памяти и отображается в набор 31 кэша. Блок занимает строку кэша в наборе 31, определяемую политикой замены для кэша.0x0100
(тег – 0b000_0010
, индекс – 0b0_0000
, смещение – 0b00
) соответствует блоку 64 памяти и отображается в набор 0 кэша. Блок занимает строку кэша в наборе 0, определяемую политикой замены для кэша.Были предложены и другие схемы, такие как перекошенный кэш , [8] где индекс для пути 0 является прямым, как указано выше, но индекс для пути 1 формируется с помощью хэш-функции . Хорошая хэш-функция обладает свойством, что адреса, которые конфликтуют с прямым отображением, как правило, не конфликтуют при отображении с помощью хэш-функции, и поэтому менее вероятно, что программа будет страдать от неожиданно большого количества промахов конфликта из-за патологического шаблона доступа. Недостатком является дополнительная задержка при вычислении хэш-функции. [9] Кроме того, когда приходит время загрузить новую строку и вытеснить старую строку, может быть сложно определить, какая из существующих строк использовалась реже всего, потому что новая строка конфликтует с данными в разных индексах в каждом пути; отслеживание LRU для неперекошенных кэшей обычно выполняется на основе набора. Тем не менее, перекошенные ассоциативные кэши имеют большие преимущества перед обычными наборно-ассоциативными. [10]
Настоящий ассоциативный кэш проверяет все возможные пути одновременно, используя что-то вроде адресуемой по содержимому памяти . Псевдоассоциативный кэш проверяет каждый возможный путь по одному за раз. Кэш хэш-рехэша и ассоциативный кэш столбцов являются примерами псевдоассоциативного кэша.
В общем случае нахождения попадания первым проверенным способом псевдоассоциативный кэш так же быстр, как и кэш с прямым отображением, но у него гораздо более низкий уровень промахов конфликтов, чем у кэша с прямым отображением, ближе к уровню промахов полностью ассоциативного кэша. [9]