Блок кэша перезаписывается при несовпадении тегов? - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь понять, как работает кэш процессора. Рассмотрим пример из курса Высокопроизводительная архитектура Udacity . Процессор имеет кэш-память Ll объемом 4 Кбайт с прямым отображением, обратной записью, выделением при записи, физическим индексированием и физическими тегами с 256-байтовыми блоками. Кэш начинается пустым, и следующие инструкции выполняются в следующей последовательности:

LD 0x0000ABFD
ST 0x0000ABFC
ST 0x0000AB7C
LD 0x0000BCEC
LD 0x0000ACEC
ST 0x0000BCEC

Адрес доступа для доступа к кешу:

  1. тег (биты с 31 по 12)

  2. индекс (биты с 11 по 8)

  3. смещение (биты с 0 по 7)

Таким образом, последовательность обращений к кешу следующая:

 tag  |idx|offs| hit or miss 
-----------------------------
0000A | B | FD | Cache miss since it's empty
0000A | B | FC | Cache hit since the index and the tag match
0000A | B | 7C | Hit 
0000B | C | EC | Miss (tag mismatch)
0000A | C | EC | Miss (tag mismatch)
0000B | С | EC | ?? Hit (0000B|С is still in the cache) ??  

Кажется, что все понятно, кроме последней строки. В моем понимании, когда LD 0x0000ACEC получил доступ к кешу (и получил ошибку из-за несоответствия тега), он должен был обновить запись в кэше с индексом C, включая тег, поэтому последующий ST 0x0000BCEC больше не должен видеть тег 0000B, но 0000A и получите промах тайника. Но похоже, что мое мнение неверно. Может ли кто-нибудь объяснить, что на самом деле происходит при доступе к существующему индексу кэша с другим тегом?

Другой вопрос: когда мы обновляем записи в кэше, мы обновляем весь блок кэша или только значение, соответствующее смещению блока кэша? Например, LD 0x0000AB11, а затем LD 0x0000AB34.

Есть ли разница с точки зрения кэширования между загрузкой и доступом к хранилищу?

...