Как кэш-память распределяется в многоядерных процессорах Intel?
У меня есть несколько вопросов, касающихся кэш-памяти, используемой в многоядерных процессорах или многопроцессорных системах. (Хотя это и не имеет прямого отношения к программированию, оно имеет много последствий, в то время как один пишет программное обеспечение для многоядерных процессоров / многопроцессорных систем, поэтому спрашивает здесь!)
В многопроцессорной системе или многоядерном процессоре (Intel Quad Core, Core 2 Duo и т. Д.) Каждый процессор / ядро процессора имеет свою собственную кэш-память (кэш данных и программ)?
Может ли один процессор / ядро получать доступ к кеш-памяти друг друга, потому что, если им разрешен доступ к кешу друг друга, то я полагаю, что в этом случае могут быть меньше пропусков кеша, если в этом кеше процессоров нет данных, а есть другая секунда кэш процессоров может иметь его, таким образом, избегая чтения из памяти в кэш первого процессора? Это предположение верно и верно?
Будут ли какие-либо проблемы в разрешении любому процессору обращаться к кеш-памяти другого процессора?
4 ответа
В многопроцессорной системе или многоядерном процессоре (Intel Quad Core, Core 2 Duo и т. Д.) Каждый процессор / ядро процессора имеет свою собственную кэш-память (кэш данных и программ)?
Да. Это зависит от конкретной модели чипа, но наиболее распространенным является то, что каждое ядро ЦП имеет свой собственный кэш данных L1 и инструкций.
На старых и / или процессорах с низким энергопотреблением следующим уровнем кэша обычно является унифицированный кэш L2, который обычно используется всеми ядрами. Или на 65 нм Core2Quad (в котором было два кристалла core2duo в одном пакете) каждая пара ядер имела свой кэш последнего уровня и не могла взаимодействовать так эффективно.
Современные основные процессоры Intel (начиная с процессоров i7 первого поколения Nehalem) используют 3 уровня кэш-памяти.
- 32 кбит / с, L1i/L1 d: частное ядро (как и в предыдущих версиях Intel)
- 256 кБ унифицированный L2: частное ядро. (1MiB на Skylake-avx512).
- большой унифицированный L3: общий для всех ядер
Кэш последнего уровня - это большой общий L3. Он физически распределяется между ядрами, причем часть L3 идет с каждым ядром на кольцевой шине, которая соединяет ядра. Обычно от 1,5 до 2,25 МБ кэш-памяти L3 с каждым ядром, поэтому многоядерный Xeon может иметь кэш-память третьего уровня объемом 36 МБ, разделяемую между всеми его ядрами. Вот почему у двухъядерного чипа L3 от 2 до 4 МБ, а у четырехъядерного - от 6 до 8 МБ.
На процессорах, отличных от Skylake-avx512, L3 включает частные кэши для каждого ядра, поэтому его теги можно использовать в качестве фильтра отслеживания, чтобы избежать широковещательных запросов ко всем ядрам. то есть все, что кэшируется в частном L1 d, L1i или L2, также должно быть выделено в L3. См. Какой метод отображения кэша используется в процессоре Intel Core i7?
В статье Дэвида Кэнтера "Sandybridge " представлена хорошая схема иерархии памяти / архитектуры системы, показывающая кэши для каждого ядра и их подключение к совместно используемому L3, а также подключение DDR3 / DMI(чипсет) / PCIe к нему. (Это относится и к Haswell / Skylake-клиенту / Coffee Lake, за исключением DDR4 в более поздних процессорах).
Может ли один процессор / ядро получать доступ к кеш-памяти друг друга, потому что, если им разрешен доступ к кешу друг друга, то я полагаю, что в этом случае могут быть меньшие пропуски кеша, если в кеш-памяти этого конкретного процессора нет данных, а есть другая секунда кэш процессоров может иметь его, таким образом, избегая чтения из памяти в кэш первого процессора? Это предположение верно и верно?
Нет. Кэши L1 каждого ЦП тесно интегрированы в это ядро. Несколько ядер, обращающихся к одним и тем же данным, будут иметь свою собственную копию в своих собственных кешах L1 d, очень близко к исполнительным блокам загрузки / хранения.
Суть многоуровневого кэша в том, что один кэш не может быть достаточно быстрым для очень горячих данных, но не может быть достаточно большим для менее часто используемых данных, к которым по-прежнему регулярно обращаются. Почему размер кэша L1 меньше, чем размер кэша L2 в большинстве процессоров?
Переход от ядра к кешу другого ядра не будет быстрее, чем переход на L3 в современных процессорах Intel. Или необходимая ячеистая сеть между ядрами, чтобы это произошло, была бы непомерно высокой по сравнению со строительством большего / более быстрого кеша L3.
Маленькие / быстрые кэши, встроенные в другие ядра, предназначены для ускорения этих ядер. Их совместное использование, вероятно, будет стоить больше энергии (и, возможно, даже больше транзисторов / площадь кристалла), чем другие способы увеличения частоты попаданий в кэш. (Мощность является более ограничивающим фактором, чем количество транзисторов или площадь кристалла. Именно поэтому современные процессоры могут позволить себе иметь большие частные кэши L2).
Кроме того, вы не хотели бы, чтобы другие ядра загрязняли небольшой частный кеш, который, вероятно, кеширует данные, относящиеся к этому ядру.
Будут ли какие-либо проблемы в разрешении любому процессору обращаться к кеш-памяти другого процессора?
- Да, просто нет проводов, соединяющих различные кэши ЦП с другими ядрами. Если ядро хочет получить доступ к данным в кэше другого ядра, единственный путь передачи данных, по которому он может это сделать, - это системная шина.
Очень важной проблемой является проблема когерентности кэша. Рассмотрим следующее: предположим, что одно ядро ЦП имеет определенную ячейку памяти в своем кэше и выполняет запись в эту ячейку памяти. Затем другое ядро считывает эту область памяти. Как вы гарантируете, что второе ядро увидит обновленное значение? Это проблема когерентности кэша.
Нормальным решением является протокол MESI или его разновидность. Intel использует MESIF.
Быстрые ответы 1) Да 2) Нет, но все может зависеть от того, на какой экземпляр памяти / ресурс вы ссылаетесь, данные могут существовать в нескольких местах одновременно. 3) Да.
Для более подробного объяснения проблемы вы должны прочитать статью из 9 статей "Что должен знать каждый программист о памяти" Ульриха Дреппера ( http://lwn.net/Articles/250967/), вы получите полное представление о вопросы, о которых вы, кажется, задаетесь в хорошей и доступной детализации.
Intel называет основную технологию совместного использования кэша Intel Smart Cache. Об этом есть заглушка вики-страницы: https://en.wikipedia.org/wiki/Smart_Cache
Затем, например, для процессора i5-3210M, страница ark имеет поле "Intel Smart Cache: 3 МБ".
А в техническом описании тома 1.1 1.1 "Подробности функций процессора" написано:
- 32-килобайтная инструкция и 32-килобайтный кэш первого уровня данных (L1) для каждого ядра
- Общий кэш второго уровня (256 КБ) для инструкций и данных (L2) для каждого ядра
- Общий кэш третьего уровня инструкций / данных до 8 МБ (L3), общий для всех ядер
Отвечая на первый вопрос, я знаю, что в Core 2 Duo есть 2-уровневая система кэширования, в которой каждый процессор имеет свой собственный кэш первого уровня, и они совместно используют кэш второго уровня. Это помогает как с синхронизацией данных, так и с использованием памяти.
Чтобы ответить на ваш второй вопрос, я считаю ваше предположение правильным. Если бы процессоры могли иметь доступ к кешу друг друга, очевидно, было бы меньше пропусков кеша, так как было бы больше данных для выбора процессорами. Рассмотрим, однако, общий кэш. В случае с Core 2 Duo наличие общего кэша позволяет программистам безопасно размещать часто используемые переменные в этой среде, чтобы процессорам не приходилось обращаться к своим отдельным кэшам первого уровня.
Чтобы ответить на ваш третий вопрос, потенциально может возникнуть проблема с доступом к кэш-памяти других процессоров, что соответствует принципу "Однократная запись, многократное чтение". Мы не можем позволить нескольким процессам одновременно выполнять запись в одно и то же место в памяти.
Для получения дополнительной информации о Core 2 Duo, прочитайте эту аккуратную статью.
http://software.intel.com/en-us/articles/software-techniques-for-shared-cache-multi-core-systems/