Подробнее:
Читая о реализации LRU или наименее недавно используемого кэша, я наткнулся на решение O(1), в котором используется unordered_map (c++) и двусвязный список. Что очень эффективно, так как доступ к элементу из этой карты по существу O (1) (из-за очень хорошего внутреннего хеширования), а затем перемещение или удаление из этого двусвязного списка также O (1).
Подробное объяснение здесь
Но затем, в ходе дополнительных исследований, я обнаружил Как кэш LRU реализовано в процессоре?
Для большей ассоциативности число состояний резко возрастает: факториал числа путей. Таким образом, 4-канальный кеш будет иметь 24 состояния, требующих 5 бит на набор, а 8-канальный кеш будет иметь 40 320 состояний, требующих 16 бит на набор. В дополнение к накладным расходам на хранение, есть также большие накладные расходы при обновлении значения.
и это
Теперь мне трудно понять, почему решение O (1) не решит большинство проблем с сохранением состояний для каждого набора и возрастных битов для отслеживания LRU?
Я предполагаю, что с помощью хэш-карты невозможно сохранить ассоциативность, но тогда каждая запись может быть отдельной записью, и поскольку доступ равен O (1), это не должно иметь значения, верно? Единственное, о чем я сейчас думаю, это о размере этой хеш-карты, но до сих пор не могу понять, почему?
Любая помощь приветствуется, спасибо!
unordered_map
, часто ужасны для локальности кеша, поскольку записи теперь находятся в разных сегментах (распределения кучи), размещенных в разных областях памяти, и при поиске возникают промахи кеша. Точно так же связанные списки очень плохи из-за того, что доступ к ним осуществляется не непрерывно. - person Human-Compiler   schedule 12.04.2021std::unorded_map
, так же реализован со списком понравившихся под капотом, из-за определенной сложности гарантирует стандартные мандаты. - person NathanOliver   schedule 12.04.2021