Как организованы современные кэши Intel CPU L3?

Учитывая, что процессоры теперь являются многоядерными и имеют собственные кэши L1/L2, мне было любопытно узнать, как организован кэш L3, учитывая, что он используется несколькими ядрами. Я предположил бы, что если бы у нас было, скажем, 4 ядра, то кэш L3 содержал бы данные на 4 страницы, каждая страница соответствовала области памяти, на которую ссылается конкретное ядро. Предполагая, что я несколько прав, это так далеко? Это может, например, разделить каждую из этих страниц на подстраницы. Таким образом, когда несколько потоков работают на одном и том же ядре, каждый поток может найти свои данные на одной из подстраниц. Я просто придумываю это из головы, поэтому мне очень интересно узнать, что на самом деле происходит за кулисами. Может кто-нибудь поделиться своими мыслями или предоставить мне ссылку, которая излечит меня от моего невежества?

Спасибо заранее.

2 ответа

В однопроцессорной микросхеме имеется один (нарезанный) кэш L3 и несколько кешей L2 (по одному на каждое физическое ядро) Кэш-память L3 кэширует данные в сегментах размером 64 байта (строки кэша), и существует специальный протокол когерентности кэша между L3 и различными L2/L1 (и между несколькими чипами в системах с несколькими сокетами NUMA/ccNUMA); он отслеживает, какая строка кэша является действительной, которая распределяется между несколькими кэшами, которая только что изменена (и должна быть аннулирована из других кэшей). Некоторые из протоколов (возможные состояния строки кэша и перевод состояния): https://en.wikipedia.org/wiki/MESI_protocol, https://en.wikipedia.org/wiki/MESIF_protocol, https://en.wikipedia.org/wiki/MOESI_protocol

В старых чипах (эпоха Core 2) когерентность кэша отслеживалась на общей шине, теперь она проверяется с помощью каталога.

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

С недавними чипами программист имеет возможность разделять кэш L3 между приложениями "Cache Allocation Technology" (семейство v4): https://software.intel.com/en-us/articles/introduction-to-cache-allocation-technology https://software.intel.com/en-us/articles/introduction-to-code-and-data-prioritization-with-usage-models https://danluu.com/intel-cat/ https://lwn.net/Articles/659161/

Современные кэши Intel L3 (начиная с Nehalem) используют размер строки 64B, такой же, как L1/L2. Они разделены, и включительно.

Смотрите также http://www.realworldtech.com/nehalem/2/

Начиная с SnB, по крайней мере, каждое ядро ​​имеет часть L3 и находится на кольцевой шине. Таким образом, в больших Xeons размер L3 линейно масштабируется с количеством ядер.


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

Другие вопросы по тегам