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

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

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

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


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

2 ответов


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

вы не указали, какой процессор вы имеете в виду, каждый из них может иметь другую политику (на самом деле даже в одном и том же процессоре разные уровни кэша могут иметь разные политики, не говоря уже о TLBs и других ассоциативных массивах, которые также могут иметь такие политики). Я нашел несколько подсказок о 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, который назначил некоторый" возраст " каждой строке в соответствии с ее прогнозируемой важностью. Они упомяните, что префектуры получают средний возраст, поэтому требования, вероятно, распределяются в более высоком возрасте (или ниже, что выживает дольше всего), и все линии, вероятно, стареют постепенно, поэтому самый старый заменяется первым. Не так хорошо, как идеальный "ФИФО-подобный" LRU, но имейте в виду, что большинство кэшей не реализуют это, а довольно сложный псевдо-LRU решение может быть улучшение.

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

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


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

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

StrongARM SA-1110 32-way L1 кэш данных используется FIFO. Он также имел двухсторонний minicache для переходных данных, который также, похоже, использовал FIFO. (руководство разработчика микропроцессора Intel StrongARM SA-1110 состояния "замены в minicache используют тот же механизм кругового указателя, что и в основном кэше данных. Однако, поскольку этот кэш является только двусторонним ассоциативным набором, алгоритм замены сводится к простому наименее недавно используемому (LRU) механизм."; а 2-способ ФИФО составляет не то же самое, что и LRU, даже с двумя способами, хотя для потоковых данных это работает одинаково.])

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

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

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

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