Как кэш-память совместно используется в многоядерном Intel CPUs?

google.maps.event.addListener(marker, 'click', function() {
    if(!marker.open){
        infoWindow.open(map,marker);
        marker.open = true;
    }
    else{
        infoWindow.close();
        marker.open = false;
    }
    google.maps.event.addListener(map, 'click', function() {
        infoWindow.close();
        marker.open = false;
    });
});

Работает отлично

45
задан Peter Cordes 20 September 2017 в 13:41
поделиться

3 ответа

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

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

12
ответ дан 26 November 2019 в 21:22
поделиться

В многопроцессорной системе или многоядерном процессоре (Intel Quad Core, Core two Duo и т. Д.) Имеет ли каждое ядро ​​/ процессор процессора свой собственный кеш memory (data and program cache)?

  1. Yes. It varies by the exact chip model, but the most common design is for each CPU core to have its own private L1 data and instruction caches.

    On old and/or low-power CPUs, the next level of cache is typically a L2 unified cache is typically shared between all cores. Or on 65nm Core2Quad (which was two core2duo dies in one package), each pair of cores had their own last-level cache and couldn't communicate as efficiently.

Modern mainstream Intel CPUs (since the first-gen i7 CPUs, Nehalem) use 3 levels of cache.

  • 32kiB split L1i/L1d: private per-core (same as earlier Intel)
  • 256kiB unified L2: private per-core. (1MiB on Skylake-avx512).
  • large unified L3: shared among all cores

Last-level cache is a a large shared L3. It's physically distributed between cores, with a slice of L3 going with each core on the ring bus that connects the cores. Typically 1.5 to 2.25MB of L3 cache with every core, so a many-core Xeon might have a 36MB L3 cache shared between all its cores. This is why a dual-core chip has 2 to 4 MB of L3, while a quad-core has 6 to 8 MB.

On CPUs other than Skylake-avx512, L3 is inclusive of the per-core private caches so its tags can be used as a snoop filter to avoid broadcasting requests to all cores. i.e. anything cached in a private L1d, L1i, or L2, must also be allocated in L3. See Which cache mapping technique is used in intel core i7 processor?

David Kanter's Sandybridge write-up has a nice diagram of the memory heirarchy / system architecture, showing the per-core caches and their connection to shared L3, and DDR3 / DMI(chipset) / PCIe connecting to that. (This still applies to Haswell / Skylake-client / Coffee Lake, except with DDR4 in later CPUs).

Can one processor/core access each other's cache memory, because if им разрешен доступ к кешу друг друга, тогда я думаю, что там могут быть меньшие промахи в кеше в сценарии, если этот конкретный в кеше процессоров есть не одни данные, а другие секунды кеш процессора может иметь это, таким образом избегая чтения из памяти в кеш первого процессора? Верно ли это предположение?

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

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

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

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

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

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

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

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

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

45
ответ дан 26 November 2019 в 21:22
поделиться

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

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

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

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

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

4
ответ дан 26 November 2019 в 21:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: