Я хотел бы узнать больше о МЭСИ в Intel Broadwell.
Предположим, сокет процессора имеет 6 ядер от ядра 0 до ядра 5, каждый из них имеет свои L1$ и L2$ и разделяет L3$, есть var X в общей памяти, x находится в строке кеша называется XCacheL , вот подробности моего вопроса:
T1: ядро 0, ядро 4 и ядро 5 имеют x = 100 и XCacheL. имеет статус Сhared, так как 3 ядра имеют копию XCacheL.
T2: Ядру 0 требуется изменить x, поэтому передача ядра 0 делает сигнал недействительным, а ядро 4 и ядро 5 получают сигнал. , аннулировать свою копию XCacheL, Core 0 изменить x на 200 и статус XCacheL теперь Мodified .
T3: ядро 4 требует чтения x, но его копия XCacheL становится недействительной в T2, поэтому происходит промах чтения, произойдет следующее:
● Processor makes bus request to memory
● Snooping cache puts copy value on the bus
● Memory access is abandoned
● Local processor caches value
● Local copy tagged S
● Source (M) value copied back to memory
● Source value M -> S
поэтому после T3 XCacheL имеет статус ядра 0 и ядра 4: Сhared и яnvalidated в ядре 5, а также L3$ и основная память имеют новейший действующий XCacheL.
T4: ядро 5 требует чтения x, так как его копия XCacheL имеет яnвалидацию в T2, но этот monent XCacheL имеет правильная копия в L3$, нужно ли ядру 5 запускать промах чтения, как это делает ядро 4 ?!
Я предполагаю: нет необходимости, так как L3$ имеет действительный XCacheL, таким образом, ядро 5 может достичь L3$ и получить правильный XCacheL от L3$ до L1$ в ядре 5, поэтому ядро 5 не вызовет промах чтения.
Переход от Modified непосредственно к Shared при чтении выполняется не на всех процессорах. Иногда полезно объявить недействительным, потому что чтение скоро станет записью, и вам нужна исключительно строка. см. - software.intel.com/en-us/forums/…





Похоже, вы говорите об алгоритме Ранний Снуп, где за отправку снупов отвечают кэширующие агенты слайсов L3. Так что я отвечу на вопрос в соответствии с этим алгоритмом.
Все процессоры Broadwell используют включительно L3. Так что да, ядро 5 пропустит свои частные кэши L1 и L2, и запрос на чтение будет отправлен агенту кэширования слайса L3, на который отображается запрошенная строка. Агент кэширования определяет, что у него есть строка и она находится в состоянии S. Поскольку это запрос на чтение, агент кэширования отправит строку кэша на ядро 5. Состояние строки не изменяется, и отслеживание не отправляется.
Вы правы, на этапе T4 нагрузка на ядро № 5 попадает в L3, поэтому доступ к памяти не происходит. Ядро № 5 получает еще одну копию линии в состоянии Shared.
Ваша последовательность шагов не имеет смысла для ЦП, такого как Broadwell, где все ядра имеют общий доступ к встроенным контроллерам DRAM.
Кольцевая шина соединяет ядра (каждое из которых имеет часть кэш-памяти L3), системный агент (каналы PCIe и подключение к другим ядрам) и домашний агент (контроллеры памяти). См. блок-схему кольцевой шины в https://en.wikichip.org/wiki/intel/microarchitectures/broadwell_(client)#Die_Stats.
Отдельные ядра не управляют напрямую «шиной памяти» или даже одной из двух или четырех шин DRAM. Контроллер памяти разрешает доступ к DRAM и имеет некоторую буферизацию для переупорядочения/объединения доступов. (Все, который обращается к памяти, проходит через него, включая DMA, поэтому он может делать все, что захочет, пока он дает видимость загрузки/сохранения, происходящей в каком-то разумном порядке.)
Запрос на загрузку не будет отправлен системному агенту до тех пор, пока он не попадет в кэш L3. См. https://superuser.com/questions/1226197/x86-адрес-пространство-контроллер/1226198#1226198 для иллюстрации четырехъядерного рабочего стола (который проще и просто имеет контроллер памяти, подключенный к системному агенту, что делает его точно таким же, как северный мост до того, как процессоры интегрировали контроллеры памяти).
Поскольку Broadwell использует инклюзивный кэш L3, теги L3 могут сообщить ему, какое ядро имеет модифицированную или монопольную копию, если таковые имеются, даже если строка в самом L3 не является общедоступной. (т. е. данные строки могут быть недействительными в L3, но теги по-прежнему отслеживают, какое ядро имеет частную копию). См. Какой метод сопоставления кеша используется в процессоре Intel Core i7?
Это позволяет тегам L3 действовать как отслеживающий фильтр для уменьшения количества широковещательных передач.
Там, где L3 инклюзивно, вероятно, быстрее читать общие строки оттуда. Там, где это не так, они пересылаются из других кешей. Вот почему MESIF существует. Uncore, вероятно, просто транслирует запрос по каналу QPI/UPI, и либо L3, iMC, либо другой основной агент самонаведения отвечает на него. Это то, что вы подразумеваете под промахом чтения (извините, мне не хватает терминологии), чем ядро все равно сработает. На самом деле вам всегда нужно запускать что-то для чтения из-за пределов ядра, даже из L1.