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

Кэширование процессора

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

История

Идея кэширования возникла в 1960-х годах в связи с ростом разрыва между быстродействием процессоров и оперативной памяти. Первым коммерческим компьютером, использующим кэш-память, стал IBM System/360 Model 85 (1968 год), где кэш объёмом 16–32 Кбайт назывался «буфером хранения». В 1970-х годах кэш стал применяться в мейнфреймах, а с появлением микропроцессоров — в персональных компьютерах.

В 1989 году процессор Intel 80486 впервые включил кэш-память первого уровня (L1) непосредственно на кристалле. В 1995 году в процессоре Intel Pentium Pro появился кэш второго уровня (L2) на отдельном кристалле, а с 2000-х годов многоуровневое кэширование (L1, L2, L3) стало стандартом для всех высокопроизводительных процессоров.

Принцип работы

Кэширование основано на принципе локальности ссылок:

  • Пространственная локальность: если процессор обратился к определённому адресу памяти, то с высокой вероятностью он вскоре обратится к соседним адресам.
  • Временная локальность: одни и те же данные или инструкции, к которым произошло обращение, будут запрошены снова в ближайшем будущем.

При первом запросе данных из оперативной памяти кэш-контроллер копирует блок данных (строку кэша) из RAM в кэш. При последующих обращениях процессор сначала проверяет наличие данных в кэше:

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

Строка кэша

Данные в кэше хранятся блоками фиксированного размера — строками кэша (cache line). В современных процессорах размер строки обычно составляет 64 байта. При кэш-промахе загружается вся строка, содержащая запрошенный адрес, что использует пространственную локальность.

Ассоциативность

Кэш-память может быть организована по разным принципам ассоциативности:

  • Прямое отображение (direct-mapped): каждый блок памяти может быть помещён только в одну фиксированную позицию в кэше. Простота, но высокая вероятность конфликтов.
  • Полностью ассоциативный кэш (fully associative): любой блок может быть помещён в любую позицию. Минимум конфликтов, но сложность схемы.
  • Наборно-ассоциативный кэш (set-associative): компромисс — кэш делится на наборы, каждый блок может быть помещён в любой слот своего набора. Наиболее распространённый тип (например, 8-канальный или 16-канальный).

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

При заполнении кэша возникает необходимость вытеснить старые данные. Основные алгоритмы:

  • LRU (Least Recently Used) — вытесняется строка, к которой дольше всего не было обращений.
  • LFU (Least Frequently Used) — вытесняется строка с наименьшей частотой обращений.
  • Random — случайный выбор, прост в реализации, но менее эффективен.
  • Pseudo-LRU — приближённый к LRU алгоритм, используемый в большинстве современных процессоров для снижения аппаратных затрат.

Уровни кэш-памяти

Современные процессоры имеют многоуровневую иерархию кэша:

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

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

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

  • Объём: 256 Кбайт – 1 Мбайт на ядро.
  • Расположение: на кристалле, может быть индивидуальным для каждого ядра или общим для пары ядер (в некоторых архитектурах).
  • Время доступа: 10–20 тактов.
  • Особенность: промежуточный уровень, уменьшает количество промахов L1.

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

  • Объём: 2–64 Мбайт (общий для всех ядер процессора).
  • Расположение: на кристалле, общий для всех ядер.
  • Время доступа: 30–50 тактов.
  • Особенность: служит буфером между L2 и оперативной памятью, снижает задержки при обмене данными между ядрами.

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

Встречается редко, например, в процессорах Intel с технологией Crystalwell (2013 год) — дополнительный кэш объёмом до 128 Мбайт, размещённый на отдельном кристалле в корпусе процессора. Используется как большой кэш для графического ядра.

Типы кэш-промахов

Классификация по «трём C» (Three C's model, предложена Марком Хиллом в 1987 году):

  • Compulsory miss (обязательный промах) — первый доступ к данным, которых никогда не было в кэше.
  • Capacity miss (промах по ёмкости) — кэш не может вместить все данные, необходимые программе.
  • Conflict miss (промах по конфликту) — возникает в кэшах с прямым отображением или наборно-ассоциативных, когда несколько блоков памяти конкурируют за одну позицию.

Позднее была добавлена четвёртая категория:

  • Coherency miss (промах по когерентности) — возникает в многоядерных системах при изменении данных одним ядром, что делает копии в кэшах других ядер недействительными.

Когерентность кэша

В многоядерных и многопроцессорных системах несколько кэшей могут хранить копии одних и тех же данных. Для обеспечения согласованности используются протоколы когерентности:

  • MESI (Modified, Exclusive, Shared, Invalid) — наиболее распространённый протокол, где каждая строка кэша имеет одно из четырёх состояний.
  • MOESI — расширение MESI с состоянием Owned (владение).
  • Directory-based — централизованное отслеживание копий данных.

Запись данных в кэш

При записи данных процессором возможны две стратегии:

  • Write-through (сквозная запись) — данные записываются одновременно в кэш и в оперативную память. Простота, но высокая нагрузка на шину памяти.
  • Write-back (обратная запись) — данные записываются только в кэш, а в память сбрасываются при вытеснении строки. Эффективнее, но требует контроля когерентности.

Применение и значение

Кэширование процессора критически важно для производительности:

  • Сокращает среднее время доступа к памяти с десятков наносекунд (RAM) до единиц наносекунд (L1).
  • Позволяет процессору работать на высокой тактовой частоте, не ожидая медленную память.
  • В современных процессорах до 50–70% площади кристалла может занимать кэш-память.

Кэширование используется не только в центральных процессорах, но и в графических процессорах (GPU), микроконтроллерах, жёстких дисках (дисковый кэш) и веб-серверах (кэш HTTP).

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

  • В процессоре AMD Ryzen 7 7800X3D (2023 год) используется технология 3D V-Cache, позволяющая разместить дополнительный кэш L3 объёмом 64 Мбайт поверх основного кристалла, что даёт прирост производительности в играх до 20–30%.
  • В суперкомпьютерах и серверных процессорах (например, Intel Xeon) кэш L3 может достигать 60 Мбайт и более.
  • Кэш первого уровня на процессорах Intel Core 13-го поколения (Raptor Lake) имеет задержку всего 3 такта для L1d и 5 тактов для L1i.

Источники

  • Hennessy, J. L., Patterson, D. A. «Computer Architecture: A Quantitative Approach» (6-е издание, 2017).
  • Intel Corporation. «Intel 64 and IA-32 Architectures Optimization Reference Manual» (2023).
  • AMD Corporation. «AMD64 Architecture Programmer’s Manual» (2022).
  • Hill, M. D. «Aspects of Cache Memory and Instruction Buffer Performance» (PhD thesis, 1987).
  • Jacob, B., Ng, S. W., Wang, D. T. «Memory Systems: Cache, DRAM, Disk» (2008).

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

На главную BFOmetr →