Протокол кэширования MESI
Я читал о протоколе когерентности кэша MESI snooping, который, как мне кажется, используется в современных многоядерных процессорах x86 (пожалуйста, исправьте меня, если я ошибаюсь). Теперь эта статья говорит об этом в одном месте.
Кэш, содержащий строку в состоянии Modified, должен отслеживать (перехватывать) все попытки чтения (из всех других кэшей в системе) соответствующего расположения в основной памяти и вставлять данные, которые он содержит. Обычно это делается путем принудительного отключения чтения (т. Е. Повторной попытки позже), а затем записи данных в основную память и изменения строки кэша в состояние Shared.
Теперь я не понимаю, почему данные должны записываться в основную память. Может ли когерентность кеша просто синхронизировать содержимое кешей, не переходя в память (разве что строка кеша действительно исключена из курса)? Я имею в виду, если одно ядро постоянно читает, а другое постоянно пишет, почему бы не сохранить данные в кеш-памяти и постоянно обновлять данные в кеш-памяти. Зачем производить запись обратно в основную память?
Другими словами, не могут ли ядра, считывающие данные, непосредственно считывать из кеша пишущего ядра и соответствующим образом изменять свой кеш?
5 ответов
Теперь я не понимаю, почему данные должны записываться в основную память. Может ли когерентность кеша просто синхронизировать содержимое кешей, не переходя в память (разве что строка кеша действительно исключена из курса)?
Это случается
У меня на ноутбуке iCore 5, который выглядит следующим образом;
M
N
S
L3U
L2U L2U
L1D L1D
L1I L1I
P P
L L L L
M = Main memory
N = NUMA node
S = Socket
L3U = Level 3 Unified
L2U = Level 2 Unified
L1D = Level 1 Data
L1I = Level 1 Instruction
P = Processor
L = Logical core
Когда два логических ядра работают с одними и теми же данными, они не перемещаются в основную память; они обмениваются через кэши L1 и L2. Аналогичным образом, когда ядра двух процессоров работают, они обмениваются данными через кэш-память третьего уровня. Основная память не используется, пока не произойдет выселение.
Но более простой процессор действительно может быть менее умен.
Протокол MESI не позволяет нескольким кэшам хранить одну и ту же строку в modified
государство. Таким образом, если одна строка кэша изменена и хочет быть прочитанной из кэша другого процессора, то она должна быть сначала записана в основную память, а затем прочитана, так что теперь оба кэша процессора share
эта линия (общее состояние)
Потому что кеши обычно не могут записывать напрямую друг в друга (так как это потребует большей пропускной способности).
я не понимаю, почему данные должны быть записаны в основную память
Давайте процессор A имеет это modified
линия. Теперь процессор B пытается прочитать ту же самую строку кэша (измененную A) из основной памяти. Поскольку содержимое в основной памяти теперь недопустимо (поскольку A изменило содержимое), A отслеживает любые другие попытки чтения для этой строки. Таким образом, чтобы процессор B (и другие) мог прочитать эту строку, A должен записать ее обратно в основную память.
I mean if one core is constantly reading and the other constantly writing,
почему бы не сохранить данные в кеш-памяти и постоянно обновлять данные в кеш-памяти.
Вы правы, и это то, что обычно делается. Но здесь дело не в этом. Кто-то другой (процессор B в нашем примере) пытается прочитать. Так что А должен записать его обратно и сделать состояние строки кэша shared
потому что и A, и B теперь совместно используют строку кэша.
Так что на самом деле я не думаю, что кэш чтения должен идти в основную память. В MESI, когда процессор запрашивает блок, модифицированный одним из его одноранговых узлов, он выдает ошибку чтения по шине (или любой среде межсоединения), которая транслируется каждому процессору.
Процессор, который удерживает блок в состоянии "Modified", перехватывает вызов и выдает копию обратно на шину - содержит идентификатор блока и значение - при изменении своего собственного состояния копирования на "shared". Эта копия возвращается принимающим процессором, который запишет блок в свой локальный кеш и пометит его как "общий".
Это зависит от реализации, если копия, выданная владельцем, переходит в основную память, или нет.
edit: обратите внимание, что протокол MOESI добавляет состояние "Owned", очень похожее на "Shared", и позволяет процессору, содержащему копию блока, в состоянии владения, копировать обратно значение на шине, если он перехватывает широковещательную передачу пропустить запись / чтение для этого блока.