Введение
Деградация производительности из-за характера доступа к памяти. Загрязнение кэша описывает ситуации, когда выполняющаяся компьютерная программа загружает в кэш процессора данные, которые не требуются, что приводит к вытеснению полезных данных из кэша на более медленные уровни иерархии памяти и, как следствие, к снижению производительности. Например, в многоядерном процессоре одно ядро может заменить блоки, загруженные другими ядрами в общий кэш, или предварительно загруженные блоки могут вытеснить блоки, запрошенные по требованию из кэша.
Cache pollution describes situations where an executing computer program loads data into CPU cache unnecessarily, thus causing other useful data to be evicted from the cache into lower levels of the memory hierarchy, degrading performance. For example, in a multi core processor, one core may replace the blocks fetched by other cores into shared cache, or prefetched blocks may replace demand fetched blocks from the cache.
Решение
Помимо реструктуризации кода, упомянутой выше, решение проблемы загрязнения кэша заключается в хранении в кэше только данных с высокой степенью повторного использования. Этого можно достичь с помощью специальных инструкций управления кэшем, поддержки операционной системы или аппаратной поддержки. Примеры специализированных аппаратных инструкций включают "lvxl", предоставляемую PowerPC AltiVec. Эта инструкция загружает в регистр значение шириной 128 бит и помечает соответствующий блок кэша как "наименее недавно использованный", то есть как основной кандидат на вытеснение при необходимости освободить блок в его наборе кэша. Для правильного использования этой инструкции в контексте вышеуказанного примера элементы данных, на которые ссылается цикл, должны быть загружены с использованием этой инструкции. При такой реализации загрязнение кэша не произойдет, поскольку выполнение этого цикла не приведет к преждевременному вытеснению T[0] из кэша. Этого удастся избежать, потому что по мере выполнения цикла адреса элементов в C будут отображаться в один и тот же способ кэша, оставляя фактически более старые (но не помеченные как "наименее недавно использованные") данные нетронутыми в другом способе. Из кэша будут вытеснены только самые старые данные (не относящиеся к приведенному примеру), в котором T[0] не участвует, поскольку его обновление происходит непосредственно перед началом цикла. Аналогично, используя поддержку операционной системы (ОС), страницы в основной памяти, соответствующие массиву данных C, могут быть помечены как "запрещающие кэширование" или, другими словами, не кэшируемые. Аналогично, на аппаратном уровне можно использовать схемы обхода кэша, которые идентифицируют данные с низкой степенью повторного использования на основе шаблона доступа программы и исключают их из кэша. Кроме того, общий кэш можно разделить, чтобы избежать деструктивного взаимодействия между запущенными приложениями. Компромисс в этих решениях заключается в том, что схемы на основе ОС могут иметь большую задержку, которая может свести на нет выигрыш от предотвращения загрязнения кэша (если только область памяти изначально не была не кэшируемой), в то время как аппаратные методы могут не иметь глобального представления о потоке управления программой и модели доступа к памяти.
Растущее значение
Контроль за загрязнением кэша становится все более важным, поскольку штрафы, вызванные так называемой "стеной памяти", продолжают расти. Производители чипов постоянно разрабатывают новые способы преодоления постоянно увеличивающейся относительной задержки памяти по сравнению с процессором. Они делают это, увеличивая размеры кэшей и предоставляя разработчикам программного обеспечения эффективные инструменты для управления тем, как данные поступают в процессор и остаются в нем. Контроль за загрязнением кэша – один из множества доступных средств для (преимущественно встраиваемых) программистов. Однако используются и другие методы, большинство из которых являются проприетарными и сильно зависят от конкретного аппаратного обеспечения и приложения.