Загрязнение кэша
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2021 г. ) |
Загрязнение кэша описывает ситуации, когда выполняющаяся компьютерная программа без необходимости загружает данные в кэш ЦП . [1] тем самым вызывая вытеснение других полезных данных из кэша на более низкие уровни иерархии памяти , что снижает производительность. Например, в многоядерном процессоре одно ядро может заменять блоки, извлеченные другими ядрами, в общий кэш, или предварительно выбранные блоки могут заменять блоки, извлеченные по требованию, из кэша.
Пример
[ редактировать ]Рассмотрим следующую иллюстрацию:
T[0] = T[0] + 1; for i in 0..sizeof(CACHE) C[i] = C[i] + 1; T[0] = T[0] + C[sizeof(CACHE)-1];
(Здесь предполагается, что кэш состоит только из одного уровня, он разблокирован, политика замены псевдо-LRU , все данные кэшируются, заданная ассоциативность кэша равна N (где N > 1), и не более один регистр процессора доступен для хранения программных значений).
Прямо перед запуском цикла T[0] будет извлечен из памяти в кеш, и его значение обновится. Однако во время выполнения цикла, поскольку количество элементов данных, на которые ссылается цикл, требует заполнения всего кэша до его емкости, блок кэша, содержащий T[0], должен быть удален. Таким образом, в следующий раз, когда программа запросит обновление T[0], кэш промахнется, и контроллер кэша должен будет запросить шину данных , чтобы снова извлечь соответствующий блок кэша из основной памяти .
В этом случае говорят, что кэш «загрязнен». Изменение шаблона доступа к данным путем размещения первого обновления T[0] между циклом и вторым обновлением может устранить неэффективность:
for i in 0..sizeof(CACHE) C[i] = C[i] + 1; T[0] = T[0] + 1; T[0] = T[0] + C[sizeof(CACHE)-1];
Решения
[ редактировать ]Помимо упомянутой выше реструктуризации кода, решение проблемы загрязнения кеша заключается в том, чтобы в кеше хранились только данные с высокой степенью повторного использования. Этого можно добиться с помощью специальных инструкций по управлению кэшем , поддержки операционной системы или аппаратной поддержки.
Примеры специализированных аппаратных инструкций включают «lvxl», предоставляемый PowerPC AltiVec . Эта инструкция загружает в регистр значение шириной 128 бит и помечает соответствующий блок кэша как «наименее недавно использовавшийся», т.е. как основного кандидата на вытеснение при необходимости исключить блок из его набора кэша. Чтобы правильно использовать эту инструкцию в контексте приведенного выше примера, элементы данных, на которые ссылается цикл, должны быть загружены с помощью этой инструкции. При такой реализации загрязнения кеша не произойдет, поскольку выполнение такого цикла не приведет к преждевременному вытеснению T[0] из кеша. Этого можно было бы избежать, поскольку по мере выполнения цикла адреса элементов в C будут отображаться в одном и том же способе кэширования, оставляя фактически более старые (но не помеченные как «наименее недавно использованные») данные нетронутыми в другом способе(ах). ). Из кэша будут удалены только самые старые данные (не относящиеся к приведенному примеру), членом которого не является T[0], поскольку его обновление происходит непосредственно перед началом цикла.
Аналогичным образом, используя поддержку операционной системы (ОС), страницы в основной памяти , соответствующие массиву данных C, могут быть помечены как «кэширование запрещено» или, другими словами, как некэшируемые. Аналогичным образом, на аппаратном уровне могут использоваться схемы обхода кэша, которые идентифицируют данные с низким уровнем повторного использования на основе шаблона доступа к программе и обходят их из кэша. Кроме того, общий кэш можно разделить, чтобы избежать деструктивного взаимодействия между запущенными приложениями. Компромисс в этих решениях заключается в том, что схемы на базе ОС могут иметь большую задержку, что может свести на нет выигрыш, достижимый за счет предотвращения загрязнения кэша (если только область памяти изначально не была некэшируемой), тогда как аппаратные методы могут не иметь глобального представление потока управления программой и схемы доступа к памяти .
Растущая важность
[ редактировать ]Важность контроля за загрязнением кэша возрастает, поскольку штрафы, вызванные так называемой « стеной памяти », продолжают расти. Производители чипов продолжают изобретать новые приемы, позволяющие преодолеть постоянно растущую относительную задержку между памятью и процессором. Они делают это за счет увеличения размеров кэша и предоставления разработчикам программного обеспечения полезных способов контроля над тем, как данные поступают и остаются в ЦП. Контроль загрязнения кэша — одно из многочисленных устройств, доступных программисту (в основном встроенному). Однако используются и другие методы, большинство из которых являются запатентованными и в значительной степени зависят от аппаратного обеспечения и приложения.
Ссылки
[ редактировать ]- ^ Карами, Амин; Герреро-Сапата, Манель (7 апреля 2015 г.). «Метод замены кэша на основе ANFIS для смягчения атак на загрязнение кэша в сети именованных данных» . Компьютерные сети . 80 : 51–65. дои : 10.1016/j.comnet.2015.01.020 . hdl : 2117/76980 .