Размер строки кешей L1 и L2

Из предыдущего question на этом форуме я узнал, что в большинстве систем памяти кеш L1 является подмножеством кэша L2, при этом любая запись удаляется из L2 также удаляется из L1.

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

Действительно ли архитектура действительно беспокоит очистку обеих строк или просто поддерживает кеши L1 и L2 с одинаковым размером строки.

Я понимаю, что это политическое решение, но я хочу знать часто используемую технику.

Ответы

Ответ 1

В ядре i7 размеры строк в L1, L2 и L3 одинаковы: это 64 байта. Я предполагаю, что это упрощает сохранение инклюзивного свойства и согласованности.

См. стр. 28 из: https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf

Ответ 2

Размер Cache-Lines составляет (обычно) 64 байта.

Кроме того, взгляните на эту очень интересную статью о кэшах процессоров: Галерея эффектов кэш-памяти процессора

Вы найдете следующие главы:

  • Доступ к памяти и производительность
  • Влияние строк кэша
  • Размер кэша L1 и L2
  • Уровень уровня parallelism
  • Ассоциативность кэша
  • Ложное разделение кеша
  • Аппаратные сложности

Ответ 3

Наиболее распространенным методом обработки размера блока кэша в строго инклюзивной иерархии кэшей является использование блоков кеша одинакового размера для всех уровней кеша, для которых применяется свойство включения. Это приводит к увеличению накладных расходов на тег, чем при использовании кэша более высокого уровня для больших блоков, который не только использует область чипов, но также может увеличить задержку, поскольку кэши высокого уровня обычно используют поэтапный доступ (где теги проверяются до доступа к части данных). Тем не менее, это также несколько упрощает конструкцию и уменьшает потраченную мощность из неиспользуемых частей данных. В 128-байтных кеш-блоках не требуется значительная часть неиспользуемых 64-байтовых блоков, чтобы компенсировать штраф в размере дополнительного 32-битного тега. Кроме того, эффект более крупного кеш-кода при использовании более широкой пространственной локальности может быть обеспечен относительно простой предварительной выборкой, которая имеет преимущества, заключающиеся в том, что емкость не остается неиспользованной, если соседний фрагмент не загружен (чтобы сохранить полосу пропускания памяти или уменьшить задержку в конфликтующей памяти read) и что предварительная выборка смежности не должна ограничиваться более крупным выровненным фрагментом.

Менее распространенный метод делит блок кэша на сектора. Если размер сектора такой же, как размер блока для кэшей более низкого уровня, избегает проблемы избыточной обратной аннулированности, поскольку каждый сектор в кэше более высокого уровня имеет свой собственный действительный бит. (Предоставление всех метаданных состояния согласования для каждого сектора, а не просто действительность, может избежать использования чрезмерной полосы пропускания обратной связи, когда по крайней мере один сектор в блоке не загрязнен/изменен и некоторые служебные данные согласования (например, если один сектор находится в состоянии совместного доступа, а другой - в исключительном состоянии запись в сектор в исключительном состоянии может не включать в себя когерентный трафик, если используется сплетение, а не когерентность каталогов].)

Экономия площади от секционированных блоков кэша была особенно значительна, когда теги находились на чипе процессора, но данные были вне чипа. Очевидно, что если хранилище данных занимает площадь, сопоставимую с размером процессорного чипа (что не является необоснованным), тогда 32-разрядные теги с 64-байтовыми блоками занимают примерно 16-е (~ 6%) от площади процессора, а 128- байтовые блоки занимали бы половину. (IBM POWER6 +, представленный в 2009 году, является, пожалуй, самым последним процессором для использования тегов на процессорах и данных без процессора. Хранение данных в DRAM с более высокой плотностью и теги в SRAM с более высокой плотностью, как это сделала IBM, преувеличивает этот эффект.)

Следует отметить, что Intel использует "линию кэша" для обозначения меньшего блока и "сектора кеша" для большей единицы. (Это одна из причин, почему я использовал "кеш-блок" в своих объяснениях.) Использование терминологии Intel было бы очень необычно для строк кэша, чтобы они отличались по размеру среди уровней кеша, независимо от того, были ли уровни строго инклюзивными, строго эксклюзивными или использовались некоторые другие политики включения.

(Строгое исключение обычно использует кеш более высокого уровня в качестве кэша-жертвы, в котором выселения из кэша более низкого уровня вставляются в кеш более высокого уровня. Очевидно, что если размеры блоков были разными и секторность не использовалась, то для выселения потребуется остальная часть более крупного блока должна быть прочитана где-то и недействительна, если она присутствует в кэше нижнего уровня. [Теоретически строгое исключение можно использовать с негибким кэшем в обход, где выселение L1 будет обходить L2 и перейти к промахам кэша L3 и L1/L2 будет только выделен либо L1, либо L2, минуя L1 для определенных доступов. Наиболее близким к этому, который я знаю, является отказ Itanium от L1 для доступа с плавающей точкой, однако, если я правильно помню, L2 включал L1.])

Ответ 4

Как правило, при одном доступе к основной памяти осуществляется доступ к 64 байтам данных и 8 байтам четности /ECC (я не помню, какой именно). И довольно сложно поддерживать разные размеры линий кэша на разных уровнях памяти. Вы должны заметить, что размер строки кеша будет больше соответствовать размеру выравнивания слов в этой архитектуре, чем что-либо еще. Исходя из этого, размер строки кэша вряд ли будет отличаться от размера доступа к памяти. Теперь биты четности предназначены для использования контроллера памяти, поэтому размер строки кэша обычно составляет 64 байта. Процессор действительно очень мало контролирует регистры. Все, что происходит в компьютере, - это больше о том, как получить аппаратное обеспечение для оптимизации производительности процессора. В этом смысле также действительно бессмысленно импортировать дополнительную сложность, делая размеры строк в кешках разными на разных уровнях памяти.