В многопроцессорной системе или многоядерном процессоре (Intel Quad Core,
Core два Duo и т. Д.) Каждый процессор / ядро имеет свой кэш
память (кеш данных и программ)?
Да. Это зависит от конкретной модели чипа, но наиболее распространенный дизайн - для каждого ядра ЦП иметь свои собственные частные кэши данных и инструкций 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 в более поздних процессорах).
Может ли один процессор / ядро обращаться к кеш-памяти друг друга, потому что если
им разрешен доступ к кешу друг друга, тогда я там верю
может быть меньше пропусков кэша, в случае, если этот конкретный
кеш процессоров не имеет каких-то данных, но есть другая секунда
кэш процессоров может иметь его, таким образом, избегая чтения из памяти в
кеш первого процессора? Это предположение верно и верно?
Нет. Кэши L1 каждого ЦП тесно интегрированы в это ядро. Несколько ядер, обращающихся к одним и тем же данным, будут иметь свою собственную копию в своих собственных кешах L1d, очень близко к исполнительным блокам загрузки / хранения.
Суть многоуровневого кэша в том, что один кэш не может быть достаточно быстрым для очень горячих данных, но не может быть достаточно большим для менее часто используемых данных, к которым все еще регулярно обращаются. Почему размер кэша L1 меньше размера кэша L2 в большинстве процессоров?
Переход от ядра к кешу другого ядра не будет быстрее, чем переход на L3 в современных процессорах Intel. Или необходимая ячеистая сеть между ядрами, чтобы это произошло, была бы непомерно высокой по сравнению с просто созданием большего / более быстрого кеша L3.
Маленькие / быстрые кэши, встроенные в другие ядра, предназначены для ускорения этих ядер. Их совместное использование, вероятно, будет стоить больше энергии (и, возможно, даже больше транзисторов / площадь кристалла), чем другие способы увеличения частоты попаданий в кэш. (Мощность является более ограничивающим фактором, чем количество транзисторов или площадь кристалла. Именно поэтому современные процессоры могут позволить себе иметь большие частные кэши L2).
Кроме того, вы бы не хотели, чтобы другие ядра загрязняли небольшой частный кеш, который, вероятно, кеширует данные, относящиеся к этому ядру.
Будут ли проблемы с разрешением любому процессору обращаться к другимкэш-память процессора?
- Да - просто нет проводов, соединяющих различные кэши ЦП с другими ядрами. Если ядро хочет получить доступ к данным в кеше другого ядра, единственный путь к нему, по которому он может это сделать, - это системная шина.
Очень важной проблемой является проблема когерентности кэша . Рассмотрим следующее: предположим, что одно ядро ЦП имеет определенную ячейку памяти в своем кэше и выполняет запись в эту ячейку памяти. Затем другое ядро считывает эту область памяти. Как вы гарантируете, что второе ядро увидит обновленное значение? Это проблема когерентности кэша.
Обычным решением является протокол MESI или его разновидность. Intel использует MESIF .