Протокол MESI в согласовании кеша

У меня вопрос по протоколу МЭСИ.

(1) Рассмотрим следующий фрагмент кода, работающий в однопроцессорной системе, реализующей протокол когерентности кэша MESI:

I1: загрузить $s1, [A] I2: загрузить $s2, [B] I3: добавить $s1, $s2, $s3 I4: сохранить $s3, [C] I5: добавить $s3, 1, $s4 I6: сохранить $s3, [A]

Предположим, что используется политика кэширования со сквозной записью. Если блок памяти A, B и C загружен (при необходимости) в два разных блока кэша (изначально пустых) на одном процессоре, заполните следующую таблицу, чтобы определить состояние кэша блоков, содержащих A, B, C, после каждого инструкция выполняется.

Мой ответ на это:

Step/State                A                   B               C
I1                        E                   I               I
I2                        E                   E               I
I3                        E                   E               I
I4                        I                   I               E
I5                        I                   I               E
I6                        E                   I               I

(2) В следующем RTL

I1: R1 <-[6] 
I2: R2 <-[4] 
I3: R3 <- R1 + R2 
I4: [6]<- R3 
I5: R4 <- R4 - 1 
I6: [4]<- R4 

Предположим, что используется политика кэширования со сквозной записью. Если блоки памяти 4 и 6 загружаются в два разных блока кэша (изначально пустых) на одном процессоре

Мой ответ

Step/state            Block 4                Block 6
Initial                 I                      I
I1                      I                      E
I2                      E                      E
I3                      E                      E
I4                      I                      E(write miss, AOW)
I5                      I                      E
I6                      E(write miss, AOW)     I

Пожалуйста, мой ответ правильный? Заранее большое спасибо.


person user3684119    schedule 17.07.2014    source источник
comment
Почему вы аннулируете блоки A и B?   -  person Leeor    schedule 19.07.2014


Ответы (1)


Ответ на 1-й вопрос зависит от вашей политики записи и от того, есть ли у вас более одного уровня кеша в вашей иерархии. Вы используете запись-распределение или не-запись-распределение? И справедливо ли предположить, что у вас есть L2 с обратной записью?

Если вы предполагаете NO-write-allocate, хранилище (I4) будет писать в кэш и вообще не запрашивать строку, поэтому она останется недействительной.

Если вы предполагаете политику записи-распределения, то строка кэша C будет запрашиваться в состоянии M (по крайней мере, в одном из уровней кэша и обязательно в LLC). Таким образом, ответ здесь будет зависеть от количества имеющихся у вас кешей, а также от политики записи.

Но I4 не должен аннулировать A или B, поэтому они оба остаются в монопольном режиме. Единственный способ сделать их недействительными — это если другой процессор запишет в них или у вас возникнет конфликт. Мне неясно, как ваши ячейки памяти A, B и C отображаются на строки кэша. Если они один к одному и в кеше нет конфликта, то A и B останутся в монопольном режиме, при наличии конфликта вам нужно будет решить на основе политики замены.

Ответ на 2-й вопрос также зависит от количества кешей и от того, является ли ваше LLC обратной записью. Когда I4 записывает в блок 6, он уже находится в кеше, что означает, что он изменит как этот кеш, так и кеш нижнего уровня, который будет помечен как M (при условии, что кеш нижнего уровня имеет обратную запись). При этом Блок 4 НЕ аннулируется.

Точно то же самое происходит, когда I6 записывает в блок 4. Блок будет записан в этот кеш, а также в кеш нижнего уровня. Кэш нижнего уровня будет помечен как M (опять же, при условии, что кеш нижнего уровня имеет обратную запись).

Если вы проясните все эти предположения, я могу набросать вам правильную (на мой взгляд) диаграмму.

Надеюсь это поможет!

person Tayyar R    schedule 25.07.2014