Как кэш-память распределяется в многоядерных процессорах Intel? - PullRequest
41 голосов
/ 03 июня 2009

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

  1. В многопроцессорной системе или многоядерном процессоре (Intel Quad Core, Core 2 Duo и т. Д.) Каждый процессор / ядро ​​процессора имеет свою собственную кэш-память (кэш данных и программ)?

  2. Может ли один процессор / ядро ​​получать доступ к кеш-памяти друг друга, потому что, если им разрешен доступ к кешу друг друга, то я полагаю, что в сценарии, когда кеш этого конкретного процессора не имеет кеш-процессоров, может быть меньше ошибок некоторые данные, но кэш некоторых других вторых процессоров может иметь их, таким образом, избегая чтения из памяти в кэш первого процессора? Это предположение верно и верно?

  3. Будут ли какие-либо проблемы с разрешением любому процессору получать доступ к кэш-памяти другого процессора?

Ответы [ 4 ]

43 голосов
/ 05 июня 2009

В многопроцессорной системе или многоядерном процессоре (Intel Quad Core, Core два Duo и т. Д.) Каждый процессор / ядро ​​имеет свой кэш память (кеш данных и программ)?

  1. Да. Это зависит от конкретной модели чипа, но наиболее распространенный дизайн - для каждого ядра ЦП иметь свои собственные частные кэши данных и инструкций L1.

    На старых и / или маломощных процессорах следующим уровнем кэша обычно является унифицированный кэш L2, который обычно используется всеми ядрами. Или на 65-нм Core2Quad (в котором было два кристалла core2duo в одном пакете) каждая пара ядер имела свой кэш последнего уровня и не могла взаимодействовать так эффективно.

Современные основные процессоры Intel (начиная с процессоров i7 первого поколения, Nehalem) используют 3 уровня кэш-памяти.

  • 32 кБ, разделение L1i / L1d: частное ядро ​​(аналогично предыдущему Intel)
  • 256 кБ унифицированный L2: частное ядро. (1MiB на Skylake-avx512).
  • большой унифицированный L3: общий для всех ядер

Кэш последнего уровня - это большой общий L3. Он физически распределяется между ядрами, причем часть L3 идет с каждым ядром на кольцевой шине, которая соединяет ядра. Обычно от 1,5 до 2,25 МБ кэш-памяти L3 с каждым ядром, поэтому многоядерный Xeon может иметь кэш-память третьего уровня объемом 36 МБ, разделяемую между всеми его ядрами. Вот почему двухъядерный чип имеет от 2 до 4 МБ L3, а четырехъядерный - от 6 до 8 МБ.

На процессорах, отличных от Skylake-avx512, L3 составляет включительно частных кэшей для каждого ядра, поэтому его теги можно использовать в качестве фильтра отслеживания, чтобы избежать трансляции запросов ко всем ядрам. все, что кэшируется в частном L1d, L1i или L2, также должно быть выделено в L3. См. Какой метод отображения кэша используется в процессоре Intel Core i7?

Авторская запись Дэвида Кантера Sandybridge содержит хорошую диаграмму иерархии памяти / архитектуры системы, показывающую кэши для каждого ядра и их подключение к совместно используемому L3, а также подключение DDR3 / DMI (чипсет) / PCIe к этому. (Это относится и к Haswell / Skylake-клиенту / Coffee Lake, за исключением DDR4 в более поздних процессорах).

Может ли один процессор / ядро ​​обращаться к кеш-памяти друг друга, потому что если им разрешен доступ к кешу друг друга, тогда я там верю может быть меньше пропусков кэша, в случае, если этот конкретный кеш процессоров не имеет каких-то данных, но есть другая секунда кэш процессоров может иметь его, таким образом, избегая чтения из памяти в кеш первого процессора? Это предположение верно и верно?

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

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

    Переход от ядра к кешу другого ядра не будет быстрее, чем переход на L3 в современных процессорах Intel. Или необходимая ячеистая сеть между ядрами, чтобы это произошло, была бы непомерно высокой по сравнению с просто созданием большего / более быстрого кеша L3.

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

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

Будут ли проблемы с разрешением любому процессору обращаться к другимкэш-память процессора?

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

Очень важной проблемой является проблема когерентности кэша . Рассмотрим следующее: предположим, что одно ядро ​​ЦП имеет определенную ячейку памяти в своем кэше и выполняет запись в эту ячейку памяти. Затем другое ядро ​​считывает эту область памяти. Как вы гарантируете, что второе ядро ​​увидит обновленное значение? Это проблема когерентности кэша.

Обычным решением является протокол MESI или его разновидность. Intel использует MESIF .

12 голосов
/ 05 июня 2009

Быстрые ответы 1) Да 2) Нет, но все может зависеть от того, на какой экземпляр памяти / ресурс вы ссылаетесь, данные могут существовать в нескольких местах одновременно. 3) Да.

Чтобы получить полное объяснение этой проблемы, прочитайте статью Ульриха Дреппера «Что каждый программист должен знать о памяти» (http://lwn.net/Articles/250967/), и вы получите полное представление о проблемах, которые вам кажутся. интересоваться хорошей и доступной деталью.

6 голосов

Документация Intel

Intel публикует таблиц для каждого поколения , которые могут содержать такую ​​информацию.

Например, для процессора i5-3210M, который у меня был на моем старом компьютере, я смотрю 3-го поколения - Таблица данных тома 1 и 1.1 «Подробная информация о процессоре»:

  • Инструкция по 32 КБ и кэш-память первого уровня (L1) по 32 КБ для каждого ядра
  • Общий кэш второго уровня (L2) для 256 КБ инструкций / данных для каждого ядра
  • До 8 МБ общей кэш-памяти третьего уровня инструкций / данных (L3), общей для всех ядер

Intel называет основную технологию совместного использования кэша «Intel Smart Cache». Об этом есть заглушка вики-страницы: https://en.wikipedia.org/wiki/Smart_Cache

Вы можете найти страницу таблиц данных на странице ARK для процессора , которая имеет только основную информацию о кеше:

Intel Smart Cache: 3 МБ

Смотри также:

4 голосов
/ 03 июня 2009

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

Чтобы ответить на ваш второй вопрос, я считаю ваше предположение правильным. Если бы процессоры могли иметь доступ к кешу друг друга, очевидно, было бы меньше пропусков кеша, так как было бы больше данных для выбора процессорами. Рассмотрим, однако, общий кэш. В случае с Core 2 Duo наличие общего кэша позволяет программистам безопасно размещать часто используемые переменные в этой среде, чтобы процессорам не приходилось обращаться к отдельным кэшам первого уровня.

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

Для получения дополнительной информации о Core 2 Duo, прочитайте эту аккуратную статью.

http://software.intel.com/en-us/articles/software-techniques-for-shared-cache-multi-core-systems/

...