Понимание кэша CPU и строки кэша

Я пытаюсь понять, как работает кэш процессора. Допустим, у нас есть эта конфигурация (в качестве примера).

  • размер кэша 1024 байт
  • строка кэша 32 байта
  • 1024/32 = 32 строки кэша все вместе.
  • строка кэша Singel может хранить 32/4 = 8 дюймов.

1) в соответствии с этими конфигурациями длина тега должна быть 32-5=27 бит, а размер индекса 5 бит (2^5 = 32 адреса для каждого байта в кэше линия.)

если общий размер кэша составляет 1024 и есть 32 строки кэша, где хранятся теги + индексы? (Есть еще 4*32 = 128 байт.) Это означает, что фактический размер кэша 1024+128 = 1152?

2) если строка кэша составляет 32 байта в этом примере, это означает, что 32 байта копируются в кэш, когда CPU необходимо получить новый байт из ОЗУ. Правильно ли я предполагаю, что позиция строки кэша запрашиваемого байта будет определяться его адресом?

вот что я имею в виду: если CPU запросил байт в [FF FF 00 08], тогда доступная строка кэша будет заполнена байтами из [FF FF 00 00] to [FF FF 00 1F]. И наш requseted одиночный байт будет на позиции [08].

3) Если предыдущий оператор верен, означает ли это, что 5 бит, которые использовались для индекса, технически не нужны, так как все 32 байта находятся в строке кэша в любом случае?

пожалуйста, дайте мне знать, если я что-то не так. Спасибо

3 ответов


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

1) Да, теги занимают дополнительное пространство. Это часть компромисса дизайна - вы не хотите, чтобы это была большая часть общей площади, и почему размер строки не просто 1 байт или 1 слово. Кроме того, все теги индекс одновременно доступны, и это может повлиять на эффективность и макет, если есть большое количество способов. Размер немного больше, чем вы предполагаете. Обычно есть также несколько битов дополнительных битов, чтобы отметить действительность, а иногда и намеки. Больше способов и меньших строк требует большей доли, занимаемой тегами, поэтому обычно строки большие (32+ байта), а способы маленькие (4-16).

2) Да. Некоторые кэши также выполняют" критическое слово сначала", где они начинаются со слова, которое вызвало строка заполняется, а затем принести остальное. Это уменьшает количество циклов, в течение которых процессор ожидает данные, которые он фактически запросил. Некоторые кэши будут "писать через" и не выделять строку, если вы пропустите запись, что позволяет избежать необходимости сначала читать всю строку кэша, прежде чем писать в нее (это не всегда победа).

3) теги не будут хранить более низкие 5 бит, поскольку они не нужны для соответствия строке кэша. Они просто индексируются в отдельные строки.

Википедия имеет довольно хороший, если немного интенсивная, запись на кэши:http://en.wikipedia.org/wiki/CPU_cache - см. раздел "реализация". Существует схема разделения данных и тегов. Я думаю, что все должны научиться этому, потому что вы действительно можете улучшить производительность кода, когда знаете, на что способна базовая машина.


  1. метаданные кэша обычно не учитываются как часть самого кэша. Он может даже не храниться в той же части процессора (он может быть в другом кэше, реализованном с использованием специальных регистров процессора и т. д.).
  2. Это зависит от того, будет ли ваш процессор получать несогласованные адреса. Если он будет извлекать только выровненные адреса, то приведенный вами пример будет правильным. Если CPU извлекает несогласованные адреса, то он может получить диапазон 0xFFFF0008 для 0xFFFF0027.
  3. байты индекса по-прежнему полезны, даже если доступ к кэшу выровнен. Это дает процессору метод стенографии для ссылки на байт в строке кэша, который он может использовать во внутренней бухгалтерии. Вы можете получить ту же информацию, зная адрес, связанный с линией кэша, и адрес, связанный с байтом, но это намного больше информации для переноса.

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


это основано на моей смутной памяти, вы должны прочитать такие книги, как "компьютерная архитектура: количественный подход" Хеннесси и Паттерсона. Великая книга.

предполагая 32-разрядный процессор... (в противном случае ваши цифры должны были бы использовать >4 байта (возможно,

1) я считаю, что это по крайней мере 4*32 байта. В зависимости от процессора, архитекторы чипов, возможно, решили отслеживать другие информация помимо полного адреса. Но обычно это не считается частью кэша.

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