Открыть сервис

Кэш-память процессоров

Кэш-память (англ. cache memory, от фр. cacher — прятать) — это сверхбыстрая, но небольшая по объёму память, используемая центральным процессором (ЦП) для временного хранения часто запрашиваемых данных и инструкций из основной оперативной памяти (ОЗУ). Кэш-память служит буфером между быстрым процессором и более медленной оперативной памятью, позволяя значительно сократить среднее время доступа к данным и повысить общую производительность вычислительной системы.

Принцип работы и необходимость

Основная причина использования кэш-памяти — разница в скорости работы процессора и оперативной памяти. Современные процессоры работают на частотах в несколько гигагерц, а время доступа к ячейкам ОЗУ (DRAM) составляет десятки наносекунд. За время, необходимое для одного обращения к ОЗУ, процессор может выполнить сотни тактов. Если бы ЦП каждый раз обращался напрямую к медленной памяти, он бы простаивал большую часть времени, ожидая поступления данных.

Кэш-память, как правило, строится на статической памяти (SRAM), которая значительно быстрее динамической (DRAM), используемой в ОЗУ, но дороже и занимает больше места на кристалле. Работа кэша основана на принципе локальности обращений:

  • Временна́я локальность (Temporal Locality): Если процессор обратился к определённой ячейке памяти, велика вероятность, что он снова обратится к ней в ближайшем будущем. Поэтому данные из этой ячейки сохраняются в кэше.
  • Пространственная локальность (Spatial Locality): Если процессор обратился к ячейке памяти, велика вероятность, что он обратится и к соседним ячейкам. Поэтому в кэш загружается не один байт, а целый блок данных (кэш-линия), размер которого обычно составляет 64 или 128 байт.

Когда процессору требуется данные, он сначала проверяет их наличие в кэше. Если данные найдены, это называется кэш-попаданием (cache hit), и доступ происходит за минимальное время. Если данных в кэше нет — кэш-промах (cache miss), и процессор вынужден обращаться к более медленной оперативной памяти, загружая при этом недостающий блок в кэш.

Иерархия кэш-памяти

Для оптимизации баланса между скоростью, объёмом и стоимостью кэш-память в современных процессорах организована иерархически, обычно в виде нескольких уровней (L1, L2, L3). Каждый последующий уровень больше по объёму, но медленнее предыдущего.

Кэш первого уровня (L1)

  • Объём: Обычно от 32 до 128 КБ на ядро.
  • Скорость: Максимально быстрый, работает на частоте процессора. Время доступа — 2–4 такта.
  • Особенности: Разделяется на два независимых блока: кэш инструкций (L1i) и кэш данных (L1d). Такое разделение позволяет процессору одновременно читать инструкцию и данные, что повышает параллелизм. L1 является самым маленьким и самым дорогим уровнем.

Кэш второго уровня (L2)

  • Объём: От 256 КБ до 1–2 МБ на ядро.
  • Скорость: Несколько медленнее L1, время доступа — 10–20 тактов.
  • Особенности: В большинстве современных процессоров L2 является частным (private) для каждого ядра, то есть каждое ядро имеет свой собственный кэш L2. В некоторых архитектурах (например, у AMD с чиплетной компоновкой) L2 может быть разделён на несколько частей.

Кэш третьего уровня (L3)

  • Объём: От 2–4 МБ до 64 МБ и более (в серверных процессорах).
  • Скорость: Самый медленный из кэшей, время доступа — 30–60 тактов.
  • Особенности: Является общим (shared) для всех ядер процессора. L3 служит для обмена данными между ядрами и для буферизации обращений к оперативной памяти. Его наличие снижает количество обращений к ОЗУ при работе многопоточных приложений.

Кэш четвёртого уровня (L4)

В некоторых процессорах, например, в гибридных чипах Intel (серия Core с процессором графики на кристалле) или в серверных решениях, может присутствовать кэш четвёртого уровня. L4 обычно реализуется на основе технологии eDRAM (embedded DRAM) и располагается на отдельном кристалле, но в одном корпусе с процессором. Он служит дополнительным буфером между L3 и ОЗУ.

Организация кэш-памяти

Способ, которым кэш-память сопоставляется с адресами основной памяти, определяет её организацию. Существует три основных типа:

  1. Кэш с прямым отображением (Direct-Mapped Cache): Каждый блок основной памяти может быть помещён только в одну строго определённую строку кэша. Простая и быстрая схема, но подвержена конфликтам, когда два часто используемых блока данных претендуют на одну и ту же строку, постоянно вытесняя друг друга.
  2. Полностью ассоциативный кэш (Fully Associative Cache): Любой блок основной памяти может быть помещён в любую свободную строку кэша. Это устраняет конфликты, но требует сложной схемы поиска, что увеличивает время доступа и энергопотребление. На практике используется редко, обычно в небольших кэшах (например, TLB).
  3. Наборно-ассоциативный кэш (Set-Associative Cache): Компромиссный вариант, наиболее распространённый в современных процессорах. Память делится на наборы (sets), каждый из которых содержит несколько строк (ways). Блок основной памяти может быть помещён в любой строке конкретного набора. Степень ассоциативности (например, 4-way, 8-way, 16-way) определяет количество строк в наборе. Чем выше ассоциативность, тем меньше конфликтов, но выше сложность.

Политики замещения и записи

Когда кэш заполнен и необходимо загрузить новый блок данных, старый блок должен быть удалён. Алгоритм, определяющий, какой блок удалить, называется политикой замещения. Наиболее распространённые:

  • LRU (Least Recently Used): Удаляется блок, к которому дольше всего не было обращений. Считается наиболее эффективным, но требует сложной аппаратной реализации.
  • Pseudo-LRU (PLRU): Аппроксимация LRU, проще в реализации, даёт почти такую же производительность.
  • FIFO (First In, First Out): Удаляется самый старый блок, независимо от частоты обращений.
  • Random: Удаляется случайный блок. Простейший алгоритм, но может давать нестабильные результаты.

Также важна политика записи (write policy), определяющая, как процессор записывает данные в кэш:

  • Write-Through (сквозная запись): Данные записываются одновременно и в кэш, и в основную память. Простая реализация, гарантирует согласованность данных, но замедляет запись из-за ожидания записи в медленную память.
  • Write-Back (обратная запись): Данные записываются только в кэш. Блок в кэше помечается как «грязный» (dirty). Запись в основную память происходит только тогда, когда этот блок вытесняется из кэша. Это значительно быстрее для записи, но требует более сложного контроллера.

Влияние на производительность

Эффективность кэш-памяти измеряется процентом попаданий (hit rate). Современные процессоры имеют процент попаданий в L1 около 90-95%, в L2 — около 80-90%, в L3 — около 50-70%. Высокий процент попаданий критически важен для производительности, особенно в вычислительно-интенсивных задачах и играх.

Недостаток кэш-памяти может приводить к так называемому «голоданию» процессора, когда он постоянно простаивает в ожидании данных из ОЗУ. С другой стороны, слишком большой кэш увеличивает задержки доступа (латентность) и повышает энергопотребление и стоимость процессора.

Кэш-память в многоядерных системах

В многоядерных процессорах возникает проблема когерентности кэша (cache coherence). Если одно ядро изменяет данные в своём частном кэше L1, другое ядро, имеющее в своём кэше копию тех же данных, должно узнать об этом изменении, иначе оно будет работать с устаревшей информацией. Для решения этой проблемы используются протоколы когерентности, такие как MESI (Modified, Exclusive, Shared, Invalid) и его модификации (MOESI, MESIF). Эти протоколы обеспечивают обмен служебными сообщениями между кэшами ядер, чтобы поддерживать актуальность данных.

Интересные факты

  • Первым процессором, в котором была использована кэш-память, стал IBM System/370 Model 158 (1970 год).
  • В процессорах Intel 80486 кэш L1 объёмом 8 КБ был впервые интегрирован непосредственно на кристалл процессора.
  • В современных процессорах для игровых ПК (например, AMD Ryzen 7 7800X3D) используется технология 3D V-Cache, позволяющая вертикально наращивать дополнительный кэш L3 объёмом до 64 МБ, что даёт значительный прирост производительности в играх.

Источники

  • Хеннесси Дж., Паттерсон Д. «Архитектура компьютера и проектирование компьютерных систем». Классический учебник по компьютерной архитектуре.
  • Intel Corporation. «Intel 64 and IA-32 Architectures Optimization Reference Manual».
  • AMD Corporation. «AMD Processor Programming Reference (PPR) for AMD Family 19h Models».
  • Таненбаум Э., Остин Т. «Архитектура компьютера».
  • Документация по стандарту IEEE 1541 (терминология единиц измерения информации).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →