Протокол MOSI является расширением базового протокола согласованности кэша MSI . Он добавляет состояние O wned, которое указывает, что текущий процессор владеет этим блоком, и будет обслуживать запросы от других процессоров для этого блока.
Обзор состояний
Ниже приведены разрешенные состояния данной строки кэша:
Изменено (M) - только один кеш имеет действительную копию блока, и значение, вероятно, будет отличаться от значения в основной памяти. Он имеет почти то же значение, что и грязное состояние в кэше обратной записи, за исключением того, что измененное состояние также подразумевает исключительное владение этим блоком. Грязное состояние просто означает, что значение блока отличается от значения в основной памяти, тогда как измененное означает, что значение отличается от значения в основной памяти и кэшируется только в одном месте.
Принадлежащий (O) - несколько кешей могут содержать самое последнее и правильное значение блока, а значение в основной памяти может быть правильным, а может и нет. Одновременно только один кеш может иметь состояние владения для блока. Все остальные кэши с тем же блоком должны находиться в общем состоянии. [1]
Shared (S) - блок кэша действителен, может использоваться несколькими кешами и может иметь или не иметь то же значение, что и основная память. Другие процессоры могут читать из него, но не имеют разрешений на запись.
Invalid (I) - блок кеширования недействителен.
Для любой данной пары кешей допустимые состояния данной строки кэша следующие:
M | О | S | я | |
---|---|---|---|---|
M | ||||
О | ||||
S | ||||
я |
Операции
В протоколе MOSI каждый кеш имеет следующие запросы:
- PrRd - запрос процессора на чтение блока кэша.
- PrWr - запрос процессора на запись в блок кеша.
- BusRd - отслеживаемый запрос, указывающий на то, что существует запрос на чтение блока кэша, сделанный другим процессором.
- BusRdX - отслеживаемый запрос, указывающий на то, что существует запрос на запись в блок кэша, сделанный другим процессором, у которого нет этого блока.
- BusUpgr - отслеживаемый запрос, показывающий, что существует запрос на запись в блок кэша, сделанный другим процессором, у которого уже есть этот блок в кэше.
- Flush - отслеживаемый запрос, после которого блок кеша помещается на шину для передачи кеша. [2]
Обработка транзакций
Рассмотрим случай транзакций процессора: когда блок находится в состоянии Invalid (I) , либо блок кэша никогда не извлекался из памяти, либо он был признан недействительным. Когда происходит чтение процессора ( PrRd ), состояние меняется с недопустимого (I) на общее (S), тем самым генерируя чтение шины ( BusRd ). В то же время, если это запрос записи процессора ( PrWr ), то состояние блока изменяется на измененное (M) вместе с отслеживаемым запросом записи ( BusRdX ).
Когда блок находится в состоянии « Принадлежит» (O) , то чтение процессора (PrRd) не генерирует никакого отслеживаемого сигнала, и блок остается в том же состоянии. Принимая во внимание, что запрос записи от процессора (PrWr) приводит к изменению состояния блока с принадлежащего (O) на измененное (M) вместе с генерацией отслеживаемого запроса записи ( BusUpgr ). [3]
Когда блок находится в состоянии Modified (M) , ни запрос чтения процессора (PrRd), ни запрос записи процессора (PrWr) не генерируют отслеживаемый сигнал, поскольку блок уже указывает, что самое последнее и правильное значение находится только в этом кэше. Следовательно, он не меняет своего состояния и остается в модифицированном (M) состоянии.
Пока блок находится в состоянии Shared (S) и есть запрос чтения процессора (PrRd), поскольку значение блока кэша одинаково для всех остальных процессоров и в основной памяти, сигнал шины не генерируется после чтение процессора (PrRd). Запрос на запись в шину (BusUpgr) генерируется, когда есть запрос на запись процессора (PrWr) в блок в общем (S) состоянии, потому что блок кеша больше не действителен во всех других кэшах и состояние блока изменяется. от общего (S) до изменяемого (M).
Автобусные транзакции
Учитывая поведение конечного автомата при отслеживании транзакций шины, если блок кэша находится в состоянии Invalid (I), то ни один запрос шины отслеживания не повлияет на блок каким-либо образом, поэтому даже если это чтение шины (BusRd) или шина запрос записи от процессора, который имеет или не имеет блок (BusRdX или BusUpgr) , блок остается в том же недопустимом состоянии (I) и не генерирует никаких дальнейших действий.
Когда блок кеша находится в состоянии Shared (S) и есть транзакция чтения с отслеживаемой шины (BusRd), тогда блок остается в том же состоянии и больше не генерирует транзакции, поскольку все блоки кеша имеют одинаковое значение, включая основную память. и его только читают, а не записывают. Если есть отслеживаемый запрос записи (BusRdX или BusUpgr), то состояние блока изменяется с общего (S) на недопустимое (I), поскольку значение блока было изменено в одном из других блоков кеша и во всех остальных копиях. теперь должно быть признано недействительным.
Как только блок кэша находится в состоянии Modified (M) и есть запрос чтения шины (BusRd), блок сбрасывает (Flush) измененные данные и меняет состояние на принадлежащее (O), тем самым делая его единственным владельцем для этого конкретный блок кеша. В то же время, когда он находится в модифицированном (M) состоянии, никогда не будет запроса на запись в шину (BusUpgr) от другого процессора, так как у него нет блока кэша. При запросе записи от другого процессора, у которого нет блока (BusRdX), блок меняет свое состояние на недопустимое (I), поскольку другой процессор выполняет запись в блок и, следовательно, будет владеть этим блоком.
Пока блок кэша находится в измененном состоянии, нет возможности запроса BusUpgr от любого другого процессора, поскольку ни у одного из них не будет блока. Согласно определению измененного (M) состояния, только этот процессор имеет блок, остальные становятся недействительными и, следовательно, не могут инициировать запрос BusUpgr.
Находясь в состоянии « Владелец» (O) и есть отслеживаемый запрос чтения (BusRd), блок остается в том же состоянии, пока сбрасываются (сбрасываются) данные для чтения из него другим процессором. С отслеживаемым запросом записи (BusRdX) блок меняет состояние на недопустимое (I) вместе с сбросом (Flush) данных, когда другой процессор записывает в него, тем самым теряя свое владение этим блоком. Каждый раз, когда другой процессор пытается получить доступ к этому блоку, вместо обращения к памяти для доступа к нему, процессор берет его из другого кеша, в котором этот блок уже находится в состоянии владения (O). С BusUpgr он просто меняет состояние с владельца (O) на недействительное (I). [3]
Сравнение с протоколом MSI
Очевидное различие между протоколом MSI и протоколом MOSI, также известным как протокол Беркли [4], заключается в наличии дополнительного состояния (принадлежащего) в MOSI в дополнение к наличию только модифицированного (M) состояния.
В протоколе MSI всякий раз, когда возникает запрос пропуска чтения для блока, который находится в модифицированном (M) состоянии, он записывает обратно в основную память, изменяя статус блока на общий (S). Но в случае протокола MOSI, где у нас есть дополнительное состояние (владелец), всякий раз, когда другой процессор запрашивает операцию чтения, блок изменяется с измененного на принадлежащее (O) состояние и, таким образом, сохраняет грязный блок кеша, тем самым удаляя необходимость немедленной записи обратно в основную память.
Эта отсрочка может сэкономить трафик шины и записи в основную память в определенных последовательностях транзакций. Рассмотрим, например, если размер кэша для процессора 1 равен M, то процессор 2 читает из него, а затем процессор 1 снова записывает в него. В MSI переход процессора 1 MS из режима чтения приводит к одной записи в память, а затем переход SM приводит к BusUpgr. В MOSI переход MO не генерирует трафика, а переход OM также генерирует один BusUpgr, как и раньше. Таким образом, MOSI распределяет начальную обратную запись в память и связанный с ней трафик шины, что и делает MSI.
Сравнение с протоколом MESI
Оба МЭСИ (также известные как Иллинойс) [4] и протоколы MOSI, являются расширениями протокола MSI , чтобы улучшить различные функциональные возможности . MOSI фокусируется на сокращении обратной записи, а MESI пытается уменьшить количество транзакций шины, требуемых после запроса на чтение и запись от другого процессора. Исключительное (E) состояние в протоколе MESI означает, что блок кеша действителен, чист (такое же значение, как в основной памяти) и кэширован только в одном кэше, тогда как состояние «принадлежащий» (O) в протоколе MOSI означает, что блок кеша действителен , потенциально грязный, доступный для записи и может присутствовать более чем в одном кэше (все кеши имеют одинаковое значение).
Рекомендации
- ^ Сорин, Дэниел; Хилл, Марк; Вуд, Дэвид (2011). Учебник по согласованности памяти и согласованности кеша . Морган и Клейпул. С. 119–122. ISBN 9781608455645.
- ^ Солихин, Ян (2016). Основы параллельной многоядерной архитектуры . RC Press, Taylor & Francis Group. ISBN 9781482211184.
- ^ а б «Оценка протоколов согласованности кэша на основе Snoop» (PDF) .
- ^ а б «Анализ и сравнение протоколов когерентности кэша для мультипроцессоров с пакетной коммутацией». Транзакции IEEE на компьютерах . 38 . DOI : 10.1109 / 12.30868 .