Кэширование процессора
Кэширование процессора — это аппаратный механизм, использующий быстродействующую буферную память (кэш) для временного хранения часто запрашиваемых данных и инструкций, что позволяет сократить время доступа к ним по сравнению с обращением к основной оперативной памяти (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 →