Понятие размера блока в кеше

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

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

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


person hektor    schedule 12.11.2011    source источник


Ответы (2)


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

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

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

Что вы делаете?

У вас есть 2 ограничения, которые необходимо соблюдать:

  1. Caching should be as uniform as possible across all addresses. i.e. you don't want to bias toward any particular kind of address.
    • How do you do this? Use remainder! With mod, you can evenly distribute any integer over whatever range you want.
  2. You want to help minimize bookkeeping costs. That means e.g. if you're caching in blocks of 1 byte, you don't want to store 4 bytes of data just to keep track of where 1 byte belongs to.
    • How do you do that? You store blocks that are bigger than just 1 byte.

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

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

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

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

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

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

Ответ: Ну, вы используете кеш с прямым отображением, используя mod. Это означает, что адреса от 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 бит для "индексных" битов адреса памяти, которые можно использовать для поиска , который строка, которой принадлежит адрес. (Это просто операция деления + остатка, но в двоичном формате.)

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

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

person user541686    schedule 12.11.2011
comment
что лучше с точки зрения эффективности: больший или меньший размер блока? - person Faizan; 23.04.2013
comment
@Faizan: Это зависит от множества факторов, включая пропускную способность вашей памяти. Меньшие размеры блоков дают вам более тонкую детализацию (что лучше) при более высоких затратах ($) и при потенциально меньшей пропускной способности ОЗУ. Нет однозначного ответа. - person user541686; 23.04.2013
comment
@Mehrdad Когда вы говорите, что для обнаружения блока кеша, в котором будет отображен блок памяти, вы говорите, что это M (адрес памяти), mod S (размер кеша), но таким образом адрес 0 будет сопоставлен с блоком 0, а адрес 1 будет сопоставлен с блоком 1 и т. д. Кроме того, в вашем примере в кеше будет 2 ^ 20 блоков, что неверно. Или я что-то упускаю? - person Joaquim Ferrer; 06.06.2016
comment
@JoaquimFerrer: Ух ты, 5 лет, и я не могу поверить, что никто до сих пор не указал на опечатку. Думаю, я исправил это, не могли бы вы еще раз проверить, чтобы убедиться? Спасибо, что дал мне знать! - person user541686; 06.06.2016
comment
@Mehrad, я новичок в этом, но я думаю, что вы все еще ошибаетесь, потому что в этом случае кеш будет иметь 2 ^ 4 блока. Я думаю, что это модельное количество блоков M / block size. M / block - это номер блока, и мод помещает его в допустимый диапазон. - person Joaquim Ferrer; 07.06.2016
comment
@Mehrad Между прочим, это волшебство stackoverlfow! Даже через 5 лет ваш ответ был невероятно полезным. - person Joaquim Ferrer; 07.06.2016
comment
@JoaquimFerrer: Ха-ха, спасибо! Но хм, я думаю, это правильно? M% 2 ^ 20 дает вам индекс байта в кеше. Итак, если вы разделите это на 2 ^ 4, это даст вам индекс блока, верно? Например, если M% 2 ^ 20 дает 17, это означает, что вам нужно посмотреть блок 17/16 = 1. Или я что-то упустил? - person user541686; 07.06.2016
comment
@Mehrad Да, ты прав! Спасибо и вам за ответ! - person Joaquim Ferrer; 07.06.2016
comment
Привет, @Mehrdad, действительно хорошее объяснение, большое спасибо. Но во втором пункте вы говорите, что не хотите хранить 4 байта данных только для того, чтобы отслеживать, кому принадлежит 1 байт. Кеш просто работает с 4-х байтовыми адресами, верно? Он хранит только данные, а не адреса, верно? И, кстати, в ОЗУ, разве мы не используем 4 байта данных (32-битные адреса) для хранения 1 байта данных? - person nj2237; 04.07.2018
comment
@ nj2237: в кеше также должен храниться адрес памяти, иначе как он узнает, находится ли содержимое памяти по определенному адресу в кеше? Недостаточно кеша для сопоставления каждого блока памяти с другим блоком кеша. Что касается RAM, ну да, но вы не обязательно храните эти адреса для каждого байта RAM. Вы сохраняете только те адреса, которые вам нужны (например, начало большого массива). - person user541686; 04.07.2018
comment
Ах да, в этом есть смысл .. спасибо! Так это были бы метаданные, верно? Процесс, скажем, в DMC, когда ЦП пытается извлечь данные из хранилища, он берет индексную часть адреса памяти (средние 16 бит), чтобы увидеть, к какой строке или блоку он принадлежит, а затем сравнивает тег (верхние 12 бит) в метаданных данных (в кеше) к теговой части адреса памяти, и если они равны, то это попадание в кеш, правильно? И хороших моментов в отношении оперативной памяти я не знал. Спасибо! - person nj2237; 05.07.2018
comment
@ nj2237: Да, похоже, ты понял. - person user541686; 05.07.2018
comment
Есть ли у блока метаданные + официальное название? Мой текущий блок понимания означает только часть данных, и каждый набор кеша (строка в вашем ответе) может содержать много блоков, каждый со своими собственными метаданными, но я действительно хочу знать, как вызвать блок метаданных + ... - person Kindred; 09.01.2019
comment
Я слышал, как люди говорили о блоке кеша, что означает метаданные + __ block__, но, говоря о размере блока кеша, я слышал, как некоторые другие люди говорили, что это размер блока, это так расплывчато .... - person Kindred; 09.01.2019
comment
Означает ли это, что размер тега зависит от значения (а не от размера) адреса памяти? - person ryanwebjackson; 19.01.2020
comment
@ryanwebjackson: Не совсем, хотя размер адреса памяти и его значение связаны логарифмическим коэффициентом, так что я полагаю, вы могли бы сказать «да» и все равно быть правым. Но я думаю, вы, вероятно, в чем-то запутались - о какой именно части вы говорите? - person user541686; 19.01.2020
comment
В настоящее время я понимаю, что каждый блок кеша состоит из индекса, тега и кэшированных данных. Не знаю, как определить размер тега. Я вижу, что вы определяете размер в приведенном выше примере, но я не уверен, как это сделать. - person ryanwebjackson; 19.01.2020
comment
@ryanwebjackson: Понятно. Биты в теге - это дополнительные биты информации, необходимые для определения источника значения. Может быть, это легко увидеть, если предположить, что тега вообще не существует: у вас есть значение в строке 5; с какого адреса памяти он пришел? Ну, это могло произойти с адреса 5, адреса 5 + 2 ^ 20, адреса 5 + 2 × 2 ^ 20, адреса 5 + 3 × 2 ^ 20, ..., вплоть до адреса 5 + 2 ^ ( 12-1) × 2 ^ 20. Неизвестным здесь является коэффициент 2 ^ 20. Сколько битов вам нужно, чтобы представить это неизвестное? 12 битов, которые соответствуют 12 старшим битам адреса. Имеет ли это смысл? - person user541686; 19.01.2020
comment
К сожалению, пока не для меня. Знаете ли вы хороший справочник по формулам? Я хочу понять, но не хочу здесь комментировать. Спасибо. - person ryanwebjackson; 19.01.2020
comment
@ryanwebjackson: Эти слайды могут быть полезны? Хотя трудно сказать, я лично не знаю никаких источников (я просто погуглил, чтобы найти этот). Вы можете продолжать задавать мне вопросы, если хотите, я не возражаю. - person user541686; 19.01.2020
comment
Спасибо. Я рассмотрю их и попытаюсь задать более подробный вопрос, если я все еще не понимаю концепции и формулы. - person ryanwebjackson; 19.01.2020
comment
@ryanwebjackson: Хорошо, конечно! - person user541686; 19.01.2020

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

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

person GSilva    schedule 12.11.2011
comment
да, это помогает .. но, пожалуйста, дайте мне и другие сайты для дополнительного чтения .. в любом случае спасибо - person hektor; 13.11.2011
comment
@hektor Просмотрите эту ссылку, она действительно хороша для память и разные техники замены, и тот, который мне больше всего помог. У него даже есть интерактивные java-модули. - person GSilva; 13.11.2011