Кэш жертвы — это небольшой, обычно полностью ассоциативный кэш, размещенный в пути пополнения кэша ЦП . Он хранит все блоки, вытесненные из этого уровня кэша, и был первоначально предложен в 1990 году. В современных архитектурах эта функция обычно выполняется кэшами уровня 3 или уровня 4.
Кэширование жертвы — это аппаратная технология повышения производительности кэшей, предложенная Норманом Джуппи . Как упоминалось в его статье: [1]
Кэширование промахов размещает полностью ассоциативный кэш между кэшем и его путем повторного заполнения. Промахи в кэше, которые попали в кэш промахов, имеют штраф в один цикл, в отличие от штрафа за много циклов промахов без кэша промахов. Кэширование жертвы — это усовершенствование кэширования промахов, которое загружает небольшой полностью ассоциативный кэш с жертвой промаха, а не запрошенной строкой кэша. [1]
Кэш жертвы — это аппаратный кэш, разработанный для уменьшения количества промахов конфликта и повышения задержки попадания для кэшей с прямым отображением. Он используется в пути пополнения кэша уровня 1, где любая строка кэша, вытесненная из кэша, кэшируется в кэше жертвы. В результате кэш жертвы заполняется только тогда, когда данные вытесняются из кэша уровня 1. Когда в кэше уровня 1 происходит промах, пропущенная запись проверяется в кэше жертвы. Если доступ приводит к попаданию, содержимое строки кэша уровня 1 и соответствующей строки кэша жертвы меняются местами.
Хотя изначально Jouppi предлагал улучшить производительность кэша прямого отображения кэша уровня 1, современные микропроцессоры с многоуровневой иерархией кэша используют кэш уровня 3 или уровня 4, чтобы действовать как кэш-жертва для кэша, находящегося выше в иерархии памяти. Crystal Well [2] от Intel в своих процессорах Haswell представил встроенный кэш уровня 4, который служит кэшем-жертвой для кэша уровня 3 процессора. [3] Кэш-память уровня 3 объемом 4–12 МБ используется в качестве кэш-жертвы в микропроцессорах POWER5 (IBM).
По мере развития аппаратной архитектуры и технологий производительность и частота процессора росли гораздо быстрее, чем время цикла памяти, что привело к значительному разрыву в производительности. Проблема роста задержки памяти по сравнению со скоростью процессора была решена путем внедрения высокоскоростной кэш-памяти.
Кэши с прямым отображением имеют более быстрое время доступа, чем ассоциативные кэши. Однако в кэшах с прямым отображением, когда несколько блоков кэша в памяти отображаются в одну и ту же строку кэша, они в конечном итоге вытесняют друг друга всякий раз, когда к одному из них осуществляется доступ. Эта проблема, известная как проблема конфликта кэша, возникает из-за ограниченной ассоциативности кэша. Увеличение ассоциативности кэша может смягчить эту проблему, но существуют сложности реализации и ограничения на то, насколько можно увеличить ассоциативность. Чтобы решить проблему конфликта кэша в рамках ограничений ограниченной ассоциативности кэша, часто используется кэш-жертва.
Ниже показано поведение кэша жертвы при его взаимодействии с кэшем соответствующего уровня:
Попадание в кэш: Никаких действий
Промах по кэшу, попадание в жертву: блок в кэше жертвы и блок в кэше заменяются друг другом. Эта новая запись в кэше жертвы становится последним использованным блоком.
Промах кэша, промах жертвы: Блок переносится в кэш со следующего уровня. Блок, вытесненный из кэша, сохраняется в кэше жертвы.
Рассмотрим кэш L1 с прямым отображением, в котором блоки A, B указывают на один и тот же набор. Он связан с полностью ассоциативным кэшем жертвы с 2 входами, в котором находятся блоки C, D.
Необходимо проследить путь: А, Б, А, Б...
Из диаграммы видно, что в случае попадания в кэш жертвы (VC) блоки A и B меняются местами. Блок VC, который использовался меньше всего, остается как есть. Таким образом, он создает иллюзию ассоциативности с кэшем L1 с прямым отображением, что в свою очередь уменьшает промахи конфликта.
В случае двух кэшей, L1 и L2 с политикой эксклюзивного кэширования (L2 не кэширует те же области памяти, что и L1), L2 выступает в качестве кэша-жертвы для L1.
При измерении улучшения производительности с использованием кэша жертвы, Юппи [1] предположил, что кэш с прямым отображением уровня 1 дополнен полностью ассоциативным кэшем. Для тестового набора, который он использовал, в среднем 39% промахов кэша данных уровня 1 оказались конфликтными промахами, в то время как в среднем 29% промахов инструкций уровня 1 оказались конфликтными промахами. [1] Поскольку конфликтные промахи составляют большой процент от общего числа промахов, поэтому предоставление дополнительной ассоциативности путем дополнения кэша уровня 1 кэшем жертвы должно значительно улучшить общую частоту промахов .
Экспериментальные результаты получены путем рассмотрения 32-Кб Direct-Mapped, 2-стороннего и полностью ассоциативного кэша, дополненного 256-блочным (8 Кб) кэшем жертвы и запуска на нем 8 случайно выбранных тестов SPEC 95. [4] Хотя результаты не могут быть обобщены для всех тестов, добавление кэша жертвы обеспечивает снижение частоты промахов в диапазоне от 10% до 100% для всех конфигураций кэша. [4] Однако возвраты, по-видимому, выравниваются после размера кэша жертвы в 50 блоков, тем самым подтверждая наблюдение Джуппи [1] о том, что преимущества кэша жертвы достигают плато после первых нескольких блоков жертвы. [4]
Установлено, что снижение частоты промахов для кэша размером 64 КБ значительно ниже, что доказывает, что кэширование жертвы не является масштабируемым до бесконечности. [4]
При сравнении различных конфигураций кэша было обнаружено, что в некоторых случаях добавление небольшого кэша жертвы может дать выигрыш в производительности, эквивалентный тому, который наблюдается при умножении размера кэша на 2. [4]