L1, L2 и L3 кэш. Определение

Оригинал тут.

L1, L2 и L3 кэш. Определение

В любом процессоре компьютера, дешевого ноутбука или сервера за миллион долларов, везде есть кэш. И он имеет в себе несколько уровней.

Должно быть важный компонент, иначе зачем он там? Чем занимается кэш, и зачем ему несколько уровней? Что вообще означает 12-позиционная ассоциативность?

Что такое кэш?

Говоря кратко: Это небольшая, но очень быстрая память, которая располагается рядом с логическими блоками процессора.

Но, конечно, мы хотим узнать гораздо больше о кэше…

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

Процессору потребовались бы только логические модули для сложения, умножения и т.д., а также система для обработки передачи данных. Это связано с тем, что наша теоретическая система хранения данных может мгновенно посылать и получать все необходимые числа; ни один из логических блоков не будет пребывать в ожидании передачи данных.

Но, как мы все знаем, нет никакой магической технологии хранения данных. Вместо этого у нас есть жесткие (HDD) или твердотельные (SSD) диски, и даже самые лучшие из них не способны обрабатывать все передачи данных, необходимые для обычного процессора.

Великий слон хранения данных.
Великий слон хранения данных.

Причина, почему современные процессоры такие быстрые заключается в том, что им требуется всего один тактовый цикл, чтобы сложить вместе два 64-битных целочисленных значения. Для чипа с частотой в 4 Ггц этот процесс займет всего лишь 00000000025 секунд или четверть наносекунды.

Тем временем, жестким дискам требуется тысячи наносекунд, чтобы найти данные, не говоря о том, что их еще нужно перенести. А твердотельным накопителям — десятки или сотни наносекунд.

Диски такого рода не могут быть встроены в процессор, это понятно. Иначе они были бы физически разделены. Это в свою очередь, лишь увеличило бы время на передачу данных.

Второй великий слон хранения данных, к сожалению.
Второй великий слон хранения данных, к сожалению.

Поэтому нам нужна еще одна система хранения данных, которая находится между процессором и основным хранилищем. Она должна быть быстрее диска, а также способна обрабатывать большое количество данных одновременно и быть намного ближе к процессору.

Что ж, у нас уже есть такая система – оперативная память (RAM). И в этом её основная задача.

Практически все «оперативки» состоят из динамической памяти с произвольным доступом (DRAM). Она намного быстрей любого другого диска.

L1, L2 и L3 кэш. Определение

Несмотря на то, что что DRAM работает очень быстро, объем памяти оставляет желать лучшего.

Самые большие чипы памяти DDR4 от Micron, способны вмещать в себе 32 Гбит или 4 ГБ данных. В то же время, самые ёмкие жесткие диски обладают объемом в 4000 раз больше.

Таким образом, хоть мы и увеличили скорость передачи данных, нужно понять, что требуется для процессора в первую очередь, ведь память сильно ограничена. Этими решениями занимается аппаратное и программное обеспечение.

По крайней мере, DRAM может быть произведен в корпусе чипа (встроенный DRAM). Но процессоры довольно маленькие, поэтому возможности вставить много памяти нету.

10 Мб ОЗУ. Слева от ГП Xbox 360.
10 Мб ОЗУ. Слева от ГП Xbox 360.

Подавляющее большинство DRAM располагается прямо рядом с процессором, который в свою очередь подключен к мат. плате. Самый близкий компонент к процессору, и тем не менее, еще недостаточно быстрый.

DRAM все еще тратит примерно 100 наносекунд чтобы найти данные, но передавать их, он способен на скорости миллиардов битов в секунду. Кажется, что нам требуется еще одно звено между процессором и DRAM.

На сцену выходит SRAM (статическая память с произвольным доступом). Там, где DRAM использует микроскопические конденсаторы для хранения данных в виде электрического заряда, SRAM использует транзисторы. И они могут работать почти так же быстро, как логические модули в процессоре (примерно в 10 раз быстрее, чем DRAM).

L1, L2 и L3 кэш. Определение

У SRAM есть недостаток, и дело опять в объёме.

Транзисторная память занимает намного больше места, чем DRAM. DDR4 с размером в 4Гб эквивалентен лишь 100Мб SRAM. Но, поскольку проектирование ЦП схоже с SRAM, его можно встроить в сам процессор, расположив максимально близко к логическим устройствам.

Каждый раз, увеличивая скорость, объем для хранения уменьшается. Мы могли бы продолжать добавлять больше разделов, каждый из которых был бы быстрее, но меньше.

Таким образом, мы пришли к более техническому определению того, что такое кэш: Это несколько блоков SRAM, которые расположены внутри процессора. Они используются для того, чтобы обеспечить максимальную загрузку логических блоков, отправляя и сохраняя данные на сверхбыстрой скорости. Довольны? Ну и хорошо. С этого момента всё становится намного сложнее!

Кэш: многоуровневая парковка

Как мы уже говорили, кэш необходим, так как в процессоре нет волшебной системы хранения данных, способной удовлетворить потребности логических модулей в данных. Современные ЦП и ГП содержат ряд блоков SRAM, которые организованы в иерархию — последовательность кэшей, которая упорядочена следующим образом:

L1, L2 и L3 кэш. Определение

На изображении выше процессор представлен черным пунктирным прямоугольником. ALU (арифметико-логическое устройство) находится слева. Эта структура питает процессор и обрабатывает математику. Технически это не кэш. Ближайшим уровнем памяти к ALU являются регистры (они сгруппированы в файл регистров).

Каждый из них содержит одно число, например, 64-битное целое. Его значение может быть частью данных о чём-то, кодом конкретной инструкции или адресом памяти каких-то других данных.

Файл регистра в десктопном процессоре весьма мал — например, в Intel Core i9-9900K их по два «банка» в каждом ядре. Одно для целых чисел, всего 180 64-битных регистров. Другой файл регистра для векторов (маленьких массивов чисел), 168 256-битных записей. Таким образом, общий файл регистра для каждого ядра — чуть меньше 7 кБ. Для сравнения, размер файла регистра в потоковом мультипроцессоре (эквивалент ядра GPU) Nvidia GeForce RTX 2080 Ti составляет 256 кБ.

Регистры — это SRAM, как и кэш, но они такие же быстрые, как и ALU, которую они обслуживают, перемещая данные за один тактовый цикл. Но они не предназначены для хранения очень большого количества данных (только одна часть), поэтому рядом всегда есть несколько больших блоков памяти: это кэш 1-го уровня.

Процессор Intel Skylake. Увеличенное изображение одного из ядер.
Процессор Intel Skylake. Увеличенное изображение одного из ядер.

Приведенное выше изображение представляет собой увеличенный снимок одного из ядер процессора Intel Skylake.

ALU и файлы реестра видны слева. Они выделены зеленым цветом. В верхней части фото, посередине, белым цветом обозначен L1 кэш. В нем не так много информации, всего 32 кБ, но, как и в регистрах, он очень близок к логическим блокам и работает с той же скоростью, что и они.

Другой белый прямоугольник указывает на второй кэш инструкций 1-го уровня, тоже 32 кБ. Как следует из названия, в нем хранятся различные команды, которые будут разделены на более мелкие, так называемые микро операции (обычно помеченные как μops). Все они будут переданы в ALU. Для них тоже есть кэш, L0, так как он меньше (содержит только 1500 операций) и ближе, чем L1 кэш.

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

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

L2 кэш в Skylake.
L2 кэш в Skylake.

Будь это единственным кэшом в процессоре, его производительность внезапно бы зашла в тупик. Поэтому у них есть другой уровень памяти, который встроен в ядро: L2 кэш. Это общий блок памяти, хранящий инструкции и данные.

Он всегда немного больше, чем 1-й уровень: процессоры AMD Zen 2, например, содержат до 512 кБ, так что кэши нижнего уровня находятся в хорошей кондиции. Однако дополнительный размер влечет за собой задержку на поиск и передачу данных из этого кэша. Уходит примерно вдвое больше времени, чем в L1.

Вспоминая Intel Pentium, тогда L2 кэш представлял собой отдельный чип, который находился на небольшой подключаемой плате (например, RAM DIMM), либо был встроен в материнскую плату. В конце концов, L2 таки попал в корпус процессора. Интеграция в процессорную матрицу, на чипах Pentium III и AMD K6-III.

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

Процессор Intel Kaby Lake.
Процессор Intel Kaby Lake.

На этом изображении Intel Kaby Lake, слева посередине показаны 4 ядра (встроенный GPU занимает почти половину матрицы, справа). Каждое ядро имеет свой собственный набор кэшей уровня 1 и 2 (выделены белым и желтым, соответственно), но у них также есть третий набор блоков SRAM.

L3 кэш хоть и окружает одно ядро, полностью отделен от других. Каждый из них может получить свободный доступ к содержимому чужого кэша 3го уровня. Он намного больше (от 2 до 32 MB), но также намного медленнее, в среднем 30 циклов, особенно если ядру необходимо использовать данные, которые находятся в блоке кэша, находящемся на некотором расстоянии.

Ниже мы видим одно из ядер AMD Zen 2: 32 кБ кэша 1го уровня (белый цвет), 512 кБ 2го уровня (желтый цвет) и огромный блок L3 кэша размером в 4 МБ (красный цвет).

AMD Zen 2. Одно из ядер.
AMD Zen 2. Одно из ядер.

Стоп. Как 32 кБ может физически занимать больше места, чем 512 кБ? Если L1 содержит так мало данных, почему он намного больше, чем L2 или L3 кэш?

Больше, чем просто число

Кэш повышает производительность компьютера за счет ускорения передачи данных в логические модули и хранения рядом с ними копии часто используемых инструкций и данных. Информация, хранящаяся в кэше, разделена на две части: сами данные и место, где они изначально находились в системной памяти/хранилище — этот адрес называется кэш-тегом.

Когда процессор выполняет операцию по чтению или записи данных из или в память, он начинает с проверки тегов в кэше 1-го уровня. Если нужный тег присутствует, то доступ к этим данным можно получить практически сразу. Несовпадения происходят тогда, когда требуемый тег не находится на самом низком уровне кэша.

Таким образом, в кэше L1 создается новый тег, а остальная часть процессора берет на себя поиск данных для этого тега, через другие уровни кэша (вплоть до основного накопителя, если это необходимо). Но чтобы освободить место в кэше L1 для этого нового тега, в L2 обязательно должно быть загружено что-то другое.

Это приводит к почти постоянному перетасовыванию данных, и все это достигается всего лишь за несколько тактовых циклов. Единственный способ достичь этого — иметь сложную структуру вокруг SRAM, для управления данными. Скажем иначе: если бы ядро процессора состояло всего из одного ALU, то кэш L1 был бы намного проще, но поскольку их десятки (многие из которых будут пропускать через себя два потока с инструкциями), то кэш требует множество соединений, чтобы продолжать работу.

L1, L2 и L3 кэш. Определение

Для проверки кэша в собственном процессоре, вы можете использовать бесплатные программы, такие как CPU-Z. Но что означает вся эта информация? Важным элементом является ассоциативный сет меток — это все о правилах, применяемых при копировании в кэш блоков данных из системной памяти.

Вышеуказанная информация c Intel Core i7-9700K. Его кэши 1-го уровня разбиты на 64 маленьких блока, называемых наборами, и каждый из них далее разбивается на строки кэша (размером 64 байта). Ассоциативный сет означает, что блок данных из системной памяти отображается на кэш-линии в одном конкретном наборе, а не где угодно.

«х8» говорит нам о том, что один блок может быть ассоциирован с 8 строками кэша в наборе. Чем выше уровень ассоциативности (т.е. больше «способов»), тем больше шансов получить попадание в кэш в то время, когда процессор занимается поиском данных, а также снижает количество ошибок, вызванных промахами в кэше. К недостаткам можно отнести: общую сложность, увеличенное энергопотребление, а также сниженную производительность, так как должны обрабатываться больше линии кэша для получения блока данных.

Кэш L1+L2 включительно. L3 кэш память жертвы. Политика обратной записи, даже ECC (память с коррекцией ошибок).
Кэш L1+L2 включительно. L3 кэш память жертвы. Политика обратной записи, даже ECC (память с коррекцией ошибок).

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

Другой аспект сложности кэша заключается в том, как данные хранятся на различных уровнях. Правила устанавливаются в так называемой политике включения. Например, процессоры Intel Core имеют полностью инклюзивный кэш L1+L3. Это означает, что одни и те же данные на первом уровне могут быть и на третьем. Может показаться, что это пустая трата ценной кэш-памяти, но есть главное преимущество: если процессор промахивается при поиске тега на более низком уровне, ему не нужно искать его на более высоком уровне.

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

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

Графический процессор Nvidia GA100, оснащенный L1 кэшом (20 МБ) и L2 кэшом (40 МБ).
Графический процессор Nvidia GA100, оснащенный L1 кэшом (20 МБ) и L2 кэшом (40 МБ).

Для проектировщиков процессоров выбор объема, типа и политики кэширования это – поиск баланса между расширенными возможностями чипа и общей повышенной сложностью, а также требуемым пространством для матрицы. Если бы было возможным создать 20 МБ, 1000-сторонний полностью ассоциативный кэш 1-го уровня, и чтобы чип не стал размером с Манхэттен (и потреблял столько же энергии), то у всех стояли бы компьютеры с такими процессорами!

Самый низкий уровень кэширования в современных процессорах не сильно изменился за последнее десятилетие . Однако, L3 кэш продолжает расти в размерах. Десять лет назад, если вам посчастливилось быть владельцем Intel i7-980X за 999 долларов, вы могли получить 12 МБ кэша 3го уровня. За половину этой суммы сегодня вы получаете 64 МБ.

Кэш, в двух словах: безусловно нужная и удивительная технология. Мы не рассматривали другие типы кэшей в CPU и GPU (такие как буфер ассоциативной трансляции [TLB] или кэш текстур), но так как все они следуют простой структуре и шаблону уровней, вам уже не покажется сложным разобраться в них.

Был ли у вас компьютер с отдельным L2 кэшем на материнской плате? Как насчет тех процессоров Pentium II и Celeron (в частности 300a), которые поставлялись в качестве дочерних плат? Можете ли вы вспомнить свой первый процессор с общим L3? Расскажите нам об этом в комментариях.

425425
62 комментария