Какие алгоритмы аннулирования кеша используются в реальных кэшах процессора?

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

Существует наименее недавно используемый алгоритм или алгоритм fifo или наименее часто используемый алгоритм и случайная замена,...

Но какие алгоритмы используются в реальных кэшах процессора? Или вы можете использовать все, и... операционная система решает, что лучший алгоритм?


Изменить: даже когда я выбрал ответ, любая дополнительная информация приветствуется;)

Ответ 1

Как сказал Хиверт - трудно получить четкую картину по конкретному алгоритму, но можно вывести некоторую информацию в соответствии с подсказками или умной обратной инженерией.

Вы не указали, какой из ЦП вы имеете в виду, у каждого из них может быть другая политика (на самом деле даже в пределах одного и того же CPU разные уровни кеша могут иметь разные политики, не говоря уже о TLB и других ассоциативных массивах, которые также могут иметь такие политики), Я нашел несколько советов о Intel (в частности, Ivy Bridge), поэтому мы будем использовать это как ориентир для стандартов отрасли (которые могут или не могут применяться в других местах).

Во-первых, Intel представила некоторые связанные с LRU функции - http://www.hotchips.org/wp-content/uploads/hc_archives/hc24/HC24-1-Microprocessor/HC24.28.117-HotChips_IvyBridge_Power_04.pdf

В слайде 46 упоминается "Quad-Age LRU" - это, по-видимому, LRU, основанный на возрасте, который назначил "возраст" каждой линии в соответствии с ее прогнозируемой важностью. Они отмечают, что prefetches получают средний возраст, поэтому требования, вероятно, распределяются в более высоком возрасте (или ниже, независимо от того, что дольше всего сохранится), и все линии, вероятно, возрастут постепенно, поэтому старейшие сначала заменяются. Не так хорошо, как идеальный "филоподобный" LRU, но имейте в виду, что большинство кэшей не реализуют этого, а сложное pseudo-LRU решение, поэтому это может быть улучшением.

Еще один интересный механизм, упомянутый здесь, который выходит за лишнюю милю за пределы классического LRU, - это адаптивная политика заполнения. Здесь неплохой анализ - http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/, но в двух словах (если блог правильный, и он, похоже, хорошо соответствует его результатам) кеш динамически выбирает между двумя политиками LRU, пытаясь решить, будут ли линии использоваться повторно или нет (и их следует сохранить или нет).

Я предполагаю, что это может в некоторой степени ответить на ваш вопрос о нескольких схемах LRU. Внедрение нескольких схем, вероятно, является сложным и дорогостоящим с точки зрения HW, но когда у вас есть политика, которая достаточно сложна, чтобы иметь параметры, можно использовать трюки, такие как динамический выбор, установление дуэлей и т.д.

Ответ 2

Ниже приведены некоторые примеры политик замены, используемых в реальных процессорах.

В 8-way L1 кеш PowerPC 7450 используется двоичное дерево pLRU. Двоичное дерево pLRU использует один бит на пару способов установить LRU для этой пары, затем бит LRU для каждой пары пар и т.д. В 8-way L2 используется псевдослучайная замена, устанавливаемая привилегированным программным обеспечением (ОС) используя либо трехбитовый счетчик, увеличивающийся каждый такт, либо генератор псевдослучайных чисел на основе сдвига.

В 32-сторонном кэше данных L1 StrongARM SA-1110 используется FIFO. У него также была двухсторонняя мини-маска для временных данных, которая также, похоже, использовала FIFO. (Руководство разработчика микропроцессоров Intel StrongARM SA-1110 гласит: "Замены в мини-клавиатуре используют один и тот же механизм указателей кругового вращения, как в основном кэше данных. Однако, поскольку этот кеш является только двухсторонним ассоциативно-ассоциативным, алгоритм замены сводится к простой механизм с наименьшим последним (LRU)", но двухсторонний FIFO - это не то же самое, что LRU даже с двумя способами, хотя для потоковой передачи данных он работает одинаково.])

HP PA 7200 имел полностью ассоциативный "вспомогательный кеш" с 64 блоками, к которому обращались параллельно с кэшем данных с непосредственным отображением вне чипа. Кэш-помощник использовал замену FIFO с возможностью выселения в кеш-память L1 вне чипа. Инструкции по загрузке и хранению имели подсказку "местность"; если запись вспомогательного кэша была загружена таким доступом к памяти, она будет вытеснена в память, минуя внекорпус L1.

Для двухсторонней ассоциативности истинный LRU может быть наиболее распространенным выбором, поскольку он имеет хорошее поведение (и, кстати, такое же, как бинарное дерево pLRU, когда есть только два пути). Например, блок управления кэшем и памятью Fairchild Clipper использовал LRU для своего двухстороннего кеша. FIFO немного дешевле, чем LRU, поскольку информация о замене обновляется только тогда, когда метки записываются в любом случае, то есть при вставке нового блока кэша, но имеет лучшее поведение, чем псевдослучайная замена на основе счетчика (которая имеет еще более низкие служебные данные). HP PA 7300LC использовал FIFO для своих 2-сторонних кэшей L1.

Серия Itanium 9500 (Poulson) использует NRU для кэшей данных L1 и L2, кэша команд L2 и кеша L3 (кеш команд L1 документирован как используемый LRU.). Для 24-стороннего кэша L3 в процессоре Itanium 2 6M (Madison) для NRU был предоставлен бит за блок с доступом к блоку, устанавливающим бит, соответствующий его набору и способу ( "Itanium 2 Processor 6M: Higher Frequency and Larger L3 Cache", Stefan Rusu и др., 2004). Это похоже на алгоритм замены страницы синхронизации.

Кажется, мне кажется, что в другом месте мы читаем, что биты были очищены, когда все были установлены (вместо того, чтобы сохранить тот, который установил последний бит не установлен), и что жертва была выбрана поиском первой неудачной проверки бит. Это имело бы аппаратное преимущество только в том, чтобы читать информацию (которая хранилась в разных массивах, но рядом с тегами L3), при пропуске кеша; кэш может просто установить соответствующий бит. Кстати, этот тип NRU позволяет избежать некоторых из плохих черт истинного LRU (например, LRU в некоторых случаях ухудшается в FIFO, а в некоторых из этих случаев даже случайная замена может увеличить скорость попадания).

Ответ 3

Для процессоров Intel политики замены обычно недокументированы. Я провел несколько экспериментов по раскрытию политик в последних процессорах Intel, результаты которых можно найти на https://uops.info/cache.html. Код, который я использовал, доступен на GitHub.

Ниже приводится краткое изложение моих выводов.

  • Tree-PLRU: Эта политика используется кэшами данных L1 всех протестированных мной процессоров, а также кэшами L2 процессоров Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell и Broadwell.
  • Рандомизированное Tree-PLRU: Некоторые процессоры Core 2 Duo используют варианты Tree-PLRU в своих кэшах L2, где либо младший, либо старший бит в дереве заменяются случайностью (pseudo-).
  • MRU: Эту политику иногда также называют NRU. Он использует один бит на блок кеша. Доступ к блоку устанавливает бит в 0. Если последний 1-бит был установлен в 0, все остальные биты устанавливаются в 1. При пропадании первый блок с его битом, установленным в 1, заменяется. Эта политика используется для кэшей L3 ЦП Nehalem, Westmere и Sandy Bridge.
  • Quad-Age LRU (QLRU): Это обобщение политики MRU, которая использует два бита на блок кэша. Различные варианты этой политики используются для кэшей L3, начиная с Ivy Bridge, и для кэшей L2, начиная со Skylake.
  • Адаптивные политики: ЦП Ivy Bridge, Haswell и Broadwell могут динамически выбирать между двумя различными вариантами QLRU. Это реализуется посредством дуэли наборов: небольшое количество выделенных наборов всегда использует один и тот же вариант QLRU; остальные наборы являются "наборами последователей", которые используют вариант, который лучше работает на выделенных наборах. Смотрите также http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/.