2013-05-02 3 views
2

Какова формула для вычисления индекса и тегов бит вBit Перемена в кэше Моделировании

  1. Direct Подключенного Cache
  2. ассоциативного кэш
  3. ассоциативного кэш

настоящее время я использую эта формула для прямого отображения:

#define BLOCK_SHIFT 5; 
#define CACHE_SIZE 4096; 
int index = (address >> BLOCK_SHIFT) & (CACHE_SIZE-1); 
/* in the line above we want the "middle bits" that say where the block goes */ 
long tag = address >> BLOCK_SHIFT; /* the high order bits are the tag */ 

Скажите, пожалуйста, сколько бит сдвинуто в Ассоциативном и Set Associative Cache.

+0

Сколько «путей» - ваши ассоциативные кеши? –

+0

На этом уровне для начинающих я использую только 2-х позиционный ассоциативный ассоциативный –

+2

Итак, если у вас есть адрес некоторых данных, и у вас есть «два места» для размещения данных (вместо одного места), какая разница вы думаете, что это делает сдвиги? Я пытаюсь заставить вас понять это для себя, потому что, если я просто скажу вам, вы не будете многому учиться. –

ответ

1

Итак, я думаю, что конкретный ответ на ваш вопрос «нуль», но это просто потому, что вы задаете неправильный вопрос.

Правильно, поэтому кеш с заданным размером X, который непосредственно отображается, будет просто использовать нижнюю часть [или какую-либо другую часть (части)] для формирования индекса в кеш. Таким образом, индекс представляет собой значение от 0 до (chace-size-1). Другими словами, «адрес по модулю размера». Поскольку размеры кешей почти всегда равны 2 n, мы используем тот факт, что оба они могут быть выполнены с использованием простых поразрядных «и» с (size-1) вместо использования деления.

В вашем коде каждая запись кэша (кэш-строка) содержит «БЛОК» из 32 байт, поэтому адрес должен быть разделен (сдвинут) вниз на размер блока. 2 = 32. Этот сдвиг остается постоянным для постоянного размера строки кеша. Поскольку в вашем примере кода нет другого изменения, я предполагаю, что вы не понимаете, что вам следует делать.

В ассоциативно-ассоциативном кеше существует несколько наборов строк кеша, которые могут использоваться для одного и того же индекса. Поэтому вместо того, чтобы просто принимать нижнюю часть адреса в качестве индекса, мы берем SMALLER часть нижнего адреса. Таким образом, index = address_of_block & (CACHE_SIZE-1) должен стать address_of_block & ((CACHE_SIZE-1)/ways. Поскольку мы имеем дело с номером 2 n, мы можем использовать старый трюк «сдвиг вместо деления» - x/y, где y is 2 n может быть сделано x >> n.

Итак, теперь вам нужно только выяснить, что n для вашего количества способов.

И, конечно, выясните, как вы определяете, какой из способов использовать при замене чего-либо в кеше, но это, безусловно, совершенно другой вопрос.

+0

Большое вам спасибо за понимание мой вопрос глубоко и научил меня такой приятный путь. –

+0

У меня вопрос только один, если для ассоциативного кеша я меняю свою формулу на index = adddress of block & (CacheSIze-1)/ways –

+0

Тогда как это происходит, я запутался .. Можете ли вы дать мне формулу, пожалуйста. ... –