Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia1 (1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
6.64 Mб
Скачать

Кэширование оперативной памяти

В настоящее время оперативная память, используемая в вычисли­тельных системах, реализуется на микросхемах динамической памяти, об­ладающих относительно низким быстродействием. С другой стороны, микросхемы статической памяти SRAM по быстродействию приближа­ются к быстродействию процессоров и могут работать с ним практически синхронно, не внося в обмен существенных задержек. Однако статическая память стоит существенно дороже, обладает большим энергопотребле­нием и тепловыделением, имеет существенно большие габариты, чем ди­намическая. Поэтому реализация основной памяти как статической не оп­равдана ни экономически, ни технически. Разумным компромиссом для повышения скорости является включение в тракт обмена между процессо­ром и основной памятью дополнительного относительно небольшого, но быстродействующего накапливающего буфера. Это известный в технике прием, позволяющий согласовывать работу устройств с разным быстро­действием. В нашем случае, для рассматриваемых вычислительных сис­тем, этот буфер называется кэш-памятью (cache) и реализуется на основе статической памяти SRAM. Использование для обмена с памятью кэш-бу­фера называется кэшированием памяти.

С точки зрения выполнения программ этот кэш "прозрачен", так как не представляет собой адресуемую часть памяти и работает так, что при обменах с основной памятью, его присутствие можно обнаружить только на аппаратном уровне. Этот буфер хранит копию блоков информации из основной памяти, к которым с большой вероятностью будет в ближайшее время происходить обращение. Кэш не может хранить копию всей основ­ной памяти, поскольку его объем относительно невелик. Он хранит огра­ниченное количество блоков данных и список их текущего соответствия областям основной памяти. Кэшироваться может не вся память доступная процессору, а только ее часть, например у систем, построенных на основе CPU Pentium, кэшируется первые 64 Мб ОЗУ. Управляет работой кэш-па­мяти так называемый кэш-контроллер, входящий в тот или иной чипсет.

При каждом обращении к кэшируемой памяти кэш-контроллер с по­мощью каталога проверяет, находится ли действительная копия затребо­ванных данных в кэш-буфере. Если она там есть, то этот случай называ­ется кэш-попаданием (cache hit), и обращение за данными идет только к кэш-памяти. Если действительная копия данных отсутствует, то это слу­чай кэш-промаха (cache miss), и обращение за данными происходит к ос­новной памяти [4]. В соответствии с алгоритмом кэширования этот блок, считанный из основной памяти, заместит один из блоков кэш. Алгоритм кэширования определяет условия и порядок действий по замещению дан­ных в кэш на данные из памяти. От эффективности этого алгоритма зави­сит относительное количество кэш-попаданий и, следовательно, эффек­тивность использования кэш-памяти. Проверка присутствия нужных дан­ных в кэш, то есть поиск по кэш-каталогу также должна быть максимально быстрой. Существуют два подхода к замещению блоков в кэш-памяти. В первом обращение к основной памяти начинается одновременно с поис­ком в каталоге, и в случае кэш-попадания, прерывается. Архитектура кэш, поддерживающая этот поиск, называется одновременной (архитектура Look Aside). В этом случае кэш работает быстро, но, за счет постоянного обращения к основной памяти увеличивается энергопотребление. При вто­ром подходе обращение к основной памяти происходит только после обна­ружения кэш-промаха. Это, так называемая, архитектура сквозного поиска (Look Through). В этом случае теряется, по крайней мере, такт процессора, но снижается энергопотребление.

Очевидно, что эффективность работы кэш зависит от соотношения объемов основной и кэш-памяти. Чем больше относительный объем кэш- памяти, тем меньше промахов и больше быстродействие системы процес­сор-память. Однако в силу экономических, а так же и технических сооб­ражений размер кэш не может быть слишком большим.

Поэтому в современных компьютерных системах применяют двой­ную буферизацию, разделяя кэш на два уровня. Кэш первого уровня (L1 Cache) имеет небольшой объем, работает на внутренней тактовой частоте процессора и встраивается непосредственно в процессор. Первичный кэш, как правило, состоит из двух буферов, причем один применяется для кэ­ширования команд, а другой для кэширования данных6. Такое разделение повышает эффективность работы конвейера команд процессора7.

Кэш второго уровня (L2 Cache) размещается вне процессора и рабо­тает на внешней тактовой частоте процессора. Таким образом, при такой двойной буферизации, когда происходит промах для первичного кэш, по­иск продолжается во вторичном кэш, а не в медленной основной памяти. Если имеет место попадание во вторичный кэш, то из него считываются информация в процессор, а затем происходит замещение строки первич­ного кэш информацией из вторичного. В случае промаха информация счи­тывается из памяти, а затем ей замещается, соответствующие строки пер­вичного и вторичного кэш. При такой архитектуре возможно упреждаю­щее чтение блока информации, которая вероятно скоро может понадо­биться процессору, во вторичный кэш. При этом такое упреждающее чте­ние не затрагивает операций процессора при обработке первичного кэш и может выполняться параллельно с ними. Следует отметить, что в совре­менных процессорах Intel, начиная с Pentium Pro, вторичный кэш разме­щается в одном корпусе с процессором и работает уже на внутренней час­тоте процессора. Кроме того, в персональных компьютерах на базе про­цессора K6-3, а так же в современных системах создаваемых на основе процессоров Itanium, на материнских платах располагается дополнитель­ный кэш третьего уровня (L3 Cache).

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

Контроллер кэш обеспечивает обмен, как с памятью, так и с процес­сором только пакетом, то есть строкой фиксированной, для данной архи­тектуры кэш, длины. Строка предназначена для хранения копии блока ос­новной памяти, размер которого совпадает с длиной строки кэш. В кэш-каталоге хранится информация об адресе скопированного из основной па­мяти блока, а также флаги состояния строки. Строка может быть действи­тельной (valid), то есть она в данный момент времени достоверно отобра­жает соответствующий ей блок основной памяти, или недействительной (invalid)— в этом случае она не отображает никакого блока и может быть использована для копирования. Информация о том, какой именно блок основной памяти соответствует действительной строке, а также флаги ее состояния называется тэгом (tag). Эта информация хранится в специаль­ной памяти тэгов (tag RAM), называемой также кэш-каталогом [4].

Как правило, в операциях обмена с основной памятью участвует вся строка целиком, в этом случае кэш называется несекторируемым. Для луч­шего согласования с механизмами доступа к основной памяти длина стро­ки кэш совпадает с объемом, передаваемых за один пакетный цикл, дан­ных. Для процессора Pentium эта величина равна 32 байтам.

Возможен вариант секторированной (sectored) организации кэш-па­мяти В этом случае одна строка содержит несколько смежных ячеек— сек­торов, размер которых соответствует размеру минимального пакета обме­на. При этом в кэш-каталоге для каждой строки должны хранится флаги действительности для всех секторов данной строки. Секторирование поз­воляет экономить память, необходимую для хранения каталога при увели­чении объема кэш, так как под тэг отводится несколько большее количес­тво бит и, выгоднее использовать дополнительные биты действительнос­ти, чем увеличивать количество элементов каталога.

Обычно строки кэш выделяются для отображения только при опера­циях чтения из основной памяти. Запись блока, не имеющего копии в кэш-памяти, всегда производится в основную память. Поведение кэш-контрол­лера при реализации операций в основную память, когда копия блока па­мяти находится в какой либо строке кэш, называется политикой записи. Различают сквозную (WT— write through) и обратную (WB— write back) политики записи [4].

Алгоритм сквозной записи WT выполняет каждую операцию записи, попадающей в кэшированный блок одновременно и в строку кэш, и в ос­новную память. В этом алгоритме в каждой операции записи процессору приходится ждать момента окончания записи в медленную основную па­мять. Алгоритм прост в реализации и легко позволяет достичь целостнос­ти данных, поскольку копии данных в кэш и блоке в основной памяти всегда совпадают. В этом случае отпадает необходимость хране­ния флагов действительности, так как любая строка всегда полностью соответствует отображаемому блоку памяти, который однозначно идентифицируется значением тэга в кэш-каталоге. Однако за эту простоту приходится рас­плачиваться низкой эффективностью кэш при операциях записи. Есть варианты реализации этого алгоритма с применением отложенной буфе­ризованной записи, при которой данные записываются в память через буфер FIFO во время свободных тактов шины.

Алгоритм обратной записи WB позволяет уменьшить количество операций записи на шине основной памяти. В случае если блок памяти, в который должна производится запись, имеет отображение в кэш, то запись будет произведена только в эту строку кэш, и она будет помечена в кэш- каталоге как "грязная", то есть требующая выгрузки ее в основную память. В этом случае кроме флага действительности строки, кэш-каталог содер­жит также и флаг модификации, показывающий происходит или нет в данный момент выгрузка строки в основную память. После того как про­изойдет выгрузка всей строки в основную память, эта строка станет "чис­той" и флаг модификации сбросится, фиксируя тот факт, что ее уже можно использовать для кэширования других блоков памяти без потерь целост­ности данных. В основную память данные переписываются только целой строкой непосредственно перед её замещением в кэш или после заполне­ния всех её секторов в случае секторированного кэш. Данный алгоритм существенно эффективнее алгоритма сквозной записи, но более сложен в реализации.

Существуют три возможных архитектуры реализации кэш-памяти, отличающиеся по способу установления взаимного соответствия между строками кэш и блоками в основной памяти. Они называются: кэш прямо­го отображения (direct-mapped cache), наборно-ассоциативный кэш (set-associative cache) и полностью ассоциативный кэш (fully associative cache) [4].

Рассмотрим архитектуру кэш прямого отображения, изображенного на рис. 2.4.1. В этой архитектуре адрес памяти, по которому происходит обращение, однозначно определяет строку кэш, в которой будет находит­ься отображение требуемого блока. При этом кэшируемая основная па­мять условно разбивается на страницы, размер которых совпадает с раз­мером кэш-памяти. Каждая страница основной памяти также условно раз­бивается на строки, размер которых совпадает с размером строки кэш. В рамках данной архитектуры каждая строка кэш-памяти может отображать только соответствующую ей строку из любой страницы основной памяти. Поскольку объем основной памяти существенно больше объёма кэш, то на каждую строку кэш может претендовать множество соответствующих ей

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

строк основной памяти, находящихся на разных страницах. Одна строка кэш в определенный момент времени может содержать копию только од­ной соответствующей ей строки из множества страниц основной памяти. Номер строки в кэш памяти называется индексом строки. Номер страницы в основной памяти называется тэгом. Информация о том, какому именно тэгу (номеру страницы) соответствует в данный момент строка кэш, хра­нится в связанной с данной строкой ячейке специальной памяти тэгов (tag RAM). Таким образом, по адресу ячейки в основной памяти, можно определить тэг и индекс (рис. 2.4.1). Младшие биты этого адреса опреде­ляют смещение байта в условной строке основной памяти. Средние биты представляют собой индекс, а старшие— ее тэг. Память тэгов обязательно должна иметь количество ячеек, равное количеству строк кэш, а ее разряд­ность должна быть достаточной, для хранения значений тэгов, а также флагов действительности и модификации.

Поясним сказанное на примере кэш прямого отображения. Пусть имеем кэш, объемом 256 Кб с размером строки 32 байта, а объем кэши­руемой памяти составляет 64 Мб. Тогда такой кэш содержит 256К/ 32 = =8K строк. При этом основная память условно будет разбита на 256 стра­ниц, содержащих по 8К строк каждая. Тогда, для этого примера, смещение байта в строке задается разрядами адреса , индекс— разрядами , а значение тэга содержится в разрядах . Объем памяти тэгов составляет 8К десятиразрядных ячеек. На рис. 2.4.1 показана стру­тура памяти, соответствующая данному примеру.

Информация о тэгах хранится в так называемом кэш-каталоге, вхо­дящим в котроллер кэш. В этом же каталоге хранятся бит признака дейст­вительности V и бит признака модифицированности данных M. В начале обращения к памяти за данными контроллер сначала считывает ячейку каталога с заданным индексом и сравнивает значение тэга в этой ячейке со старшими битами адреса памяти и анализирует признак действительности. Если в результате анализа окажется, что требуемый блок не находится в кэш (кэш-промах), то контроллер генерирует обращение к основной па­мяти. В случае кэш-попадания запрос обслуживается кэш памятью. В случае промаха, после считывания из основной памяти новые данные по­мещаются в соответствующую строку кэш, если она "чистая". Тэг этой строки записывается в кэш-каталог и устанавливается признак действи­тельности данных. Напомним, что независимо от объема затребованных данных, в кэш-память переписывается вся строка целиком, а признак дей­ствительности относится ко всей строке. Если контроллер кэш реализует упреждающее чтение, то в последующие свободные циклы шины, обно­вится и следующая за ней строка, при условии, что она также является "чистой". Такая организация обмена, позволяет осуществить пакетный цикл чтения из кэш через границу строки. Изменение данных в оператив­ной памяти может производиться контроллером в соответствии с алгорит­мами либо сквозной, либо обратной записи.

Кэш прямого отображения достаточно прост в реализации, но ему присущ серьезный недостаток. Пусть в ходе выполнения программы про­цессору требуются данные, находящиеся в памяти смещенные друг отно­сительно друга на величину, кратную размеру страницы, то есть строки, находящиеся на разных страницах, но имеющие один и тот же индекс. В этом случае очередное обращение будет замещать строки, считанные в предыдущем и требующиеся в следующем обращении. При этом кэш все время будет работать в режиме кэш-промаха, его работа будет интенсивна, но бесполезна (cache trashing). С этим недостатком борются, увеличивая размер кэш прямого отображения, но это дает незначительный эффект в многозадачных системах, поскольку разные задачи могут претендовать на одни и те же строки кэш. Архитектура прямого отображения применяется, как правило, для кэш второго уровня.

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

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

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

банка тэгов (рис. 2.4.2), а кэш-каталог должен состоять из двух частей. Первая часть каталога связана с первым банком тэгов, а вторая— со вто­рым банком. Кроме того в кэш-каталоге дополнительно должен быть при­знак, определяющий, какая строка из набора подлежит замещению. Номер набора (индекс), на который может отображаться затребованная строка оперативной памяти, определяется средней частью адреса. Старшая часть адреса (тэг) записывается в ячейку одного из двух банков тэгов этого на­бора. Строка набора, отображающая требуемый блок, определяется срав­нением тэгов, выполняемым параллельно для всех каналов кэш. В случае кэш-промаха обычно замещается та строка из набора, последнее обраще­ние к которой было раньше. Этот алгоритм замещения наиболее старой строки из набора называется LRU (Last Recently Used) и реализуется с по­мощью соответствующего признака. Этот признак требует одного бита в случае набора из двух строк и нескольких бит, если количество строк в наборе больше двух. При относительно большом количестве строк в на­боре возможно применение алгоритма замещения типа FIFO или даже случайного выбора. Наборно-ассоциативная архитектура применяется как для первичного, так и вторичного кэш.

Полностью ассоциативный кэш отображает любую строку кэш-па­мяти на любую строку оперативной памяти [4]. Эта архитектура сущест­венно повышает эффективность кэширования при ограниченных объемах кэш-памяти. При этом все биты адреса кэшированного блока, кроме битов, определяющих смещение данных в строке, хранятся в памяти тэгов. Для определения наличия затребованных данных в кэш-памяти здесь требуется сравнение со старшей частью адреса тэгов всех строк, а не одной или не­скольких, как при прямом отображении или наборно-ассоциативной архи­тектуре. Для того чтобы это сравнение производилось быстро, необходим параллельный анализ всех ячеек, что является весьма затратной аппарат­ной задачей. Эта задача решена пока только для небольших объемов пер­вичного кэш некоторых процессоров. Применение полностью ассоциатив­ной архитектуры для достаточно большого вторичного кэш пока не оправ­дано из-за сложности и дороговизны ее реализации.

1 Здесь и в последующем тексте в качестве разделителя целой и дробной части числа используется точка

2 Далее для отделения знака числа используется символ *

1 Далее суммирование по mod 2 при котором единица переноса теряется будем обозначать символом .

2 Рассматриваемые ниже функции представляют собой полный набор логических функций двух аргументов. Часто некоторые из этих функций рассматривают как отдельную систему, дополняя ее логическим отрицанием.

3 Здесь в последующих примерах для упрощения чтения формул знак логического умножения будем опускать.

4 В рассматриваемом параграфе используются материалы с сайта www.thoz.kubsu.ru

5 Подробнее об адресной и операционной части команды см. на стр. 14

6 Такая структура кэш-памяти называется Гарвардской, в отличие от Принстонской, где кэш данных и команд единый.

7 Подробнее о конвейере команд процессора речь пойдет в следующей главе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]