Найти в Дзене
OVERCLOCKERS.RU

Кэш процессора — что это такое и как он заставляет ваш компьютер работать быстрее (часть 2)

Оглавление

Продолжаем погружаться в историю и логику работы кэш-памяти. В первой части мы остановились на том, как идея «быстрого блокнота» для процессора превратилась из дорогой экзотики для мэйнфреймов в обязательный элемент любого чипа. Мы увидели, как кэш переехал с материнской платы прямо на кристалл процессора, а также познакомились с принципами, на которых он построен. Выражаю благодарность пользователям, которые поддержали мою идею в комментариях к предыдущему посту.

Если вы пропустили, то рекомендую ознакомится: Кэш процессора — что это такое и как он заставляет ваш компьютер работать быстрее (часть 1).

Если кратко: кэш (от слова cache - тайник, а не cash - наличка) появился, потому что процессор стал слишком быстрым. Он тратил большую часть тактов (времени) впустую, ожидая данные из медленной оперативной памяти. Кэш стал буфером, который позволил процессору работать почти без простоев.

Но на этом история не заканчивается. Один маленький кэш быстро перестал справляться. Сегодня мы разберёмся:

  • Почему один кэш превратился в три. Зачем процессору целая иерархия из L1, L2 и L3, и чем они отличаются.
  • С какими проблемами сталкиваются инженеры. Какую цену пришлось заплатить за высокую скорость и как заставить несколько ядер «договариваться» между собой.
  • Что будет дальше? В каком направлении будет развиваться технология, когда физические ограничения уже стали реальностью.
-2

32 МБ кэша 3-го уровня в середине кристалла, на примере Ryzen 5 9600X

Когда одного «блокнота» стало мало

Идея с кэшем сработала блестяще. Но технологии не стояли на месте. Процессоры продолжали ускоряться, а память - отставать. И вскоре инженеры упёрлись в проблему. Быструю память (SRAM) делать большой оказалось очень дорого и энергозатратно. Она занимает много места на кристалле. Сделать один большой и быстрый кэш — невозможно. Но и одного маленького кэша L1 стало недостаточно, чтобы обеспечить данными прожорливый CPU. Решение родилось элегантное, как матрёшка. Инженеры предложили использовать не один, а несколько уровней памяти. Менее быстрой, чем L1, но всё ещё быстрой относительно ОЗУ. Так родилась многоуровневая иерархия кэш-памяти.

Приведу грубый пример, но он поможет понять смысл. Допустим, вы работаете за письменным столом. Решаете задачи или заполняете документы.

Кэш L1 (Уровень 1): Ваш карман. Это самый быстрый, самый дорогой и самый маленький кэш. Он физически вшит прямо в ядро процессора. Настолько близко, что задержка практически нулевая. Он разделён на две части: кэш инструкций (что делать) и кэш данных (с чем делать). Объём у него небольшой — всего несколько десятков килобайт. Но это то, что вам нужно прямо сейчас. Это как ручка и блокнот. Они уже у вас в руках.

Кэш L2 (Уровень 2): Выдвижной ящик стола. Он побольше (сотни килобайт — несколько мегабайт) и чуть медленнее, чем L1. Но всё равно он находится очень близко к ядру (часто прямо на том же кристалле, просто в другой его части). Это ваши запасы: ластик, линейка, скрепки, скотч и тд. То, что вы используете не каждую секунду, но довольно часто, чтобы держать под рукой, а не идти к шкафу.

Кэш L3 (Уровень 3): Общий шкаф в углу комнаты. Этот кэш большой (десятки мегабайт) и относительно медленный. Но его ключевая особенность в том, что он общий для всех ядер процессора. Не важно, сколько ядер в процессоре: 4, 6, 8 или 16 ядер. У каждого ядра есть свои личные «карманы» (L1) и «ящики» (L2), но все они ходят к одному «шкафу» (L3). Он служит не только для хранения данных, но и для координации между ядрами. Если одно ядро работало с какими-то данными, а второму они вдруг понадобились, они «встречаются» в L3, а не идут для этого в медленную оперативную память.

-3

Как это работает в жизни? Допустим, ядру нужны данные.

  1. Сначала оно лезет в L1. Промах.
  2. Не беда, проверяет L2. Снова промах.
  3. Тогда оно смотрит в общий L3. Если повезёт — попадание! Данные найдены, и ядро забирает их к себе в L2 и L1 (на всякий случай).
  4. Если и в L3 данных нет, то только тогда происходит долгий поход в основную оперативную память.

Эта многоуровневая система — компромисс между скоростью, стоимостью и размером. Она позволила процессору в 99% случаев работать с данными на своей собственной, сверхбыстрой территории, уменьшив количество обращений к медленной ОЗУ. Без этой иерархии все современные многоядерные процессоры томились бы в ожидании данных.

Обратная сторона скорости

Хотя кэш и произвёл революцию, он не стал волшебной таблеткой. За его скорость пришлось платить, и инженеры постоянно вынуждены искать компромиссы. Создав сверхоперативную память, учёные открыли целый мир сложных проблем. Рассмотрим основные.

Место и деньги

Быстрая SRAM-память, из которой делают кэш, устроена сложнее, чем обычная оперативная память (DRAM). Одна ячейка SRAM — это 6 транзисторов, а в DRAM — всего один.

-4

Сравнение ячейки памяти DRAM и SRAM

В итоге кэш занимает драгоценное место на кристалле процессора. Если вы посмотрите на схему современного CPU, вы увидите, что большая часть его площади занята не вычислительными ядрами, а именно кэшем (особенно L3). Это место можно было бы отдать под дополнительные ядра, но тогда они будут простаивать.

-5

Расположение кэша разных уровней

Энергопотребление

Кэш — один из главных пожирателей энергии в процессоре. Чем он больше и чем быстрее он работает, тем больше тока ему нужно. Это прямая проблема для смартфонов и ноутбуков, работающих от батареи. Инженеры постоянно балансируют: отключать часть кэша в режиме простоя? Снижать его частоту? А может и вовсе не добавлять на кристалл?

Самая интересная проблема — когерентность

Представьте, что у вас в офисе несколько сотрудников (ядер процессора). У каждого есть свой личный блокнот (кэш L1/L2). Они работают с одним и тем же документом.

  • Первый сотрудник берёт исходные данные и копирует их в свой блокнот;
  • Он что-то в них меняет;
  • А второй сотрудник в это время смотрит на старую версию данных из общего шкафа (L3);
  • В итоге данные расходятся.

Чтобы этого не происходило, существует сложнейший механизм. Он именуется протоколом когерентности кэшей (главный из них называется MESI). Его задача — следить, чтобы у всех ядер была актуальная версия данных.

Протокол MESI помечает каждую «порцию» данных в кэше специальными состояниями:

  • Modified (Изменённые): Данные есть только в моём кэше, и я их поменял. Я главный по этим данным, и именно у меня самая свежая версия.
  • Exclusive (Эсклюзивные): Данные есть только в моём кэше, но они ещё не изменены. Я могу спокойно с ними работать.
  • Shared (Разделяемые): Данные есть в моём кэше и, возможно, в кэшах других ядер. Все версии одинаковые. Я могу их читать, но, чтобы изменить, должен всех предупредить.
  • Invalid (Недействительные): Данные в моём кэше устарели. Кто-то другой их уже поменял. Мне нельзя их использовать, нужно запросить свежие.

Представьте, что теперь ядра постоянно перешёптываются друг с другом: «Эй, я собираюсь менять эти данные, вы все помечайте свои копии как недействительные!» или «У кого-нибудь есть свежая версия этого файла?». Вся эта возня отнимает время и энергию. Но без неё многоядерный процессор был бы просто невозможен. Он превратился бы в кучку ядер, работающих с противоречивой информацией.

-6

Расположение дополнительного L3 кэша (над ядрами) на примере R7 5800X3D

Что дальше?

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

«Умный» кэш и предсказания. Если нельзя радикально увеличить размер, можно радикально повысить КПД того, что есть. Будут совершенствоваться алгоритмы предсказания. Они уже и так сложные, но в будущем в них, я думаю, начнут активнее внедрять элементы ИИ. Чтобы кэш не просто угадывал, что вам понадобится скоро, а предсказывал, что понадобится через сотню тактов, анализируя шаблоны поведения программы.

Специализация. Вместо одного универсального кэша для всех задач, могут появится маленькие, но сверхэффективные кэши для конкретных нужд. Например, отдельно для графических ядер или для AI-блоков.

Изящное решение предложила компания AMD с технологией 3D V-Cache. Они не стали выискивать место на кристалле процессора. Они взяли обычный процессор и поверх основного кристалла с ядрами и стандартным кэшем L3 (или под основной кристалл для Ryzen 7000 и 9000), установили дополнительный кристалл, целиком состоящий из кэш-памяти, соединив их через тысячи микроскопических вертикальных переходов (TSV).

-7

Расположение кэша под кристаллом с ядрами процессора в Ryzen 7000 и 9000

Что это дало? Цифры говорят сами за себя: в процессоре AMD Ryzen 7 5800X3D они таким образом утроили объём кэша L3 — с 32 МБ до 96 МБ. И это без увеличения площади самого кристалла и без серьёзного роста энергопотребления. В результате, в играх и приложениях, которые жадны до данных, этот процессор показал колоссальный прирост производительности. Просто потому, что вероятность найти нужные данные в огромном кэше L3 стала близка к 100%. Это не ускорение «в лоб» за счёт частоты, а элегантное решение, которое убирает саму причину простоя — нехватку быстрой памяти.

-8

Обратите внимание, 5800X3D выдаёт на 40% больше ФПС, чем его собрат без 3D-кэша

Если убрать всю сложность, история кэша — это история об одном простом принципе: чтобы работать быстро, нужно держать главное под рукой. Мы рассмотрели путь эволюции кэш-памяти от огромных отдельных модулей в мэйнфреймах до наноструктур, вшитых в сердце процессора. От одного уровня до сложной иерархии.

В следующий раз, когда ваш компьютер откроет тяжёлую программу или плавно проскроллит сайт, вспомните о той невидимой, работе, что кипит в его ядре. О беге за данными из L1 в L3, о принципе когерентности ядер, синхронизирующих свои блокноты. Вся эта сложность существует ради одной простой цели — чтобы вы даже не задумывались о том, как это работает.

P.S. В статье использовано множество упрощений. Автор не претендует на истину в последней инстанции, а лишь пытается объяснить основную суть технологии, играющей огромную роль в современной микроэлектронике.