Почему размер кэша L1 меньше, чем размер кэша L2 в большинстве процессоров? - PullRequest
26 голосов
/ 12 января 2011

Почему размер кэша L1 меньше размера кэша L2 в большинстве процессоров?

Ответы [ 7 ]

43 голосов
/ 18 мая 2011

L1 очень тесно связан с ядром ЦП и доступен при каждом доступе к памяти (очень часто). Таким образом, он должен возвращать данные очень быстро (обычно в течение тактового цикла). Задержка и пропускная способность (пропускная способность) являются критичными для производительности для кэша данных L1. (например, задержка в четыре цикла и поддержка двух операций чтения и одной записи ядром ЦП каждый такт). Для поддержки этой высокой пропускной способности требуется много портов чтения / записи. Создание большого кэша с этими свойствами невозможно. Таким образом, дизайнеры делают его маленьким, например 32 КБ в большинстве процессоров сегодня.

Доступ к L2 возможен только при пропусках L1, поэтому доступ осуществляется реже (обычно 1/20 от L1). Таким образом, L2 может иметь большую задержку (например, от 10 до 20 циклов) и иметь меньше портов. Это позволяет дизайнерам сделать его больше.


L1 и L2 играют очень разные роли. Если L1 будет увеличен, это увеличит задержку доступа к L1, что резко снизит производительность, потому что это сделает все зависимые нагрузки медленнее и сложнее для скрытого выполнения. Размер L1 практически не обсуждается.

Если мы удалили L2, промахи L1 должны будут перейти на следующий уровень, скажем, в память. Это означает, что большой объем доступа будет поступать в память, что будет означать, что нам нужна дополнительная пропускная способность памяти, что уже является узким местом. Таким образом, держать L2 вокруг это выгодно.

Эксперты часто называют L1 фильтром задержки (поскольку это ускоряет общий случай попаданий L1), а L2 - фильтром полосы пропускания, поскольку он уменьшает использование полосы пропускания памяти.

Примечание. Я использовал двухуровневую иерархию кэша , чтобы упростить ее. Во многих современных многоядерных чипах кэш-память L3 совместно используется всеми ядрами, в то время как каждое ядро ​​имеет свой собственный L1 и, возможно, L2. В этих чипах общий кэш последнего уровня (L3) играет роль фильтра пропускной способности памяти. L2 играет роль фильтра пропускной способности внутри кристалла, то есть он уменьшает доступ к межсоединению внутри кристалла и L3. Это позволяет разработчикам использовать межсоединение с более низкой пропускной способностью, например, кольцо, и медленный однопортовый L3, что позволяет им увеличить L3.

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

29 голосов
/ 12 января 2011

Для этого есть разные причины.

L2 существует в системе, чтобы ускорить случай, когда происходит потеря кэша L1. Если бы размер L1 был таким же или больше, чем размер L2, то L2 не смог бы вместить больше строк кэша, чем L1, и не смог бы справиться с промахами кэша L1. С точки зрения дизайна / стоимости, кэш L1 связан с процессором и быстрее, чем L2. Основная идея кэшей заключается в том, что вы ускоряете доступ к более медленному оборудованию, добавляя промежуточное оборудование, которое является более производительным (и дорогим), чем самое медленное оборудование, и в то же время более дешевым, чем имеющееся у вас оборудование. Даже если вы решили удвоить кэш L1, вы также увеличите L2, чтобы ускорить промахи L1-кэша.

Так почему вообще существует кэш L2? Что ж, кэш L1 обычно более производительный и дорогой для сборки, и он привязан к одному ядру. Это означает, что увеличение размера L1 на фиксированное количество приведет к умножению этой стоимости на 4 в двухъядерном процессоре или на 8 в четырехъядерном процессоре. L2 обычно совместно используется разными ядрами - в зависимости от архитектуры его можно разделить между парой или всеми ядрами процессора, поэтому стоимость увеличения L2 будет меньше, даже если цены на L1 и L2 будут одинаковыми - что это не так.

18 голосов
/ 24 июля 2016

@ Ответ Аатера объясняет некоторые основы .Я добавлю еще несколько деталей + примеры реальной организации кэша на Intel Haswell и AMD Piledriver с задержками и другими свойствами, а не только размером.

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


L1 должен быть очень быстрым (задержка и пропускная способность), даже если это означает ограниченную частоту обращений .L1d также должен поддерживать однобайтовые хранилища почти на всех архитектурах и (в некоторых проектах) доступ с выравниванием.Это затрудняет использование ECC (кодов исправления ошибок) для защиты данных, и на самом деле некоторые модели L1d (Intel) просто используют четность, с лучшим ECC только на внешних уровнях кэша (L2 / L3), где можно использовать ECCна больших чанках для уменьшения накладных расходов.

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

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

Частота обращений L1 по-прежнему очень важна, поэтому кэши L1 не так малы /просто / быстро, как они могли бы быть, потому что это снизило бы рейтинг попаданий.Таким образом, достижение такой же общей производительности потребует более высоких уровней кэша, чтобы быть быстрее.Если более высокие уровни обрабатывают больше трафика, их задержка является большей составляющей средней задержки, и они чаще ограничивают свою пропускную способность (или нуждаются в более высокой пропускной способности).

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


L1 также использует трюки скоростиэто не сработало бы, если бы оно было больше .то есть большинство проектов используют виртуально-индексированные, физически помеченные (VIPT) L1, но со всеми битами индекса, идущими из-за смещения страницы, поэтому они ведут себя как PIPT (потому что младшие биты виртуального адреса одинаковыкак в физическом адресе).Это позволяет избежать синонимов / омонимов (ложные попадания или одни и те же данные находятся в кэше дважды, и увидеть подробный ответ Пола Клэйтона на связанный вопрос), но все же позволяет выполнять часть проверки попадания / пропуска параллельнопоиск TLB.Кэш VIVT не должен ждать TLB, но он должен быть недействительным при каждом изменении таблиц страниц.

На платформе x86 (которая использует страницы виртуальной памяти размером 4 КБ) 8-разрядные ассоциативные кэши L1 32 КБ распространены в современных разработках. Эти 8 тегов могут быть выбраны на основе младших 12 битов виртуального адреса, потому что эти биты одинаковы в виртуальных и физических адресах (они ниже смещения страницы для страниц размером 4 КБ). Этот скачок скорости для кэшей L1 работает, только если они достаточно малы и достаточно ассоциативны, чтобы индекс не зависел от результата TLB. 32киБ / 64В линий / 8-полосная ассоциативность = 64 (2 ^ 6) комплектов. Поэтому младшие 6 бит адреса выбирают байты в строке, а следующие 6 бит индекс представляют собой набор из 8 тегов. Этот набор из 8 тегов выбирается параллельно с поиском TLB, поэтому теги можно параллельно проверять по битам выбора физической страницы результата TLB, чтобы определить, какой (если есть) из 8 способов кэширования хранить данные .

Создание большего кеша L1 означало бы, что ему нужно либо дождаться результата TLB, прежде чем он сможет даже начать выбирать теги и загружать их в параллельные компараторы, либо увеличить ассоциативность, чтобы сохранить log2 (sets) + log2 (line_size) <= 12. (Больше ассоциативности означает больше путей на набор => меньше общих наборов = меньше индексных битов). Так, например кэш-память размером 64 КБ должна быть ассоциативной с 16 путями: по-прежнему 64 набора, но каждый набор имеет в два раза больше способов. Это делает увеличение размера L1 сверх текущего размера чрезмерно дорогим с точки зрения мощности и, возможно, даже задержки.

Если вы потратите больше своего бюджета мощности на логику кэша L1D, то останется меньше энергии для выполнения внеочередного выполнения, декодирования и, конечно, кэша L2 и т. Д. . Чтобы все ядро ​​работало на частоте 4 ГГц и выдерживало ~ 4 команды в такт (в коде с высоким ILP) без плавления, требуется сбалансированный дизайн. Смотрите эту статью: Современные микропроцессоры: руководство за 90 минут! .

Чем больше кеш, тем больше вы теряете, сбрасывая его, поэтому большой кеш VIVT L1 будет хуже, чем текущий VIPT, который работает как PIPT. И больший, но с большим временем ожидания L1D, вероятно, также будет хуже.

Согласно @ PaulClayton , кэши L1 часто извлекают все данные в наборе параллельно с тегами, поэтому они готовы для выбора после обнаружения правильного тега. Затраты на электроэнергию для этого масштабируются с ассоциативностью, поэтому большой высокоассоциативный L1 будет очень плох для энергопотребления, а также для площади кристалла (и задержки) . (По сравнению с L2 и L3 площадь не будет большой, но для латентности важна физическая близость. Задержка распространения скорости света имеет значение, когда тактовые импульсы составляют 1/4 наносекунды.)

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

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


L1 почти всегда разделяется на отдельные кэши команд и данных. Вместо дополнительного порта чтения в унифицированном L1 для поддержки выборки кода, мы можем иметь отдельный кэш L1I, связанный с отдельным I- TLB. (Современные ЦП часто имеют L2-TLB, который является вторым уровнем кеша для переводов, совместно используемых L1 I-TLB и D-TLB, а не TLB, используемым обычным кешем L2). Это дает нам общий объем кэш-памяти L1 в 64 кбайт, статически разделенный на кэш-память кода и данных, за гораздо более дешевую (и, возможно, более низкую задержку), чем унифицированный кэш-память L1 размером 64 КБ с той же общей пропускной способностью. Поскольку между кодом и данными обычно очень мало совпадений, это большой выигрыш.

L1I может быть размещен физически близко к логике выборки кода, в то время как L1D может быть физически близко к единицам загрузки / сохранения.Задержки линии передачи со скоростью света имеют большое значение, когда тактовый цикл длится всего 1/3 наносекунды.Маршрутизация проводки также имеет большое значение: например, Intel Broadwell имеет 13 слоев меди над кремнием .

Разделение L1 очень помогает со скоростью, но унифицированный L2 является лучшимchoice. Некоторые рабочие нагрузки имеют очень маленький код, но касаются большого количества данных.Имеет смысл объединить кэши более высокого уровня для адаптации к различным рабочим нагрузкам вместо статического разделения на код и данные.(Например, почти весь L2 будет кэшировать данные, а не код, при выполнении большого умножения матрицы, в сравнении с большим количеством горячего кода при запуске раздутой программы на C ++, или даже эффективной реализацией сложного алгоритма (например, при запуске gcc).).Код можно копировать как данные, а не только загружать их с диска в память с помощью DMA.


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

Большие кэши с меньшим трафиком также являются хорошим местом для установки логики предварительной выборки.Аппаратная предварительная выборка обеспечивает хорошую производительность для таких вещей, как зацикливание массива, при этом каждому коду не требуются инструкции предварительной программной выборки.(Предварительная выборка SW была важна некоторое время, но предварительные выборки HW умнее, чем раньше, так что совет в Ульрих Дреппер в остальном превосходен Что должен знать каждый программист о памяти на сегодняшний день для многих случаев использования.)

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


Реальный пример: Intel Haswell .Источники: Анализ микроархитектуры Дэвида Кантера и Результаты тестирования Agner Fog (microarch pdf) .См. Также руководства Intel по оптимизации (ссылки в вики ).

Кроме того, я написал отдельный ответ на вопрос: Какая техника отображения кэша используется в процессоре Intel Core i7?

В современных разработках Intel используется большой инклюзивный кэш L3, совместно используемый всеми ядрами , в качестве резервной копии для трафика когерентности кэша .Он физически распределяется между ядрами, с 2048 наборами * 16-way (2MiB) на ядро ​​(с политикой адаптивной замены в IvyBridge и более поздних версиях ).

Более низкие уровни кэша-core.

  • L1 : для каждого ядра 32 кБ каждая инструкция и данные (разделение), 8-позиционная ассоциативная. Задержка = 4 цикла .Как минимум 2 порта чтения + 1 порт записи.( Может быть, даже больше портов для обработки трафика между L1 и L2 , или, возможно, получение строки кэша от L2 конфликтует с закрытием магазина.) Может отслеживать 10 незавершенных пропусков кэша (10 буферов заполнения).
  • L2 : унифицированный для каждого ядра 256 кБ, 8-канальный ассоциативный. Задержка = 11 или 12 циклов .Пропускная способность чтения: 64 байта / цикл.Основная логика предварительной выборки выполняет предварительную выборку в L2.Может отслеживать 16 выдающихся промахов.Может поставлять 64B за цикл к L1I или L1D.Фактический порт считается неизвестным.
  • L3 : унифицированный, совместно используемый (всеми ядрами) 8MiB (для четырехъядерного процессора i7).Включено (из всех кешей L2 и L1 на ядро).12 или 16 способ ассоциативный. Задержка = 34 цикла .Выступает в качестве резервной копии когерентности кэша, поэтому измененные общие данные не должны выходить в основную память и обратно.

Другой реальный пример: AMD Piledriver : (например, процессоры Opteron и настольные FX). Размер строки кэша по-прежнему составляет 64B, как Intel и AMD используют уже несколько лет.Текст, в основном, скопирован из микроархива Agner Fog pdf, с дополнительной информацией о некоторых слайдах, которые я нашел , и более подробную информацию о сквозном кеше L1 + 4k для записи и записи в блоге Агнера комментарий, что только L1 является WT, а не L2 .

  • L1I : 64 КБ, 2-сторонняя, совместно используемая парой ядер (версия AMDSMD имеет больше статического разбиения, чем Hyperthreading, и каждый из них называет ядром. Каждая пара разделяет модуль вектора / FPU и другие ресурсы конвейера.)
  • L1D : 16 кБ, 4-в пути, на ядро. Задержка = 3-4 с .(Обратите внимание, что все 12 битов ниже смещения страницы все еще используются для индексации, поэтому обычный трюк VIPT работает.) (Пропускная способность: две операции за такт, причем одна из них является хранилищем). Политика = сквозная запись , с кэш-памятью, объединяющей 4 КБ.
  • L2 : 2 МБ, 16-полосная, разделенная между двумясердечники. Задержка = 20 часов .Считайте пропускную способность 1 за 4 часа.Пропускная способность записи 1 на 12 тактов.
  • L3 : 0 - 8 МБ, 64-полосная, используется всеми ядрами. Задержка = 87 часов .Считайте пропускную способность 1 на 15 часов.Пропускная способность записи 1 за 21 такт

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

3 голосов
/ 13 февраля 2012

Для тех, кто интересуется этим типом вопросов, мой университет рекомендует Компьютерная архитектура: количественный подход и Организация и дизайн компьютеров: аппаратный / программный интерфейс .Конечно, если у вас нет времени для этого, краткий обзор доступен в Wikipedia .

2 голосов
/ 12 января 2011

Я думаю, что основной причиной этого является то, что L1-кэш быстрее и поэтому дороже.

1 голос
/ 16 апреля 2018

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

Три основных факта:

  1. Доступ к памяти для большинства приложений характеризуется высокой степенью временной локальности и неравномерным распределением.
  2. В широком спектре процессов и конструкций размер кэша и его скорость (задержка и пропускная способность) можно сравнить сдруг друга 1 .
  3. Каждый отдельный уровень кэша связан с дополнительными затратами на проектирование и производительность.

Таким образом, на базовом уровне вы могли бы сказать двойнойразмер кеша, но несут штраф за задержку 1.4 по сравнению с smaLler cache.

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

Если факт 2 не существует, вы просто создадитеочень большой, очень быстрый кэш L1 в рамках других ограничений вашего чипа и не требует каких-либо других уровней кэша.

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

Другие ограничения

Это дает базовую основу для понимания количества и размера кэша, но есть и второстепенные факторы.Например, Intel x86 имеет размеры страниц 4K, а их кэши L1 используют архитектуру VIPT .VIPT означает, что размер кеша, деленный на количество способов, не может быть больше 3 , чем 4 КиБ.Таким образом, 8-канальный кэш L1, используемый в полдюжине проектов Intel, может составлять максимум 4 КиБ * 8 = 32 КиБ.Вероятно, не случайно, что это именно тот размер кеша L1 в этих проектах!Если бы не это ограничение, вполне возможно, что вы видели бы более низкую ассоциативность и / или большие кэши L1 (например, 64 КиБ, 4-сторонние).


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

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

3 В принципе, вы можете использовать кэши VIPT без этого ограничения, но толькотребуя поддержки ОС (например, раскраски страницы) или с другими ограничениями.Арка x86 этого не сделала и, вероятно, не может начать сейчас.

0 голосов
/ 08 февраля 2013

логически, вопрос отвечает сам по себе.

Если бы L1 был больше, чем L2 (вместе взятый), тогда не было бы необходимости в L2 Cache.

Зачем вам хранить свои материалы на ленте-привод, если вы можете хранить все это на жестком диске?

...