Загрязнение кэша описывает ситуации, когда выполняющаяся компьютерная программа загружает данные в кэш ЦП без необходимости, что приводит к вытеснению других полезных данных из кеша на более низкие уровни иерархии памяти , что снижает производительность. Например, в многоядерном процессоре одно ядро может заменять блоки, выбранные другими ядрами в общий кэш, или предварительно выбранные блоки могут заменять блоки, выбранные по требованию из кеша.
Пример
Рассмотрим следующую иллюстрацию:
Т [0] = Т [0] + 1; для i в 0 .. sizeof (КЭШ) C [i] = C [i] + 1; Т [0] = Т [0] + C [размер (КЭШ) -1];
(Предполагается, что кэш состоит только из одного уровня, он разблокирован, политика замены - псевдо-LRU , все данные кэшируются, установленная ассоциативность кеша равна N (где N> 1), и не более один регистр процессора доступен для хранения программных значений).
Прямо перед запуском цикла T [0] будет извлечен из памяти в кеш, его значение будет обновлено. Однако по мере выполнения цикла, поскольку количество элементов данных, на которые ссылается цикл, требует, чтобы весь кэш был заполнен до его емкости, блок кэша, содержащий T [0], должен быть исключен. Таким образом, в следующий раз, когда программа запрашивает обновление T [0], кэш промахивается, и контроллер кеша должен запросить шину данных, чтобы снова перенести соответствующий блок кэша из основной памяти .
В этом случае кеш считается «загрязненным». Изменение шаблона доступа к данным путем размещения первого обновления T [0] между циклом и вторым обновлением может устранить неэффективность:
для i в 0 .. sizeof (КЭШ) C [i] = C [i] + 1; Т [0] = Т [0] + 1; Т [0] = Т [0] + C [размер (КЭШ) -1];
Решения
Помимо упомянутой выше реструктуризации кода, решение проблемы загрязнения кеша заключается в том, чтобы в кеше хранились только данные с частым повторным использованием. Это может быть достигнуто с помощью специальных инструкций по управлению кешем , поддержки операционной системы или оборудования.
Примеры специализированных аппаратных инструкций включают «lvxl», предоставляемые PowerPC AltiVec . Эта инструкция загружает значение шириной 128 бит в регистр и помечает соответствующий блок кэша как «наименее недавно использованный», то есть как главный кандидат на удаление при необходимости удалить блок из его набора кэша. Чтобы правильно использовать эту инструкцию в контексте приведенного выше примера, элементы данных, на которые ссылается цикл, должны быть загружены с помощью этой инструкции. При реализации таким образом не произойдет загрязнения кеша, поскольку выполнение такого цикла не приведет к преждевременному удалению T [0] из кеша. Этого можно было бы избежать, потому что по мере развития цикла адреса элементов в C будут отображаться в один и тот же путь кеширования, оставляя фактически более старые (но не отмеченные как «наименее недавно использованные») данные нетронутыми на другом пути (s ). Только самые старые данные (не относящиеся к данному примеру) будут исключены из кеша, членом которого T [0] не является, поскольку его обновление происходит прямо перед началом цикла.
Точно так же, используя поддержку операционной системы (ОС), страницы в основной памяти, которые соответствуют массиву данных C, могут быть помечены как «кэширование запрещено» или, другими словами, не кэшируемые. Точно так же на аппаратном уровне могут использоваться схемы обхода кеша, которые идентифицируют данные с низким уровнем повторного использования на основе шаблона доступа программы и обходят их из кеша. Кроме того, общий кеш можно разделить, чтобы избежать деструктивного вмешательства между запущенными приложениями. Компромисс в этих решениях заключается в том, что схемы на основе ОС могут иметь большую задержку, что может свести к нулю выигрыш, достижимый за счет предотвращения загрязнения кеша (если только область памяти не была кэшируемой с самого начала), тогда как аппаратные методы могут не иметь глобального представление потока управления программой и шаблона доступа к памяти .
Возрастающее значение
Важность борьбы с загрязнением кеша возрастает, поскольку штрафы, вызванные так называемой « стеной памяти », продолжают расти. Производители микросхем продолжают изобретать новые приемы, позволяющие преодолеть постоянно увеличивающуюся относительную задержку между памятью и процессором. Они делают это за счет увеличения размеров кэша и предоставления инженерам-программистам полезных способов контролировать то, как данные поступают и остаются в ЦП. Контроль загрязнения кэша - одно из многочисленных устройств, доступных программисту (в основном встроенному). Однако используются и другие методы, большинство из которых являются проприетарными и сильно зависят от оборудования и приложений.