Размер строки кэшей L1 и L2
Из предыдущего вопроса на этом форуме я узнал, что в большинстве систем памяти кэш L1 является подмножеством кэша L2, что означает, что любая запись, удаленная из L2, также удаляется из L1.
Итак, теперь мой вопрос заключается в том, как определить соответствующую запись в кэше L1 для записи в кэше L2. Единственная информация, хранящаяся в записи L2, - это информация тега. На основании этой информации тега, если я заново создаю адрес, он может занимать несколько строк в кэше L1, если размеры строк кэша L1 и L2 не совпадают.
Действительно ли архитектура беспокоит очистка обеих линий или она просто поддерживает кэш L1 и L2 с одинаковым размером строки.
Я понимаю, что это политическое решение, но я хочу знать наиболее часто используемую технику.
4 ответа
В ядре i7 размеры строк в L1, L2 и L3 одинаковы: это 64 байта. Я предполагаю, что это упрощает поддержание инклюзивного свойства и согласованности.
См. Стр. 28 из: https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf
Размер Cache-Lines составляет (обычно) 64 байта.
Кроме того, взгляните на эту очень интересную статью о кэшах процессоров: Галерея эффектов кэш-памяти процессоров
Вы найдете следующие главы:
- Доступ к памяти и производительность
- Влияние строк кэша
- Размеры кеша L1 и L2
- Параллелизм на уровне инструкций
- Ассоциативность кэша
- Ложное разделение строк кэша
- Аппаратные сложности
Наиболее распространенный метод обработки размера блока кеша в строго инклюзивной иерархии кеша заключается в использовании блоков кеша одинакового размера для всех уровней кеша, для которых применяется свойство включения. Это приводит к большей нагрузке на теги, чем если бы в кэше более высокого уровня использовались более крупные блоки, которые не только используют область микросхемы, но также могут увеличить задержку, поскольку кэши более высокого уровня обычно используют поэтапный доступ (где теги проверяются до доступа к части данных). Тем не менее, это также несколько упрощает дизайн и уменьшает потерянную емкость из-за неиспользованных частей данных. Не требуется большой доли неиспользованных 64-байтовых блоков в 128-байтовых блоках кэша, чтобы компенсировать штраф за область из-за дополнительного 32-битного тега. Кроме того, больший эффект блока кеша при использовании более широкой пространственной локальности может быть обеспечен за счет относительно простой предварительной выборки, которая имеет преимущества, заключающиеся в том, что ни одна емкость не остается неиспользованной, если соседний блок не загружен (для сохранения пропускной способности памяти или уменьшения задержки в конфликтующей памяти). читать) и что предварительная выборка смежности не должна быть ограничена большим выровненным фрагментом.
Менее распространенный метод делит блок кеша на сектора. Наличие размера сектора, равного размеру блока для кэшей более низкого уровня, позволяет избежать проблемы избыточной обратной недействительности, поскольку каждый сектор в кэше более высокого уровня имеет свой собственный действительный бит. (Предоставление всех метаданных состояния когерентности для каждого сектора, а не просто достоверность, позволяет избежать чрезмерного использования полосы пропускания обратной записи, когда, по крайней мере, один сектор в блоке не загрязнен / не изменен и некоторые издержки когерентности [например, если один сектор находится в общем состоянии, а другой - в монопольном состоянии запись в сектор в монопольном состоянии может не включать трафик когерентности - если используется snoopy, а не когерентность каталогов].)
Экономия площади от разделенных блоков кэша была особенно значительной, когда теги были на чипе процессора, но данные были вне чипа. Очевидно, что если хранилище данных занимает область, сопоставимую с размером чипа процессора (что не является необоснованным), то 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.])
Как правило, в одном доступе к основной памяти осуществляется доступ к 64 байтам данных и 8 байтам четности /ECC (я точно не помню, какой). И довольно сложно поддерживать разные размеры строк кэша на разных уровнях памяти. Вы должны заметить, что размер строки кэша будет больше соотноситься с размером выравнивания слова в этой архитектуре, чем что-либо еще. Исходя из этого, размер строки кэша вряд ли будет отличаться от размера доступа к памяти. Теперь биты четности предназначены для использования контроллером памяти, поэтому размер строки кэша обычно составляет 64 байта. Процессор действительно очень мало контролирует, кроме регистров. Все остальное, что происходит в компьютере, связано с подключением оборудования для оптимизации производительности процессора. В этом смысле также не имеет смысла импортировать дополнительную сложность, поскольку размеры строк кэша различаются на разных уровнях памяти.