2013-09-17 1 views
0

В связи с вопросом кэша по следующей ссылке: linkCache значение тега

вопрос: Используя серию адресов ниже, показывают хиты и промахи и окончательный содержимое кэша для двухстороннего комплект- ассоциативный кеш с блоками с одним словом, 4-байтовыми словами и общим размером 16 слов. Предположим, что замена FIFO.

0, 4, 64, 0, 128, 32, 12, 96, 128, 64

Мой вопрос: Почему значение тега устанавливается в адрес слово/8?

Спасибо.

ответ

1

Краткое объяснение. Если кеш содержит 16 слов (= 64 байта, довольно маленький :), и это ассоциативный набор с 2-мя позициями, тогда у вас есть 8 наборов, которые непосредственно отображаются по адресу. Вам не нужны биты, которые должны быть частью тега, потому что вы уже использовали их для сопоставления с правильным набором.

Предполагая, что степень детализации доступа составляет 1 байт, у вас адрес имеет 2 бита LSB, которые отображают вас внутри блока (4 байта), вам нужно игнорировать их при доступе к кешу, так как вы читаете полный блок (память единица затем будет использовать эти 2 бита, чтобы дать вам точные байты в блоке в соответствии с размером и выравниванием чтения). Итак, слово address = real_address/4

Теперь, поскольку у вас есть 8 наборов, вы используете следующие 3 бита для сопоставления с правильным набором.

+--------------------------------------+----------------------+-------------------+ 
|   Tag (bits 5 and above)  |  Set (bits 2,3,4) | Offset (bits 0,1) | 
+--------------------------------------+----------------------+-------------------+ 

То есть, адр 0x0 отображались бы установить 0, адр 0x4 (слово адр 0x1) всегда будет сидеть на множестве нет. 1, несмотря ни на что. set 2 будет иметь addr 0x8 (word addr 0x2), для установки 3 будет addr 0xC (слово addr 0x3), ... и так далее, пока не будет установлено значение 7 для addr 0x1C (слово addr 0x7).

Следующий адрес будет просто обернут - addr 0x20 (word addr 0x8) проверит биты 2..4 и увидит, что они обнулены, поэтому снова отобразится, чтобы установить 0, и так далее. В этот момент приходит тег, чтобы различать адрес 0x0, addr 0x20, addr 0x10000 или любой другой адрес, который отображается там (addr% 0x20 == 0, или word_addr% 8 == 0). Так как вы не заботитесь о смещении внутри линии здесь, и установленные биты уже известны, когда вы решаете получить доступ к определенному набору, единственное, что отсутствует, требующее хранения (кроме данных, конечно), - это биты выше биты набора - это требуется (и достаточно) для определения идентичности строки в заданном наборе и для того, чтобы узнать, попадает ли поиск или пропускается. Эти биты являются addr/0x20 (или addr >> 5) или word_addr/8 (= word_addr >> 3)

Обратите внимание, что это означает, что одного тега недостаточно для идентификации строки addr, вам нужны теги и установите бит, чтобы восстановить это.