Понятие «размер блока» в кеше - PullRequest
10 голосов
/ 13 ноября 2011

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

Предположим, что адреса имеют длину 32 бита, и у меня есть кэш 32 КБ с размером блока 64 байт и 512 кадрами, сколько данных на самом деле хранится внутри «блока»?Если у меня есть инструкция, которая загружается из значения из ячейки памяти, и если это значение является 16-разрядным целым числом, это то, что один из блоков 64Byte теперь хранит только 16-разрядное (2Byte) целое значение.Что из других 62 байтов в блоке?Если у меня теперь есть другая инструкция загрузки, которая также загружает 16-битное целочисленное значение, это значение теперь переходит в другой блок другого кадра в зависимости от адреса загрузки (если адрес отображается на тот же кадр предыдущей инструкции, то предыдущее значение выселяетсяи блок снова хранит только 2 байта в 64 байтах).Правильный?

Пожалуйста, прости меня, если это кажется очень глупым сомнением, просто я хочу правильно сформулировать свои концепции.

Ответы [ 2 ]

27 голосов
/ 13 ноября 2011

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

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

Допустим, вам нужен кэш объемом 1 МБ (2 20 байт).

Что ты делаешь?

У вас есть 2 ограничения, которые вы должны выполнить:

  1. Кэширование должно быть как одинаковым , насколько это возможно, по всем адресам. то есть вы не хотите склоняться к какому-либо конкретному виду адреса.
    • Как ты это делаешь? Используйте остаток! С модом вы можете равномерно распределить любое целое число в любом диапазоне.
  2. Вы хотите помочь минимизировать бухгалтерские расходы. Это означает, например, если вы кешируете блоки по 1 байту, вам не нужно хранить 4 байта данных, чтобы отслеживать, где находится 1 байт.
    • Как ты это делаешь? Вы храните блоки, размер которых превышает 1 байт.

Допустим, вы выбрали 16-байтовые (2 4 -байтовые) блоки. Это означает, что вы можете кэшировать 2 20 / 2 4 = 2 16 = 65 536 блоков данных.

Теперь у вас есть несколько вариантов:

  • Вы можете спроектировать кеш так, чтобы данные из любого блока памяти могли храниться в любых блоков кеша. Это можно назвать полностью ассоциативным кэшем.
  • Преимущество заключается в том, что это «самый справедливый» тип кэша: все блоки обрабатываются абсолютно одинаково.
  • Компромисс - скорость: чтобы найти, куда поместить блок памяти, вы должны искать каждый блок кэша на наличие свободного места. Это действительно медленно.
  • Вы можете спроектировать кэш так, чтобы данные из любого блока памяти могли только храниться в одном блоке кэша. Это будет называться кешем с прямым отображением.
  • Преимущество заключается в том, что это самый быстрый вид кэша: вы делаете только 1 проверку, чтобы увидеть, находится ли элемент в кэше или нет.
  • Компромисс заключается в том, что теперь, если вам случается иметь неправильный шаблон доступа к памяти, вы можете иметь 2 блока, последовательно выбивающих друг друга, при этом неиспользуемые блоки все еще остаются в кэше.
  • Вы можете сделать смесь обоих: отобразить один блок памяти на несколько блоков. Это то, что делают настоящие процессоры - они имеют N-образный набор ассоциативных кэшей.

Кэш прямого отображения:

Теперь у вас есть 65 536 блоков данных, каждый блок состоит из 16 байтов.
Вы храните его как 65 536 «строк» ​​внутри своего кэша, причем каждая «строка» состоит из самих данных и метаданных (относительно того, где находится блок, является ли он действительным, был ли он записан и т. Д.).

Вопрос: Как каждый блок в памяти отображается на каждый блок в кэше?

Ответ: Ну, вы используете кэш с прямым отображением, используя мод. Это означает, что адреса от 0 до 15 будут отображаться в блоке 0 в кеше; 16-31 сопоставляются с блоком 2 и т. Д., И он приближается к отметке 1 МБ.

Итак, учитывая адрес памяти M, как найти номер строки N? Легко: N = M% 2 20 / 2 4 .
Но это говорит только о том, где хранить данных, а не как извлекать данных. После того, как вы сохранили его и попытаетесь получить к нему доступ снова, вы должны знать , какая 1-МБ часть памяти была сохранена здесь, верно?

Так что это одна часть метаданных: биты тега. Если он находится в строке N, все, что вам нужно знать, это то, что было частным во время работы мода. Что для 32-разрядного адреса составляет 12 бит (поскольку остаток составляет 20 бит).

Таким образом, ваш тег становится длиной 12 бит - в частности, самый верхний 12 бит любого адреса памяти.
И вы уже знали, что самые младшие 4 бита используются для смещения в пределах блока (поскольку память имеет байтовый адрес, а блок имеет 16 байтов).
То есть 16 битов для индекса "msgstr "биты адреса памяти, которые можно использовать для поиска , к которой строка принадлежит адресу.(Это просто операция деления + остатка, но в двоичном виде.)

Вам также нужны другие биты: например, вам нужно знать, является ли блок действительным или нет, потому что, когда процессор включен, онсодержит неверные данные.Таким образом, вы добавляете 1 бит метаданных: действительный бит.

Есть другие биты, о которых вы узнаете, которые используются для оптимизации, синхронизации и т. Д., Но это основные.:)

5 голосов
/ 13 ноября 2011

Я предполагаю, что вы знакомы с основами тегов, индексов и смещений, но вот краткое объяснение, которое я узнал на уроках компьютерной архитектуры.Блоки заменяются 64-байтовыми блоками, поэтому каждый раз, когда новый блок помещается в кэш, он заменяет все 64 байта независимо от того, нужен ли вам только один байт.Вот почему при обращении к кешу есть смещение, которое определяет байт, который вы хотите получить из блока.Возьмем, к примеру, если загружается только 16-битное целое число, кэш будет искать блок по индексу, проверять тег, чтобы убедиться в правильности данных, а затем получать байт в соответствии со смещением.Теперь, если вы загрузите другое 16-битное значение, скажем, с тем же индексом, но с другим тегом, он заменит 64-байтовый блок новым блоком и получит информацию из указанного смещения.(при условии прямого сопоставления)

Надеюсь, это поможет!Если вам нужна дополнительная информация, или это все еще нечетко, дайте мне знать, я знаю пару хороших сайтов, которые хорошо учат этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...