Я пытаюсь понять, как работает кэш процессора. Рассмотрим пример из курса Высокопроизводительная архитектура Udacity . Процессор имеет кэш-память Ll объемом 4 Кбайт с прямым отображением, обратной записью, выделением при записи, физическим индексированием и физическими тегами с 256-байтовыми блоками. Кэш начинается пустым, и следующие инструкции выполняются в следующей последовательности:
LD 0x0000ABFD
ST 0x0000ABFC
ST 0x0000AB7C
LD 0x0000BCEC
LD 0x0000ACEC
ST 0x0000BCEC
Адрес доступа для доступа к кешу:
тег (биты с 31 по 12)
индекс (биты с 11 по 8)
смещение (биты с 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
.
Есть ли разница с точки зрения кэширования между загрузкой и доступом к хранилищу?