Что такое кэш-память в компьютере и зачем она нужна
Что такое кэш-память в компьютере и зачем она нужна?
Кэш-память — хранилище для часто используемой информации, доступ к которому осуществляется намного быстрее по сравнению с оперативной памятью или жестким диском компьютера. Рассматриваемая технология базируется на подсистеме компьютерной памяти. Главным предназначением является ускорение работы устройства. Даже если ПК обладает непроизводительным процессором, благодаря кэшированию информации скорость выполнения задач существенно повышается.
Кэш-памятью оборудованы главные элементы компьютера — жесткие диски, видеокарты, процессоры. Архитектура и работа технологии способны отличаться. Например, кэш может служить обычным буфером обмена — устройство обрабатывает информацию и передает полученные данные в специальный буфер, из которого результат поступает на интерфейс. Назначением такого кэша является предотвращение ошибок благодаря аппаратной проверке информации на целостность.
Уровни кэша: L1, L2 и L3
Кэш процессора разделен на три основных уровня: L1, L2 и L3. Отличаются они скоростью доступа и размером.
- Кэш L1 (уровень 1) — это самая быстрая память которая присутствует в компьютере. С точки зрения приоритета, L1 содержит данные и команды, которые понадобятся в первую очередь. Размер обычно достигает 256 КБ, хотя некоторые топовые процессоры (типа Intel Xeon) могут иметь более 1 МБ.
- Кэш L2 (уровень 2) медленнее, но больше по размеру. Объем в диапазоне от 256 КБ до 8 МБ. Содержит данные, которые также могут скоро потребоваться, но не уместились в L1. Память первых двух уровней встроена прямо в ядро процессора. То есть, у каждого ядра она своя.
- Кэш L3 (уровень 3) — самая медленная из них, но и самая большая. Размер может достигать 62 МБ. Физически располагается внутри кристалла процессора, что позволяет обращаться к её содержимому намного быстрее, чем к ячейкам оперативной памяти.
Когда процессор ищет данные для выполнения операции, он последовательно начинает просматривать все уровни, начиная с L1 и заканчивая L3. Если поиск завершился неудачей, то приходиться обращаться к оперативной памяти, а это вызывает задержку в работе. Поэтому, чем объемней кэш, тем больше вероятность нахождения в нем нужных данных, а значит меньше задержек.
Для чего нужна кэш-память процессора?
Как уже упоминалось выше, главное назначение кэш-памяти – это хранение данных, которые часто используются процессором. Кэш является буфером, в который загружаются данные, и, несмотря на его небольшой объём, (около 4-16 Мбайт) в современных процессорах , он дает значительный прирост производительности в любых приложениях.
Чтобы лучше понять необходимость кэш-памяти, давайте представим себе организацию памяти компьютера в виде офиса. Оперативная память будет являть собою шкаф с папками, к которым периодически обращается бухгалтер, чтобы извлечь большие блоки данных (то есть папки). А стол, будет являться кэш-памятью.
Есть такие элементы, которые размещены на столе бухгалтера, к которым он обращается в течение часа по несколько раз. Например, это могут быть номера телефонов, какие-то примеры документов. Данные виды информации находятся прямо на столе, что, в свою очередь,увеличивает скорость доступа к ним.
Точно так же, данные могут добавиться из тех больших блоков данных (папок), на стол, для быстрого использования, к примеру, какой-либо документ. Когда этот документ становится не нужным, его помещают назад в шкаф (в оперативную память), тем самым очищая стол (кэш-память) и освобождая этот стол для новых документов, которые будут использоваться в последующий отрезок времени.
Также и с кэш-памятью, если есть какие-то данные, к которым вероятнее всего будет повторное обращение, то эти данные из оперативной памяти, подгружаются в кэш-память. Очень часто, это происходит с совместной загрузкой тех данных, которые вероятнее всего, будут использоваться после текущих данных. То есть, здесь присутствует наличие предположений о том, что же будет использовано «после». Вот такие непростые принципы функционирования.
Уровни кэш-память
После понимания, что такое кэш-память, давайте посмотрим, сколько существует типов или уровней кеш-памяти.
Есть 4 возможных уровня (L), и они организованы иерархически:
- L1 или кэш первого уровня. Он является внутренним по отношению к процессору и часто разделяется на кэш данных и кэш инструкций.
- L2 или кэш второго уровня. Он может быть как внутренним, так и внешним, и не различает данные и инструкции.
- L3 или кэш третьего уровня. Он может быть как внутренним, так и внешним, но может вовсе отсутствовать. Он не различает данных и инструкций.
Тесты удвоения объёма кеша L3 процессора
Современный процессор является сложным устройством, которое выполняет множество действий для решения поставленной задачи. И делает это всё современный процессор очень быстро. Настолько, что даже несмотря на название «оперативная память», память эта недостаточно оперативная. Если бы процессор всегда ждал данных из оперативной памяти, то ему приходилось бы простаивать по несколько десятков, а временами, и сотен тактов не делая ничего. Подобное поведение сделало бы любые улучшения внутри ядер процессора полностью бесполезными. И, если посмотреть в историю развития процессоров, проблема эта с ростом производительности процессоров становилась всё более острой. Вначале появлялись опциональные чипы кэша процессора, то есть места на плате куда можно установить чип памяти кеша L2. С ростом производительности такая «опция» уже перестала появляться, так как потери производительности без него становились слишком большими. Та же судьба была и у L3, который так же был вначале прерогативой серверных решений и располагался вне процессора и только с развитием полупроводникового производства на общем кристалле с ядрами стало достаточно места чтобы разместить ещё и кэш L3.
Кэши L2 и L3 позволяют получать процессору данные максимально быстро. В современных моделях задержки достигают единиц наносекунд. Что, в прочим, тоже для процессора довольно долго. Но современные архитектуры процессоров на подобные задержки и рассчитаны. Естественно процессор не будет пропускать по несколько тактов работы ожидая данные из кеша L3. Для того чтобы такое не случалось внутри процессорного конвейера организовываются очереди микроопераций, в которых они и выдерживаются до тех пор пока необходимые данные не будут доступны для использования уже в регистровой памяти процессора.
Схема процессорного конвейера ядра intel архитектуры Skylake с выделенными регистрами
Но если так случилось, что микрооперация попала в конвейер, а данные для её выполнения расположены не в каком-то из кэшей, а в оперативной памяти (или вообще в постоянной памяти), то процессору ничего не остаётся как пропустить эту микрооперацию, оставив её в очереди, и выполнять следующие за ней мирооперации. И называется это «мероприятие» промах в кэш (Cache Miss).
Проблема тут в том, что для следующих микроопераций могут быть нужны данные которые должны были быть получены в той, что «застряла» в очереди… И всё это нарастает как снежный ком, который в конечном итоге приводит к тому, что часть времени процессор будет простаивать, не развивая свою максимальную теоретическую производительность.
И естественно, что чем больше объём кэш памяти, тем реже будут происходить промахи в кэш, а значит реже будут простои, что в свою очередь приведёт к росту производительности в реальных задачах.
Насколько большая разница от изменения объёма?
И встаёт закономерный вопрос: «На сколько же велико влияние?».
Ответ на него, к сожалению, однозначным быть не может, так как всё зависит от конкретного приложения. Если его данные и все создаваемые им результаты помещаются в кэш, то последующее увеличение размера кэша вообще не приведёт к росту производительности. А если приложение постоянно обращается к совершенно разным участкам памяти, плохо оптимизировано под использование только что созданных процессором результатов, которые только-только были записаны в кэш, то разница от увеличения объёма может быть несколько крат.
Производители процессоров подбирают объёмы регистов и кэша исходя из экономической целесообразности, тратя транзисторный бюджет на то, что будет давать большую производительность при равной цене.
Для некой усреднённой задачи может получится зависимость производительности от цены при изменения объёма кэша примерно такая:
Где рыжая линия показывает динамику изменения соотношений цены/производительности от увеличения объёма кэша. До определённого объёма — увеличение кэша приводит к значительному росту производительности так-как снижает частоту критичных состояний процессора когда он простаивает от промахов в кэш. Но при дальнейшем росте объёма всё меньше задач будут выполняться со значительными потерями в производительности, при дальнейшем росте стоимости процессора из-за увеличения кэш памяти.
Как измерить разницу от объёма?
И перейдём уже к практической области решения данного вопроса.
Для того чтобы понять разницу необходима некая конфигурация систем в которых отличия ограничиваются только объёмом кэш памяти.
В нашем случае это процессоры i7 7700k и i9 9900k. В последнем отключено 4 ядра из восьми (кэш память при этом не отключается).
В данном случае могла бы быть проблема связанная с программными исправлениями аппаратных уязвимостей более новых процессоров. Решена она запуском процессора i9 9900k на материнской плате ASUS Z170i Pro Gaming с BIOS версией 2002. К моменту выхода прошивки этой материнской платы об аппаратных уязвимостях сведений ещё не было и исправления их в тестовых системах — нет.
Про то как установить процессоры 8 и 9 поколений на платы для 6 и 7 поколений процессоров можете посмотреть тут.
Кроме процессора важно выбрать оперативную память. Я решил взять некие средние для DDR4 показатели. Частоту 3600 МГц с таймингами 17-18-18-38 CR2. Все субтайминги материнская плата выставляла автоматически.
Для игр так же стоит упомянуть о видеокарте: Gainward GeForce RTX 2070 Phoenix с небольшим заводским разгоном.
Обзор видеокарты можно посмотреть тут.
Важно чтобы в играх производительность ограничивалась именно процессором, а не видеокартой. Если у процессора будет возможность делать простои, то именно в них все проблемы по накапливанию невыполнимых операций и будут решаться без вреда для производительности игры. Так что в играх тесты сделаны на пресетах максимальных настроек, но без сглаживания и в сниженном разрешении (768р).
Результаты
Для начала проведём тест который покажет, что объём кэша действительно разный.
Тест кэша и памяти в Sandra
Тест задержек кэша и памяти позволяет увидеть переходы к разным уровням кэша и на оперативную память по увеличению задержек. График отлично показывает разницу в объёме кэша L3 по смещению долгих задержек от оперативной памяти (график логарифмический, поэтому двукратная разница в объёме выглядит не двукратной на глаз).
Теперь, убедившись в том, что всё идёт по плану можно перейти к бэнчмаркам, которые плохо реагируют на разгон памяти. Теоретически они должны слабо реагировать и на увеличение объёма кеша, так как отсутствие прироста от памяти говорит о малом числе промахов в кэш.
Все тесты проводились по 3 раза с усреднением результатов.
В однопоточном тесте CPU-z разницы от увеличения объёма кеша L3 — нет. В многопоточном разница — 3%
В Cinebench R15 разница 0,4% (незначительно превышает погрешности теста).
Тесты которые слабо реагируют на разгон памяти слабо реагируют и на увеличение объёма кэш памяти.
Далее рассмотрим блок тестов, в которых бенчмарки зависимые от частоты и задержек памяти.
Win-rar. Прирост производительности — 35%. Стоит отметить, что встроенный бенчмарк не отражает реальный прирост производительности архиватора.
7-Zip. Прирост 4,5%.
CPU тест 3D Mark Time Spy. Прирост 3,7%
Все бенчмарки
Выводы по бэнчмаркам
В идеальных задачах максимально оптимизированных для процессора и работы с памятью прирост находится в пределах 0-2%.
Для задач имеющий меньшую оптимизацию или связанных с работой с данными прирост от увеличения объёма кэш памяти составил от 3,7 до 35%.
Оптимизировать игры так чтобы они выполнялись только в объёме кэш памяти без промахов — практически невозможно. Подготовка и отрисовка игровых кадров требуют от процессора постоянной смены выполняемых действий, что, неизбежно, приводит к нехватке объёма кэш памяти и учащению промахов в кэш.
Far Cry 5
Время кадра
Плотность вероятности
Распределение вероятности
На графиках выше можно увидеть разницу и без цифр. На графиках изображены все удачные прогоны бенчмарка. Все они нанесены для оценки отличий результатов от погрешностей проведения тестов.
Результаты в цифрах:
AVG | Low 0.1% | Low 1% | Low 5% | Медиана | |
FC5 8МБ 3600 | 107.8 | 57.2 | 68.0 | 80.9 | 106.0 |
FC5 16МБ 3600 | 123.0 | 73.2 | 82.1 | 92.7 | 118.0 |
Прирост, % | 14.1 | 28.0 | 20.8 | 14.5 | 11.3 |
Медианный прирост: 11,3%
Прирост по долгим кадрам: Меньшие 0,1% — 28%, Меньшие 1% — 20,8%.
WatchDogs 2
Время кадра
Плотность вероятности
Распределение вероятности
AVG | Low 0.1% | Low 1% | Low 5% | Медиана | |
FC5 8МБ 3600 | 51.2 | 28.5 | 31.9 | 37.2 | 50.6 |
FC5 16МБ 3600 | 58.7 | 34.7 | 39.1 | 44.3 | 58.0 |
Прирост, % | 14.6 | 21.8 | 22.4 | 19.1 | 14.5 |
Медианный прирост: 14.5%
Прирост по долгим кадрам: Меньшие 0,1% — 21,8%, Меньшие 1% — 22,4%.
Выводы по играм
Прирост в играх превышает общие значения полученные в бенчмарках (кроме Win-rar) и составляют значения выше 10%, что является довольно значительным показателем.
Видео версия
Общие выводы
В целом — реакция на рост объёма кэш памяти сопоставима с разгоном памяти, что и логично, ведь кэш память является частью подсистемы памяти процессора равно как и оперативная память. В данном видео было измерено влияние на производительность от промахов в кэш, в дальнейших тестах я планирую установить характер падения производительности при ухудшении памяти как по пропускной способности, так и по задержкам, что должно вызывать большие трудности по организации выполнения микроопераций процессором и изменению полученных падений производительности.
Отсутствует кеш или данные не найдены
Одна из самых больших проблем с производительностью — это когда происходит промах в кэше, когда данные не найдены на уровне кеша. Это чрезвычайно опасно для производительности ЦП, вышедшего из строя, поскольку следствием этого является большое количество потерянных циклов процессора, но не менее опасно для ЦП, вышедшего из строя.
При проектировании ЦП тот факт, что общее время поиска всех промахов в кэше вместе со временем поиска больше, чем поиск данных непосредственно в кэше, является ошибкой. Многие проекты ЦП пришлось вернуться к таблице параметров из-за того, что время поиска больше, чем доступ к ОЗУ.
Вот почему архитекторы очень неохотно добавляют дополнительные уровни в архитектуру, потому что да, это должно быть оправдано перед лицом улучшенной производительности.
Иерархия кэш-памяти
Любой современный процессор имеет в своей структуре несколько уровней кэш-памяти. В спецификации процессора они обозначаются как L1, L2, L3 и т. д.
Если провести аналогию между устройством кэш-памяти процессора и рабочим местом, скажем столяра или представителя любой другой профессии, то можно увидеть интересную закономерность. Наиболее востребованный в работе инструмент находится под рукой, а тот, что используется реже, расположен дальше от рабочей зоны.
Так же организована и работа быстрых ячеек кэша. Ячейки памяти первого уровня (L1) располагаются на кристалле в непосредственной близости от вычислительного ядра. Эта память — самая быстрая, но и самая малая по объему. В нее помещаются наиболее востребованные данные и команды. Для передачи данных оттуда потребуется всего около 5 тактовых циклов. Как правило, кэш-память первого уровня состоит из двух блоков, каждый из которых имеет размер 32 КБ. Один из них — кэш данных первого уровня, второй — кэш инструкций первого уровня. Они отвечают за работу с блоками данных и молниеносное обращение к командам.
Кэш второго и третьего уровня больше по объему, но за счет того, что L2 и L3 удалены от вычислительного ядра, при обращении к ним будут более длительные временные интервалы. Более наглядно устройство кэш-памяти проиллюстрировано в следующем видео.
Кэш L2, который также содержит команды и данные, занимает уже до 512 КБ, чтобы обеспечить необходимый объем данных кэшу нижнего уровня. Но на обработку запросов уходит в два раза больше времени. Кэш третьего уровня имеет размеры уже от 2 до 32 МБ (и постоянно увеличивается вслед за развитием технологий), но и его скорость заметно ниже. Она превышает 30 тактовых циклов.
Процессор запрашивает команды и данные, обрабатывая их, что называется, параллельными курсами. За счет этого и достигается потрясающая скорость работы. В качестве примера рассмотрим процессоры Intel. Принцип работы таков: в кэше хранятся данные и их адрес (тэг кэша). Сначала процессор ищет их в L1. Если информация не найдена (возник промах кэша), то в L1 будет создан новый тэг, а поиск данных продолжится на других уровнях. Для того, чтобы освободить место под новый тэг, информация, не используемая в данный момент, переносится на уровень L2. В результате данные постоянно перемещаются с одного уровня на другой.
С кэшем связан термин «сет ассоциативности». В L1 блок данных привязан к строкам кэша в определенном сете (блоке кэша). Так, например, 8-way (8 уровень ассоциативности) означает, что один блок может быть привязан к 8 строкам кэша. Чем выше уровень, тем выше шанс на попадание кэша (процессор нашел требуемую информацию). Есть и недостатки. Главные — усложнение процесса и соответствующее снижение производительности.
Также при хранении одних и тех же данных могут задействоваться различные уровни кэша, например, L1 и L3. Это так называемые инклюзивные кэши. Использование лишнего объема памяти окупается скоростью поиска. Если процессор не нашел данные на нижнем уровне, ему не придется искать их на верхних уровнях кэша. В этом случае задействованы кэши-жертвы. Это полностью ассоциативный кэш, который используется для хранения блоков, вытесненных из кэша при замене. Он предназначен для уменьшения количества промахов. Например, кэши-жертвы L3 будут хранить информацию из L2. В то же время данные, которые хранятся в L2, остаются только там, что помогает сэкономить место в памяти, однако усложняет поиск данных: системе приходится искать необходимый тэг в L3, который заметно больше по размеру.
В некоторых политиках записи информация хранится в кэше и основной системной памяти. Современные процессоры работают следующим образом: когда данные пишутся в кэш, происходит задержка перед тем, как эта информация будет записана в системную память. Во время задержки данные остаются в кэше, после чего их «вытесняет» в ОЗУ.
Итак, кэш-память процессора — очень важный параметр современного процессора. От количества уровней кэша и объема ячеек сверхбыстрой памяти на каждом из уровней, во многом зависит скорость и производительность системы. Особенно хорошо это ощущается в компьютерах, ориентированных на гейминг или сложные вычисления.