Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова

.pdf
Скачиваний:
43
Добавлен:
31.05.2015
Размер:
4.4 Mб
Скачать

Mcached = Vcache * 2N.

В нашем примере:

Mcached = 256 Кбайт * 28 = 64 М байт.

Иногда в описании кэша прямого отображения фигурирует понятие на-

бор (set), что может сбить с толку. Оно применяется вместо термина строка

(line) в секторированном кэше прямого отображения, а сектор тогда назы-

вают строкой. С набором (как и строкой несекторированного кэша) связана информация о теге, относящаяся ко всем элементам набора (строкам и секто-

рам). Кроме того, каждый элемент набора (строка или сектор) имеет собст-

венный бит действительности в кэш-каталоге (рис. 92).

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

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

231

Наборно-ассоциативная архитектура кэша позволяет каждому блоку кэ-

шируемой памяти претендовать на одну из нескольких строк кэша, объеди-

ненных в набор (set). Можно считать, что в этой архитектуре есть несколько параллельно и согласованно работающих каналов прямого отображения, где контроллеру кэша приходится принимать решение о том, в какую из строк набора помещать очередной блок данных.

В простейшем случае каждый блок памяти может помещаться в одну из двух строк (Two Way Set-Associative Cache – 2-канальный наборно-

ассоциативный кэш). Такой кэш должен содержать два банка памяти тегов

(рис. 93).

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

мый блок, определяется сравнением тегов (как и в ассоциативном кэше), па-

раллельно выполняемым для всех каналов кэша.

Рис. 93. Двухканальный наборно-ассоциативный кэш (коэффициент ас-

социативности: А = 2)

232

Кроме того, с каждым набором должен быть связан признак, опреде-

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

которой дольше всего не обращались (алгоритм LRU – Least Recently Used).

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

Полностью ассоциативный кэш используется редко и только на уровне

L1. Более приемлемым техническим решением оказывается сочетание пря-

мого отображения и ассоциативного поиска. Так организован наборно-

ассоциативный кэш, 2-канальный вариант которого показан на рис. 94.

Как видно, этот кэш, по сути, представляет собой сдвоенный кэш прямо-

го отображения. Каждый банк кэш-памяти в паре со связанным с ним одним блоком теговой памяти работает по схеме кэша прямого отображения. Одна-

ко наличие двух банков позволяет размещать в 2-канальной наборно-

ассоциативной кэш-памяти сразу две строки, расположенные одинаково по отношению к границам двух различных страниц кэшируемой памяти. На-

пример, на рис. 94 в строках банков кэш-памяти, имеющих индекс 1, разме-

щены строки с этим же индексом из 17-й и 255-й страниц кэшируемой памя-

ти.

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

Собственно, в этом и заключается все, что можно отнести к термину «ассо-

циативный» в названии этого типа памяти. Однако это различие оказывается

233

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

ной информации и производительность памяти в целом.

Еще один блок – «флаги обращения», который отсутствовал в кэш-

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

ся удалять при необходимости ввода в кэш новой строки и отсутствии в нем свободного места.

Рис. 94. Двухканальный наборно-ассоциативный кэш

Временное несоответствие информации в кэш-памяти и в оперативной памяти может возникнуть только при использовании политики обратной за-

писи. За поддержанием целостности информации в этом случае следит кон-

троллер.

13.7.3. Полностью ассоциативный кэш

Пусть адрес байта оперативной памяти состоит из 32 бит (4 байт). Соста-

вим кэш из строк: пусть каждая строка содержит (хранит) адрес и байт, кото-

234

рый соответствует этому адресу в оперативной памяти. Напомним, что хра-

нимый адрес принято называть тегом (tag), чтобы не путать его с адресом (но-

мером) строки́кэ ша. Такой кэш называется полностью ассоциативным,

так как любой байт оперативной памяти может оказаться в любой строке кэ-

ша. Пусть, кроме того, каждая строка кэша снабжена устройством, которое сравнивает тег, хранящийся в строке, с адресом памяти, к которому обраща-

ется процессор, и, в случае совпадения, выдает соответствующий байт дан-

ных (рис. 95). Про такую память говорят, что она адресуется данными.

Рис. 95. Пример поиска элемента в кэше по его адресу

Примечание: данные приведены в шестнадцатеричном виде

Когда процессор хочет прочесть данные по какому-либо адресу опера-

тивной памяти, он передает этот адрес в контроллер кэш-памяти. Кэш осу-

ществляет одновременное сравнение всех имеющихся у него тегов с передан-

ным адресом. Если адрес найден, то кэш выдает требуемый байт дан-

235

ных (рис. 95). Если же данные не найдены (промах кэша), то производится обращение к оперативной памяти.

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

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

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

щем, он вынужден использовать какое-то правило, которое бы хорошо «уга-

дывало» нужный элемент. Например, можно выбрасывать случайную строку из кэша. Но на практике чаще всего выбрасывается тот элемент, который дольше всех не использовался. Мотивация такая: «если строка долго не ис-

пользовалась, то она, скорее всего, еще не скоро понадобится вновь».

Но как определить, какая строка дольше всех не использовалась? Пусть,

например, в кэше имеются 65 536 строк. Тогда в каждую строку кэша можно добавить 2-байтовое це лое чис ло, которое бу дет обо значать «возраст» этой строки́. Строка, к которой обращались наиболее давно, имеет возраст, рав-

ный 65 535. Строка, к которой было произведено обращение в последнюю очередь, имеет возраст 0 (рис. 96).

Рис. 96. Дополнительные байты для хранения возраста строки

Пусть произошло попадание в кэш, и соответствующая строка имела возраст N. Присвоим ей возраст 0, а возрасты всех остальных строк, которые были меньше N, увеличим на единицу. Нетрудно видеть, что после такой операции все элементы кэша вновь имеют правильный возраст, соответ-

236

ствующий порядку их использования. Чтобы ускорить эту процедуру, нужно снабдить все стро́ки кэ ша устройствами, одновременно добавляющими еди-

ницу к возрасту своих строк. В случае промаха кэша из него выбрасывается элемент с максимальным (65 535) возрастом, все возрасты увеличиваются на единицу, а новый элемент получает возраст 0.

Теперь рассмотрим процесс записи. Пусть процессор хочет записать данные в память. Скорее всего, эти данные вскоре понадобятся вновь, поэто-

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

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

стый сценарий работы с конкретным элементом памяти – «запись, чтение, за-

пись, чтение, ...». Здравый смысл подсказывает, что запись в оперативную па-

мять нужно произвести лишь в самом конце подобной цепочки. А когда у це-

почки операций со строкой кэша наступает конец? Тогда, когда эта строка выбрасывается из кэша.

Таким образом, когда строка выбрасывается из кэша, она должна быть записана в оперативную память. Но что, если она не была изменена? Тогда ее не нужно записывать. Для того чтобы отслеживать изменения строк кэша,

снабдим каждую строку дополнительным битом (рис. 97), который будет ус-

танавливаться в единицу при мо дификации дан ных в строке. Тогда при вы -

теснении строки́нуж но будет проверить этот бит, и, если он равен единице,

произвести запись в оперативную память.

Рис. 97. Бит модификации строки

237

Итак, процессор записывает данные в память. Если эти данные есть в кэ-

ше, то они перезаписываются и помечаются как измененные. Если данных в кэше нет, то самая старая строка вытесняется, и на ее место записываются новые данные, опять же помеченные как измененные. Недостаток такого подхода в том, что при промахе кэша теперь часто будут происходить две операции: запись данных старой строки́из кэ ша в оперативную память и за-

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

ративную память, обнуляя соответствующие биты модификации.

Нам осталось решить две проблемы:

1. Наш кэш хорошо справляется с временно́й локальностью обра-

щения к данным, но он совершенно не адаптирован к пространствен-

ной локальности. Как быть, если процессор обращается к одному байту оперативной памяти, затем к соседнему, и т. д.?

2. Разработанный кэш будет иметь очень высокие накладные рас-

ходы при аппаратной реализации. Действительно, каждая строка кэша,

помимо единственного байта данных, содержит: 4 байт адреса, устрой-

ство сравнения адресов, 2 байт для хра нения возраста строки́, устрой-

ство для на ращивания воз раста и бит , обозначающий мо дификацию строки́.

Для решения этих проблем будем хранить в каждой строке кэша не один байт данных, а несколько байтов, идущих подряд в оперативной памяти. Те-

гом строки́будем считать адрес первого содержащегося в ней байта. Рассмот-

рим пример, когда в строке кэша хранятся 16 байт. Для того чтобы данные в строках не могли «перекрываться» (перекрытие данных значительно услож-

нит логику работы), потребуем, чтобы теги всех строк были кратны 16. Тогда

4 последних бита тега будут равны нулю, и их не нужно хранить. Мы видим,

238

что отношение «полезного» объема кэша к общему значительно улучши-

лось (рис. 98).

Рис. 98. Каждая строка кэша имеет несколько байтов данных

Чтобы скорость работы кэша не снизилась из-за того, что при каждом промахе требуется загружать из памяти сразу 16 байт, снабдим оперативную память «широкой» шиной данных, которая будет передавать в кэш все

16 байт одновременно.

При поиске данных в таком кэше по адресу следует взять старшие 28

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

са. Если строка не найдена, то требуется обращение к оперативной памяти.

Теперь, если процессор будет запрашивать байты из памяти подряд, то лишь каждое 16-е обращение к памяти будет приводить к промаху кэша. Ко-

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

16 байт, если произошло обращение к последнему байту строки́.

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

Структура средств кэширования 32-разрядных процессоров Intel приве-

дена на рис. 99. Первичный кэш инструкций тесно связан с блоком предвари-

тельной выборки, первичный кэш данных – с использованным блоком про-

239

цессора. Вторичный кэш – является общим и подключен к выделенной внут-

ренней шине кэш-памяти.

Рис. 99. Кэширование в процессорах Intel

Буфер ассоциативной трансляции (англ. Translation lookaside buffer, TLB)

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

ти. TLB используется всеми современными процессорами с поддержкой страничной организации памяти. Он содержит фиксированный набор запи-

сей (от 8 до 4 096) и является контентно-адресуемой памятью. Каждая запись содержит соответствие адреса страницы виртуальной памяти адресу физиче-

ской памяти. Если адрес отсутствует в TLB, процессор обходит таблицы страниц и сохраняет полученный адрес в TLB, что занимает в 10–60 раз больше времени, чем получение адреса из записи, уже закэшированной TLB.

Вероятность промаха TLB невысока и составляет в среднем от 0,01–1

%.

TLB хранит вхождения в каталог и таблицы страниц, к которым обра-

щались в последнее время. Большие страницы обслуживаются раздельными буферами TLB. Буферы TLB активны в защищенном режиме при разрешен-

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

240