Скачиваний:
65
Добавлен:
16.04.2013
Размер:
276.48 Кб
Скачать

$. Средства кэширования

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

$.1 Средства кэширования современных микропроцессоров

В переводе слово кэш(cache) означает «кошелек», «тайный склад», «тайник» («заначка»). Характеристика таинственности происте­кает из того, что все средства кэширования прозрачны для программы – программа не видит, проходит ли информация через них или нет. К средствам кэширования относятся: до трех уровней кэша инструкций и данных (L1Cache,L2CacheиL3Cache), кэш трассировки (TC–TraceCache), буферы ассоциативной трансляции (TLB–TranslationLook-asideBuffer) блока страничной переадресации, таблица виртуальных хэш страниц (VHPT–VirtualHashPageTable) и буферы записи.

Программа - потребитель информации

КЭШ

Основная память – не быстрая, но дешёвая

Рис.$.0. Место средств кэширования в процедуре обработке информации.

Средства кэширования является дополнительным быстродействую­щим хранилищем копий блоков информации из основной памяти, вероятность обращения к которым в ближайшее время велика (рис.$.0). Они не добавляют адресуемой области памяти, программа не может обратиться к ним явно, но операционная система имеет инструменты управления средствами кэширования.

$.1. Принципы кэширования памяти

В компьютерах, основная память реализуется на относительно медленной динамической памяти (DRAM), обращение к ней приводит к простою процессора – появляются такты ожидания (waitstates). Статическая память (SRAM), построенная, как и процессор, на транзисторных ячейках, по своей природе способна догнать современные процессоры по быстродействию и сделать ненужными такты ожидания (или хотя бы сократить их количество). Кроме того, доступ к основной памяти (расположенной вне процессора) происходит через системную шину, скоростные возможности которой существенно ограничены. Есть и другие ограничения препятствующие тому, чтобы сделать всю память быстродействующей:

  • чем быстрее память, тем она дороже (причем зависимость экспоненциальная),

  • чем быстрее память, тем она больше выделяет тепла, а значит, её следует снабжать специальными средствами теплоотвода и располагать подальше от накаляющегося во время работы микропроцессора,

  • чем быстрее работает шина связи, тем короче она должна быть (из-за взаимных наводок и по причине ограниченности скорости света).

Разумным компромиссом для построения экономичных и производительных систем явился иерархический способ организации оперативной памяти. Идея заключается в следующем сочетании:

  • основная память большого объема работает относительно медленно и связана с процессором относительно медленной общей шиной,

  • внешняя кэш-память третьего уровня (L3) существенно меньше, но работает быстрее и связана с процессором более быстрой шиной,

  • расположенная внутри процессора, кэш-память второго уровня (L2), она еще меньше, но работает почти на частоте процессора и достаточно быстро,

  • быстродействующая маленькая кэш-память первого уровня (L1), она тесно интегрирована в процессор.

Кэш не может хранить копию всей основной памяти, поскольку его объем во много раз меньше основной памяти. Он хранит лишь ограниченное количество блоков данных и каталог (cachedirectory) – список их текущего соответствия областям основной памяти. Кроме того, кэшироваться может не вся память, доступная процессору (либо из-за того, что так построен кэш данного уровня, либо потому, что так задано операционной системой).

При каждом обращении к памяти контроллер кэш-памяти по каталогу проверяет, есть ли действительная копия затребованных данных в кэше. Если она там есть, то это случай кэш-попадания(cachehit), и данные берутся из кэш-памяти. Если действительной копии там нет, это случайкэш-промаха(cachemiss), и данные берутся из основной памяти. В соответствии с алгоритмом кэширования блок данных, считанный из основной памяти, при определенных условиях заместит один из блоков кэша. От интеллектуальности алгоритма замещения зависит процент попаданий и, следовательно, эффективность кэширования. Поиск блока в списке должен производиться достаточно быстро, чтобы «задумчивостью» в принятии решения не свести на нет выигрыш от применения быстродействующей памяти. Обращение к основной памяти может начинаться одновременно с поиском в каталоге, а в случае попадания - прерываться (архитектураLook-aside). Это экономит время, но лишние обращения к основной памяти ведут к увеличению энергопотребления. Другой вариант: обращение к внешней памяти начинается только после фиксации промаха (архитектураLookThrough), при этом теряется, по крайней мере, один такт процессора, зато экономится энергия.

В современных компьютерах кэш обычно строится по двухуровневой схеме. Кэш первого уровня (L1Cache) встроен во все процессоры 486+; это внутренний кэш. Объем этого кэша невелик (8-32 Кбайт). Чтобы повысить производительность, для данных и команд часто используется раздельный кэш (так называемая Гарвардская архитектура – противоположность Принстонской, использующей общую память для команд и данных). Кэш второго уровня (L2Cache) для процессоров 486 иPentiumявляется внешним (устанавливается на системной плате), а уP6+ располагается в одной упаковке с ядром и подключается к специальной внутренней шине процессора.

Кэш-контроллер должен обеспечивать когерентность (coherency) – согласованность данных кэш-памяти обоих уровней с данными в основной памяти, при том условии, что обращение к этим данным может производиться не только процессором, но и другими активными (busmaster) адаптерами, подключенными к шинам (PCI,VLB,ISAи т. д.). Следует также учесть, что процессоров может быть несколько, и у каждого может быть свой внутренний кэш.

Контроллер кэша оперирует строками (cacheline) фиксированной длины. Строка может хранить копию блока основной памяти, размер которого, естественно, совпадает с длиной строки. С каждой строкой кэша связана информация об адресе скопированного в нее блока основной памяти и ее состоянии. Строка может бытьдействительной(valid) – это означает, что в текущий момент времени она достоверно отражает соответствующий блок основной памяти, или недействительной. Информация о том, какой именно блок занимает данную строку (т.е. старшая часть адреса или номер страницы), и о её состоянии называетсятегом(tag) и хранится в связанной с данной строкой ячейке специальнойпамяти тегов(tagRAM). В операциях обмена с основной памятью обычно строка участвует целиком (несекторированный кэш), для процессоров 486 и выше длина строки совпадает с объемом данных, передаваемых за один пакетный цикл (для 486 - это 4х4=16 байт, дляPentium- 4х8=32 байт). Возможен и вариант секторированного (sectored) кэша, при котором одна строка содержит несколько смежных ячеек –секторов, размер которых соответствует минимальной порции обмена данных кэша с основной памятью. При этом в записи каталога, соответствующей каждой строке, должны храниться биты действительности для каждого сектора данной строки. Секторирование позволяет экономить память, необходимую для хранения каталога при увеличении объема кэша, поскольку большее количество бит каталога отводится под тег, и выгоднее использовать дополнительные биты действительности, чем увеличивать глубину индекса (количество элементов) каталога.

Строки кэша под отображение блока памяти выделяются при промахах операций чтения, в P6 строки заполняются и при записи. Запись блока, не имеющего копии в кэше, производится в основную память (для повышения быстродействия запись может производиться через буфер отложенной записи). Поведение кэш-контроллера при операции записи в память, когда копия затребованной области находится в некоторой строке кэша,определяется его алгоритмом, или политикой записи (WritePolicy). Существуют две основных политики записи данных из кэша в основную память:сквозная запись WT(WriteThrough) иобратная (отложенная) запись WB(WriteBack).

Политика WTпредусматривает одновременное выполнение каждой операции записи (даже однобайтной), попадающей в кэшированный блок, в строку кэша и в основную память. При этом процессору при каждой операции записи придется выполнять относительно длительную запись в основную память. Алгоритм достаточно прост в реализации и легко обеспечивает целостность данных за счет постоянного совпадения копий данных в кэше и основной памяти. Для него не нужно хранить признаки присутствия и модифицированности – вполне достаточно только информации тега (при этом считается, что любая строка всегда отражает какой-либо блок, а какой именно – указывает тег). Но эта простота оборачивается низкой эффективностью записи. Существуют варианты этого алгоритма с применением отложенной буферизованной записи, при которой данные в основную память переписываются через FIFO-буфер во время свободных тактов шины.

Политика WBпозволяет уменьшить количество операций записи на шине основной памяти. Если блок памяти, в который должна производиться запись, отображен в кэше, то физическая запись сначала будет произведена в эту действительную строку кэша, которая отмечается какгрязная(dirty), или модифицированная, то есть требующая выгрузки в основную память. Только после этой выгрузки (записи в основную память) строка станетчистой(clean), и ее можно будет использовать для кэширования других блоков без потери целостности данных. В основную память данные переписываются только целой строкой. Эта выгрузка контроллером может откладываться до наступления крайней необходимости (обращение к кэшированной памяти другим абонентом, замещение в кэше новыми данными) или выполняться в свободное время после модификации всей строки. Данный алгоритм сложнее в реализации, но существенно эффективнее, чем WT. Поддержка системной платой кэширования с обратной записью требует обработки дополнительных интерфейсных сигналов для выгрузки модифицированных строк в основную память, если к этой области производится обращение со стороны таких контроллеров шины, как другие процессоры, графические адаптеры, контроллеры дисков, сетевые адаптеры и т.п.

В зависимости от способа определения взаимного соответствия строки кэша и области основной памяти различают три архитектуры кэш-памяти: кэш прямого отображения(direct-mappedcache),полностью ассоциативный кэш(fullyassociativecache) и их комбинация наборно-ассоциативный кэш(set-associativecache).

$.1.1. Кэш прямого отображения

В кэш-памяти прямого отображения адрес памяти, по которому происходит обращение, однозначно определяет строку кэша, в которой может находиться требуемый блок. Принцип работы такого кэша поясним на примере несекторированного кэша объемом 256 Кбайт с размером строки 32 байта и объемом кэшируемой основной памяти 64 Мбайт – типичный кэш системной платы для Pentium. Структуру памяти в такой системе иллюстрирует рис.$.1.

Кэш-каталог

Строки кэш-памяти

Index

Tag

V

M

8К-1

8К-2

N-LINE

N-TEG

1

0

32 байта

25

Tag

18

17

Index

5

4

0

N-TEG

N-LINE

N-BYTE

Адрес кэшируемой памяти

Номер страницы основной памяти

Номер строки

в странице

Смещение

в строке

Рис. $.1. Кэш прямого отображения

Кэшируемая основная память условно разбивается на страницы (в данном случае по 256 Кбайт), размер которых совпадает с размером кэш-памяти (256 Кбайт). Кэш-память (и, условно, страницы основной памяти) делятся на строки (256 Кбайт/32 = 8Кбайт строк). Архитектура прямого отображения подразумевает, что каждая строка кэша может отображать из любой страницы кэшируемой памяти только соответствующую ей строку (на рисунке они находятся на одном горизонтальном уровне). Поскольку объем основной памяти много больше объема кэша, на каждую строку кэша может претендовать множество блоков памяти с одинаковой младшей частью адреса (смещением внутри страницы). Одна строка в определенный момент может, естественно, содержать копию только одного из этих блоков. Номер (адрес) строки в кэш-памяти называется индексом(index).Тегнесет информацию о том, какой именно блок занимает данную строку (т.е. старшая часть адреса или номер страницы). Память тегов должна иметь количество ячеек, равное количеству строк кэша, а ее разрядность должна быть достаточной, чтобы вместить старшие биты адреса кэшируемой памяти, не попавшие на шину адреса кэш-памяти. Кроме адресной части тега, с каждой строкой кэша связаны, биты признаков действительности и модифицированности данных.

В начале каждого обращения к кэшируемой памяти контроллер первым делом считывает ячейку каталога с заданным индексом, сравнивает биты адреса тега со старшими битами адреса памяти и анализирует признак действительности. Этот анализ выполняется в специальном цикле слежения(snoopcycle), иногда его называют цикломзапроса(inquire). Если в результате анализа выясняется, что требуемого блока нет в кэше, генерируется (или продолжается) цикл обращения к основной памяти (случай кэш-промаха). В случае попадания запрос обслуживается кэш-памятью. В случае промаха после считывания основной памяти приемником информации новые данные помещаются в строку кэша (если она чистая),а в ее тег помещаются старшие биты адреса и устанавливается признак действительности данных. Независимо от объема затребованных данных в кэш из основной памяти строка переписывается вся целиком (поскольку признак действительности относится ко всем ее байтам). Если контроллер кэша реализуетупреждающее считывание(readahead), то в последующие свободные циклы шины также обновится и следующая строка (если она была свободной). Чтение «про запас» позволяет при необходимости осуществлять пакетный цикл чтения из кэша через границу строки.

Такой кэш имеет самую простую аппаратную реализацию и применяется в кэше L2 большинства системных плат. Однако ему присущ серьезный недостаток, вполне очевидный при рассмотрении рис.$.1. Если в процессе выполнения программы процессору поочередно будут требоваться блоки памяти, смещенные относительно друг друга на величину, кратную размеру страницы (на рисунке эти блоки расположены на одной горизонтали в разных страницах), то кэш будет работать интенсивно, но вхолостую (cachetrashing). Очередное обращение будет замещать данные, считанные в предыдущем и необходимые в следующем обращении, – то есть будет сплошная череда кэш-промахов. Переключение страниц в многозадачных ОС также снижает количество кэш-попаданий, что отражается на производительности системы. Увеличение размера кэша при сохранении архитектуры прямого отображения даст не очень существенный эффект, поскольку разные задачи будут претендовать на одни и те же строки кэша. Не увеличивая объема, можно повысить эффективность кэширования изменением структуры кэша, о чем пойдет речь ниже;

Объем кэшируемой памяти (MCACHED) при архитектуре прямого отображения определяется объемом кэш-памяти (VCACHE) и разрядностью памяти тегов (N): MCACHED =vCACHE*2n, в нашем случае MCACHED = 256 Кбайт*28= 64 Мбайт.

Иногда в описании кэша прямого отображения фигурирует понятие набор(set). Оно применяется вместо терминастрока(line) всекторированном кэше прямого отображения,асектортогда называютстрокой.

Кэш-каталог

Строки кэш-памяти

Index

Tag

V

M

8К-1

8К-2

N-LINE

N-TEG

1

0

4x32 байта

27

Tag

20

19

Index

7

6

Sect.

5

4

0

N-TEG

N-LINE

N-SECT

N-BYTE

Адрес кэшируемой памяти

Номер страницы основной памяти

Номер строки

Номер сектора

Смещение в секторе

Рис. $.2. Секторированный кэш прямого отображения

С набором (как и строкой несекторированного кэша) связана информация о теге, относящаяся ко всем элементам набора (строкам или секторам). Кроме того, каждый элемент набора (строка или сектор) имеет собственный бит действительности в кэш-каталоге (рис. $.2).

$.1.2. Наборно-ассоциативный кэш

Наборно-ассоциативная архитектуракэша позволяет каждому блоку кэшируемой памяти претендовать наодну из несколькихстрок кэша, объединенных внабор (set). Можно считать, что в этой архитектуре есть несколько параллельно и согласованно работающих каналов (ways) прямого отображения (рис.$.3). Иногда наборы строк относящихся к одному и тому же каналу «s» называют банком «s».

Кэш-каталог

Строки кэш-памяти

Index

Tag (s)

V

M

LRU

(32 байта)

8К-1

8К-2

N-LINE

N-TEG

каналы

1

0

25

Tag

18

17

Index

5

4

0

N-TEG

N-LINE

N-BYTE

Адрес кэшируемой памяти

Номер страницы основной памяти

Номер строки

в странице

Смещение

в строке

Рис. $.3. Многоканальный наборно-ассоциативный кэш

Контроллер кэша принимает решение о том, в какую из строк набора помещать очередной блок данных исходя из следующих соображений:

  • Номер набора (индекс), в котором может отображаться затребованный блок данных, однозначно определяется средней частью адреса N-LINE(как номер строки в кэше прямого отображения).

  • Номер банка (канала) определяется сравнением тегов (как и в ассоциативном кэше), параллельно выполняемым для всех каналов кэша.

С каждым набором должен быть связан признак, определяющий строку набора, подлежащую замещению новым блоком данных в случае кэш-промаха. Кандидатом на замещение обычно выбирается строка, к которой дольше всего не обращались (алгоритм LRULeastRecentlyUsed). Для двухканального кэша (TwoWaySetAssociativeCache) достаточно одного бита, а при относительно большом количестве каналов прибегают к некоторому упрощению – алгоритмPseudo-LRUдля четырех строк позволяет принимать решения, используя, всего 3 бита. Возможно также применение алгоритма замещенияFIFO(первым вошел – первым вышел) или даже случайного (random) замещения, что проще, но менее эффективно.

Наборно-ассоциативная архитектура широко применяется для кэша L1 современных процессоров. Объем кэшируемой памяти определяется так же, как и в предыдущем варианте, но здесь фигурируют объем одного банка (а не всего кэша) и разрядность относящихся к нему ячеек тега.

$.1.3. Ассоциативный кэш

В отличие от предыдущих, у полностью ассоциативногокэша любая его строка может отображать любой блок памяти, что существенно повышает эффективность использования его ограниченного объема. При этом все биты адреса кэшированного блока, за вычетом битов, определяющих положение (смещение) данных в строке, хранятся в памяти тегов. В такой архитектуре для определения наличия затребованных данных в кэш-памяти требуется сравнение со старшей частью адреса тегов всех строк, а не одной или нескольких, как при прямом отображении или наборно-ассоциативной архитектуре. Естественно, последовательный перебор ячеек памяти тегов отпадает – на это может уйти слишком много времени. Остается параллельный анализ всех ячеек, что является трудоёмкой аппаратной задачей, которая пока решена только для небольших объемов кэшаL1 в некоторых процессорах. Применение полностью ассоциативной архитектуры в кэшеL2 пока не предвидится.

$.1.4 Функционирование TLB

Как говорилось ранее, страничная организация памяти требует дополнительных затрат времени для преобразования (трансляции) линейного адреса в физический. Эти затраты будут весьма значительными, если в каждом цикле производить обращение к оперативной памяти для выбора указателей таблиц и страниц.

Существенное сокращение времени преобразования адресов достигается путем использования специализированной внутренней кэш-памяти, которая называется буфером ассоциативной трансляции TLB (TranslationLook-asideBuffer). Такие буферы хранят физические адреса нескольких ранее выбранных страниц. При повторном обращении к этим страницам процедура трансляции не выполняется, а из TLB выбирается ранее полученный базовый адрес страницы. ПроцессорыP6+ содержат два отдельных буфера TLB – для трансляции адресов инструкций и данных (см. рис.$.4).

Буфер TLB для трансляции адресов инструкцийсостоит из двух небольших блоков, которые обеспечивают формирование физических адресов при использовании страниц объемом 4KB и 4MB. Например, вP6, TLB инструкций для 4K-байтовых страниц – это 4-х канальный наборно-ассоциативный кэш на 8 строк, в котором хранятся физические адреса 32 ранее выбранных страниц, а TLB для 4MB страниц хранит базовые адреса только 2-х страниц, к которым производились последние обращения при выборке инструкций,

Буфер TLB для трансляции адресов данных, также содержит два блока, но уже большего размера. Например, дляP6, TLB данных для 4KB страниц – это 4-х канальный наборно-ассоциативный кэш на 16 строк, в котором хранятся физические адреса 64 ранее выбранных страниц, TLB для больших страниц инструкций – это 2-х канальный наборно-ассоциативный кэш на 4 строки, в котором хранятся физические адреса 8-ми страниц.

По данным Intel, опыт применения процессоровP6 в различных системах показывает, что при данной структуреTLBвероятность выборки адреса инструкций и данных из буфера (без выполнения страничной трансляции адреса с обращением к каталогам разделов и таблицам страниц) составляет около 98%. При этом формирование физического адреса не требует дополнительных машинных циклов. Если базовый адрес нужной страницы отсутствует в TLB, то такой случай является кэш-промахом. При этом процессор выполняет описанную выше процедуру формирования физического адреса с помощью каталога разделов и таблицы страниц, затрачивая на это значительное время. Полученный базовый адрес страницы заносится в строку одного из блоков TLB.

С помощью инструкции INVLPGможно произвести очистку (аннулирование содержимого) строк TLB. При этом очищается строка, содержащая базовый адрес страницы, на которой размещается адресованная инструкцией ячейка памяти.

Одновременная очистка всех строк TLB производится при записи в регистр CR3 нового значения базового адреса каталога разделов, а также при переключении задач.

Можно предохранить от аннулирования в TLB базовые адреса страниц, задав для них в указателе страницы (см. рис. 7.7, 7.9) значение бита глобальностиG=1. Если бит разрешения глобальностиCR4.PGE=1 установлен, то базовые адреса этих страниц в TLB не будут аннулироваться при переключении задач или перезагрузке содержимого CR3. В результате, можно избежать потерь времени на трансляцию базового адреса для страниц, используемых в процессе выполнения различных задач (например, для страниц, содержащих ядро операционной системы).

При запрещенной трансляции или в реальном режиме TLB сохраняет свое содержимое до явной или неявной его очистки.

$.1.5. Пакетный режим передачи данных

Режим пакетной передачи (BurstMode) предназначен для ускорения операций пересылки строк кэша в процессорах 486+. Строка кэша процессора 486 имеет длину 16 байт, следовательно, для ее пересылки требуется четыре 32-разрядных шинных цикла. Для пересылки 32-байтной строки кэшаPentium+ требуются тоже четыре такта, поскольку разрядность передач составляет 64 бита. Использование кэша предполагает, что строка должна в нем присутствовать целиком. Пакетный цикл (BurstCycle) оптимизирован именно для операций обмена внутреннего кэша с оперативной памятью. В этом цикле адрес и сигналы идентификации типа шинного цикла выдаются только в первом такте пакета, а в каждом из последующих тактов могут передаваться данные, адрес которых уже не пересылается по шине, а вычисляется из первого адреса по правилам, известным процессору и контроллеру памяти.

В процессорах Pentiumпакетные циклы выполняются только при обращениях к памяти (в 486 пакетным мог быть и цикл ввода-вывода). Как при чтении, так и при записи они позволяют целиком передавать строку кэша. Пакетные циклы связаны только с кэшируемой памятью, при этом кэшируемость памяти подразумевает и поддержку пакетного режима. Один пакетный цикл не может пересекать границу строки кэша. Кроме того, имеется специфический порядок следования адресов в пакетном цикле, который определяется начальным адресом пакета. Во время пакетного цикла сигналы разрешения байт ВЕ[7:0] и биты адреса (включая иA[4:3]) не меняются – память вычисляет последующие адреса самостоятельно. Порядок чередования адресов приведен в табл. $.1, временную диаграмму см. нарис. 9.2. Пакетная запись применяется только для выгрузки строк кэша, при этом пакеты всегда выровнены по границам строк. Признаком пакетного цикла (и его окончания) является сигнал САСНЕ#. Внешняя система не может прервать пакетный цикл, начатый процессором.

Таблица $.1.

Последовательность адресов в пакетном цикле Pentium

Первый адрес

Второй адрес

Третий адрес

Четвертый адрес

0

8

10h

18h

8

0

18h

10h

10h

18h

0

8

18h

10h

8

0

Для системной шины P6 идея пакетных циклов сохраняется, но ее интерфейс специфичен (см. п.10.3). Вышеприведенный порядок чередования (interleaving) адресов в пакетном цикле характерен для всех процессоровIntelи совместимых с ними, начиная с 486. Он оптимизирован для организации памяти из двух банков, подразумевающей чередование банков, используемых в соседних передачах пакетного цикла. С точки зрения памяти у каждой микросхемы во время пакетного цикла могут изменяться только два младших бита адреса (независимо от разрядности шины данных процессора). Данный порядок чередования поддерживает любая память с пакетным режимом: динамическаяBEDODRAM,SDRAMи статическаяSyncBurstSRAM,PBSRAM,DRDRAM. Процессоры других семейств (например,PowerPC) используют линейный (linear) порядок адресов в пакете. Микросхемы пакетной памяти обычно имеют входной сигнал, задающий порядок адресов для конкретного применения.

Во время пакетного цикла, как и в обычном цикле, темп обмена (число тактов ожидания) задается устройством: оно вводит сигнал BRDY# по готовности данных. Временная диаграмма пакетных циклов обращения к памяти (главным образом, чтения) является основной характеристикой производительности памяти компьютера. Ее описывают числом тактов системной шины, требуемых для каждой передачи пакета. При этом, естественно, оговаривают и саму частоту. Так, например, для динамической памятиBEDO-50 не достижимый идеал – цикл 5-1-1-1 на частоте 66 МГц.

$.2. Кэширование в современных процессорах

Обобщенная структура средств кэширования 32-разрядных процессоров Intelприведена на рис.$.4. Учтите, что в разных моделях отсутствуют те или иные средства кэширования. Например, в 486 отсутствуетL3, а вPentium4 отсутствуетL1 инструкций.

Кэш инструкций L1 тесно связан с блоком предварительной выборки, а кэш данныхL1 – с исполнительным блоком процессора. В процессоре 486 применяется единый кэшL1. КэшL2 – общий, вP6+ он подключен к выделенной внутренней шине кэш-памяти. В процессорах 486 иPentiumкэшL2 является внешним и подключается к системной шине процессора. В некоторых процессорах (Celeron266 и 300) кэшL2 отсутствует. Длина строки кэша: 32 байт в Р5+ (в 486 – 16 байт). Строки процессор заполняет всегда целиком пакетными циклами чтения (4 передачи на строку) из основной памяти, выровненными по 32-байтным границам (16-байтным в 486). Любой внутренний запрос процессора на обращение к памяти направляется во внутренний кэш. Если затребованная область памяти присутствует в строке внутреннего кэша, то он обслужит этот запрос. В случае промаха запрос удовлетворяется сразу, как только затребованные данные считываются из ОЗУ, – заполнение строки до конца может происходить параллельно с обработкой полученных данных. Выделение и замещение строк у процессоров доP6 выполняется только для кэш-промахов при чтении, при промахах записи заполнение строк производится только вP6. Кэширование доступно в любом режиме процессора (вSMMдолжны применяться меры предосторожности, учитывающие переход в иное адресное пространство памяти).

Физическая память

Системная ш

Кэш L2

Кэш L3

ина (внешняя)

Блок шинных интерфейсов (BIU – Bus Interface Unit)

Таблицы TLBинструкций

Кэш инструкций L1 (L1I)

Таблицы TLBданных

Кэш данных L1 (L1D)

Буферы записи

(Store Buffer)

Выборка и декодирование инструкций

Другие внутренние блоки микропроцессора

Кэш трассировки

(TC – Trace Cache)

Рис. $.4. Обобщенная схема кэширования в микропроцессорахIntel. Серым цветом отмечены средства кэширования.

Буфер ассоциативной трансляцииTLBхранит адреса страниц, к которым обращались в последнее время. В процессоре 486 для данных и инструкций применяется единый буфер TLB, в процессорах более поздних моделей этот буфер разделен. ВP6+ большие страницы (2 Мбайт в режиме РАЕ и 4 Мбайт в режимеPSE) обслуживаются раздельными буферами TLB. Буферы TLB активны в защищенном режиме при разрешенной страничной трансляции. При запрещенной трансляции или в реальном режиме TLB сохраняет свое содержимое до явной или неявной его очистки.

Буферы записисвязаны с исполнительным блоком процессора. Они позволяют на некоторое время откладывать фактическую запись во внешний кэш и основную память, уступая шину для других обменов, необходимых для исполнения следующих инструкций. Запись буферизуется во всех режимах процессора. Буферизация записи в порты ввода/вывода не производится.

В процессорах также имеются так называемые WC-буферы(WriteCombiningBuffers). Такие буферы могут быть в кэшах всех уровней (L1,L2 иL3, а также в буфере записи) и предназначены для обслуживания памяти типаWC.

Все механизмы кэширования в основном прозрачны для прикладных программ, и после разрешения кэширования пропускают через себя потоки инструкций и данных без требования явного программного управления. Однако знание особенностей механизмов кэширования помогает в оптимизации кода. Так, например, можно определить оптимальные размеры одновременно обрабатываемых структур данных, при котором кэш не «буксует» (cachethrashing, см. выше). Процессоры разных моделей имеют различные характеристики отдельных элементов кэша, что показано в табл. $.2. Определить характеристики элементов кэша процессоров позволяет вызов инструкцииCPUID(2).

Таблица $.2.