2012-03-28 2 views
0

Я знаю, что это вопрос домашней работы, и я не прошу ответа. Я просто хотел бы понять этот вопрос, не стесняйтесь использовать другие примеры для объяснения.Прямой сопоставленный кеш с использованием блоков

вопрос, что мне нужно ответить на это ...

Each reference is a read of a 4-byte integer value and is described by the byte 
address of that integer. 

Assuming a 1KB, 16B block, direct-mapped cache, initially empty, fill in whether 
each reference is a hit or a miss. 

Мы дали список ссылок, которые являются 4 байта. Например, 0x00000000, 0x00000006, ...

По моему мнению, имеется 64 блока (1024/16), а каждый блок - 16 байт. Когда он смотрит на первую ссылку, это будет пропуском, и это приведет к входу в кеш. Я знаю, что он добавляет следующую ссылку в кэш, потому что каждый блок будет содержать 16 байт. Означает ли это, что при промахе оно содержит 4 ссылки, потому что каждая ссылка составляет 4 байта?

ответ

1

Да, что вы поняли правильно. Когда байт считывается из памяти, временная локальность предполагает, что последующие последующие байты также будут прочитаны. Таким образом, кэши обычно имеют размер блока более чем 1 справки, в данном случае 4 ссылки. Во время следующего доступа к памяти, если процессор запрашивает самую следующую ссылку, он уже присутствует в кеше!

Адрес памяти можно разделить на две части: адрес блока и смещение блока. Смещение блока будет использоваться для выбора между этими ссылками, которые находятся в одном блоке кэша. Другая часть, адрес блока, далее разделяется на поля тегов и индексов. Поле индекса используется для выбора того, к какому настроенному доступу (в случае прямого сопоставления кеша, каждый блок кеша установлен 1). Поле тега выбирает блок кеша из набора.

1

@shailesh является правильным, но будьте внимательны со словом ссылка. ссылка шаблон зависит от программы. Представьте, что мы пишем программу C, которая ссылается на массив символов в шаге 16Byte. Вот глупая процедура, которая будет делать в основном это:

void foo (char * x, int MAX) { 
    int i; 
    char a; 

    for (i = 0; i < MAX; i += 16) 
      a = x[i]; 
} 

Пусть x находится по адресу 0x00000000. Затем этот контур ссылается на адреса 0x00000000, 0x00000010, 0x00000020, 0x00000030 и т. Д. В этом случае после самой первой ссылки на x[0], x[0] через x[15] будут внесены в кеш из-за размера блока 16B. Но следующее ссылка, что составляет x[16]не имеет. Другими словами, для вашего кеша здесь всякая ссылка в этом цикле приведет к пропуску кеша.

Вы обнаружите, что при оптимизации производительности мышление о организации и поведении кэша машины поможет вам избежать плохих папок доступа к памяти, подобных этому.

Смежные вопросы