Кажется, что ваша гипотетическая система включает в себя когерентные кэши L1 с обратной записью и некогерентные DMA.Очень похожим реальным процессором является ARM11 MPCore , за исключением того, что он не имеет кэш-памяти L2.Однако большинство современных процессоров имеют согласованный DMA.В противном случае ответственность за обеспечение согласованности лежит на программном обеспечении.Состояние системы, как показано на вашей диаграмме, уже является непоследовательным.
Если процессорное ядро A пытается загрузить (прочитать) объект, что произойдет?
Это будетпросто прочитайте строку, хранящуюся в ее локальном кэше L1.Никаких изменений не произойдет.
Если вместо этого ядро ЦП А попытается сохранить (записать) объект, что произойдет?
Строки уже находятся в согласованности Мсостояние в кеше L1 ядра A. Таким образом, он может записывать в него напрямую.Никаких изменений не произойдет.
Произойдет ли что-нибудь неочевидное, интересное и / или иное, если вместо ядра A ядро B загрузит или сохранит?
Если ядроB отправил запрос на загрузку в ту же строку, кэш L1 ядра A отслеживается, и строка находится в состоянии M.Строка обновляется в кэше L2 и отправляется в кэш L1 ядра B. Также будет выполнено одно из следующих действий:
- Строка недействительна из кэша L1 ядра A.Линия вставляется в кэш L1 ядра B в состоянии E-когерентности (в случае протокола MESI) или в состоянии S-когерентности (в случае протокола MSI).Если L2 использует отслеживающий фильтр, фильтр обновляется, чтобы указать, что ядро B имеет линию в состоянии E / S.В противном случае состояние линии в L2 будет таким же, как и в ядре L1 ядра B, за исключением того, что он не знает, что он там есть (поэтому отслеживание будет передаваться всегда).
- Состояниестроки в кеше L1 ядра A изменяется на S. Строка вставляется в кэш L1 ядра B в состоянии S-когерентности.L2 вставляет строку в состояние S.
В любом случае, и кэш-память L1, и кэш-память L2 будут содержать одну и ту же копию строки, которая остается несовместимой с копией в памяти.
Если ядро B отправило запрос на сохранение в ту же строку, строка будет признана недействительной из кэша ядра A и окажется в состоянии M в кэше ядра B.
Со временем строка будетбыть исключенным из иерархии кэша, чтобы освободить место для других строк.Когда это происходит, есть два случая:
- Строка находится в состоянии S / E, поэтому она будет просто отброшена из всех кэшей.Позже, если строка будет прочитана снова, копия, записанная операцией DMA, будет считана из основной памяти.
- Строка находится в состоянии M, поэтому она будет записана обратно в основную память и (возможно, частично) перезаписать копию, записанную операцией DMA.
Очевидно, что такое некогерентное состояние никогда не должно возникать.Это можно предотвратить, сделав недействительной всю соответствующую строку из всех кэшей до того, как начнется операция записи DMA, и убедившись, что ни одно ядро не получит доступ к области памяти, в которую производится запись, до завершения операции.Контроллер DMA отправляет прерывание всякий раз, когда операция завершается.В случае операции чтения DMA все соответствующие строки необходимо записать обратно в память, чтобы обеспечить использование самых последних значений.
Intel Data Direct I / O (DDIO)Технология позволяет контроллеру DMA считывать или записывать данные напрямую из общего кэша последнего уровня для повышения производительности.
Этот раздел не имеет прямого отношения к вопросу, но я хочу написать это где-нибудь.
Все коммерческие процессоры x86 полностью согласованы с кэшем (т. Е. Вся иерархия кэша согласована).Чтобы быть более точным, все процессоры в одной и той же области разделяемой памяти являются когерентными.Кроме того, все коммерческие многоядерные сопроцессоры x86 (т.е. Intel Xeon Phi в виде карты PCIe) внутренне полностью согласованы.Сопроцессор, который является устройством в соединении PCIe, не связан с другими сопроцессорами или процессорами.Таким образом, сопроцессор находится в отдельной области когерентности.Я думаю, это потому, что не существует встроенного аппаратного механизма для создания устройства PCIe, которое имеет кэш, согласованный с другими устройствами PCIe или процессорами.
Помимо коммерческих чипов x86, существуют прототипы чипов x86, которые неКэш связный.Единственный пример, который мне известен, - это однокристальный облачный компьютер Intel (SCC), который впоследствии превратился в целостный Xeon Phi.