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

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

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

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

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

4 Solutions collect form web for “Размер строки кешей L1 и L2”

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

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

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

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

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

  1. Доступ к памяти и производительность
  2. Влияние строк кэша
  3. Размер кеша L1 и L2
  4. Параллелизм на уровне инструкций
  5. Ассоциативность кэша
  6. Ложное совместное использование кеша
  7. Аппаратные сложности

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

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

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

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

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

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

  • Безопасно ли удалять указатель на пустоту?
  • Где постоянные переменные хранятся в C?
  • Размещение массива-new требует неопределенных накладных расходов в буфере?
  • Что же случилось с использованием GC.Collect ()?
  • Как узнать, указывает ли указатель на кучу или стек?
  • Мусорный коллектор MATLAB?
  • std :: вектор и непрерывная память многомерных массивов
  • Динамическое распределение массива объектов
  • Как работает механизм сбора мусора?
  • Проверьте, указывает ли указатель на выделенную память в куче
  • Как динамически распределять пространство памяти для строки и получать эту строку от пользователя?
  • Давайте будем гением компьютера.