Alasir Enterprises
Main Page >  Articles >  Принципы работы кэш-памяти  

 
Main Page
 
 
Reviews
 
Articles
 
Software
 
Reference
 
Motley
 
 
About Us
 
 
Принципы работы кэш-памяти

Павел Болотов
 
Дата публикации: 20 апреля 2007
Дата последнего изменения: 20 апреля 2007

Содержание:
in English

 
Размер строки, тэга и индекса

Как уже было упомянуто в предыдущем разделе, любая кэш-память подразделяется на так называемые строки (lines). Было бы крайне нерационально наделять каждый байт в кэш-памяти адресным полем, указывающим на его местонахождение в оперативной памяти, потому что это привело бы к очень тяжёлым последствиям с точки зрения производственных затрат. Если рассмотреть 32-битное линейное физическое адресное пространство, позволяющее непосредственно поддерживать до 4Гб оперативной памяти, каждый байт в кэш-памяти должен обслуживаться 4 адресными байтами! Кроме того, такая кэш-память была бы очень плоха с точки зрения производительности. Поэтому куда удобнее адресовать некоторые группы из соседствующих байт, которые и будут формировать строки кэш-памяти. На практике широко используются строки по по 32 или 64 байта, хотя их размер может достигать даже 1024 байт. Естественно, размер строки должен быть эквивалентен двойке в некоторой целой положительной степени. Однако, даже если требование по размеру выполнено, не каждая группа из соседствующих байт может быть кэширована по причине дополнительного ограничения, известного как адресное выравнивание (address alignment). Другими словами, группа соседствующих байт может помещена в строку кэш-памяти тогда и только тогда, если её начальный адрес выровнен по границе, равной размеру строки. Например, 32-байтная строка может быть заполнена информацией из оперативной памяти, находящейся по шестнадцатеричным (десятичным) адресам 00-1F (00-31), 20-3F (32-63), 40-5F (64-95) и т. д. Кроме иных преимуществ, это простое правило позволяет сократить число адресных бит в расчёте на одну строку. Если точнее, то на 5 в вышеприведённом примере, т. е. log2(32) = 5. Наконец, строка кэш-памяти может быть либо полностью заполненной действительной информацией, либо полностью пустой, что равносильно быть заполненной недействительной информацией. Промежуточные варианты не поддерживаются. Из этого правила есть одно исключение: если у двух строк кэш-памяти имеется одно общее адресное поле, тогда их можно рассматривать как подстроки одной строки, которые могут функционировать относительно независимо одна от другой.
 
Каждое адресное поле состоит из двух основных частей: динамической (tag), которая содержит старшие биты адреса, и статической (index), которая содержит младшие биты адреса (nota bene: не путать с динамическими и статическими ячейками памяти, это другое). Первая часть может быть изменена в процессе работы, значение второй зафиксировано. Для объяснения их функционального назначения необходимо ввести понятие логической сегментации оперативной памяти. Допустим, имеется некоторое физическое пространство оперативной памяти, состоящее из M сегментов памяти одинакового размера, каждый из которых равен по размеру сегменту кэш-памяти. Каждый сегмент памяти состоит из N строк одинакового размера, каждая из которых равна по размеру строке кэш-памяти. Таким образом, чтобы получить адрес какой-либо строки памяти, необходимо сначала определить номер её сегмента памяти, затем номер данной строки в этом сегменте и объединить оба номера. Для полноты картины осталось лишь подставить тэг вместо номера сегмента и индекс вместо номера строки.
 
Cache memory to operating memory mapping

Размер тэга строки кэш-памяти зависит от 3 основных факторов:
  • размера кэш-памяти;
  • ассоциативности кэш-памяти;
  • кэшируемого размера оперативной памяти.

Этот размер рассчитывается по следующей формуле:
 
Cache tag equation

   Stag — размер одного тэга кэш-памяти, в битах;
   Smemory — максимальный кэшируемый размер оперативной памяти, в байтах;
   Scache — размер кэш-памяти, в байтах;
   A — ассоциативность кэш-памяти, в каналах.
 
Таким образом, для абстрактной системы с максимальным кэшируемым объёмом оперативной памяти в 1Гб и кэш-памятью (неважно какого уровня) размером в 1Мб с 2-канальной ассоциативностью потребуется ровно 11 бит для каждого тэга. Другими словами, для адресации любым отдельным тэгом 1Гб / 512Кб = 2048 сегментов памяти потребуется log2(2048) = 11 бит. Следует уточнить, что ровно столько бит на тэг необходимо для кэширования именно 1Гб оперативной памяти при данной организации кэш-памяти. Если сократить количество бит, то такой кэш останется работоспособным, однако кэшируемый размер оперативной памяти уменьшится. Например, 8 бит на тэг позволят адресовать уже только 28 = 256 сегментов памяти по 512Кб, что позволит кэшировать лишь 128Мб оперативной памяти. Информация, находящаяся выше этой границы, кэшироваться не будет. Подобная ситуация нежелательна, но была широко распространена во времена процессоров 486 и Pentium. Их наборы системной логики поддерживали значительные объёмы оперативной памяти как на то время, типично от 256Мб до 1Гб для систем Pentium-класса, но кэшируемый B-cache диапазон был обычно ограничен 64Мб. Многие из тех систем использовали стандартную 8-битную микросхему SRAM для массива тэгов и восемь 8х32Кбит микросхем SRAM, формировавших 256Кб банк данных с прямым отображением. Эти микросхемы часто размещались в стандартных установочных гнёздах, поэтому могли быть заменены без каких-либо проблем. Позже, они уступили место удешёвлённым аналогам с большим числом контактов, которые распаивались прямо на материнских платах. К слову, значительно менее затратно произвести и установить пару 32х32Кбит микросхем, чем восемь 8х32Кбит, да ещё и с установочными гнёздами. Наибольший размер B-cache, устанавливавшийся на материнские платы Pentium-класса, составлял 2Мб. Подобные дискретные кэши не прижились в следующих поколениях массовых x86 систем за исключением нескольких процессорных семейств, где микросхемы кэш-памяти устанавливались на процессорные модули — Intel Pentium II (Klamath, Deschutes) и Pentium II Xeon (Drake), Intel Pentium III (Katmai) и Pentium III Xeon (Tanner), AMD Athlon (К7, K75).
 
Размер индекса зависит от размеров сегмента кэш-памяти и строки. Фактически, его должно быть достаточно для номерации всех строк в пределах отдельно взятого сегмента. Например, если имеется сегмент кэш-памяти в 512Кб с 32-байтными строками, то размер индекса составит log2(512Кб / 32б) = 14 бит. Следовательно, каждая строка в каком-либо сегменте имеет свой постоянный номер, который не подлежит изменению, да и какой-либо необходимости в этом нет. Если имеется N сегментов кэш-памяти, тогда всегда должно быть N строк кэш-памяти с одинаковым индексом. Увеличение размера строки при неизменном размере сегмента приведёт к уменьшению размера индекса, а также и к уменьшению их количества вследствие уменьшения числа строк. В то же время увеличение размера строки приводит к увеличению задержек при загрузке строк из других уровней кэш-памяти или оперативной памяти, равно как и при выгрузке, поскольку возможности шинных интерфейсов небезграничны. К тому же, больший размер строки ухудшает эффективность кэш-памяти вследствие большей степени её засорения ненужной информацией.
 
Ко всему прочему, каждая строка кэш-памяти обычно обладает некоторой избыточной информацией для надлежащего контроля за ошибками. Как правило, поля данных защищаются либо проверкой чётности (parity checking) на уровне отдельных байт, либо одним из протоколов проверки и коррекции ошибок (ECC — Error Checking and Correcting) на уровне целого поля, большинство из которых основывается на алгоритме Хэмминга (the Hamming algorithm). Тэги могут защищаться однобитовой проверкой чётности, хотя эта практика распространена в значительно меньшей степени, чем защита полей данных. Тем не менее, какой бы из алгоритмов защиты информации ни был выбран, его обслуживающая логика привнесёт сложности в существующую разработку и неминуемо отразится на задержках при работе. Если точнее, то при каждой операции чтения контрольная сумма поля данных должна быть сосчитана и сверена с сохранённой. Наиболее тяжёлым является случай частичной записи в действительную строку, так как контрольная сумма должна быть сосчитана дважды: до и после изменения строки.
 
<< Предыдущая страница Следующая страница >>

Copyright (c) Болотов Павел Владимирович, 2007. Все права сохранены.
Полная или частичная перепечатка без разрешения автора запрещена.
 
Designed and maintained by Alasir Enterprises, 1999-2007
rhett from alasir.com, walter from alasir.com