
- •Глава 1. Принципы построения современных эвм.
- •Формы представления чисел
- •Арифметические операции над двоичными числами с фиксированной запятой
- •Арифметические операции над числами с плавающей запятой
- •Находим характеристику частного путем сложения с дополнением .
- •, При переходе к прямому коду, получим Теперь находим частное деления мантисс, используя схему деления без восстановления остатка. Коды мантиссы делителя
- •Таким образом, окончательный результат равен . Так же, как и впредудущих случаях проверим результат:
- •Логические основы построения эвм Элементы алгебры логики
- •Основные законы алгебры логики и формы логических функций
- •Синтез логических схем
- •Принципы построения современных эвм
- •Системы команд и методы адресации, применяемые в эвм
- •Постоянная память
- •Логическая организация оперативной памяти
- •Кэширование оперативной памяти
Кэширование оперативной памяти
В настоящее время оперативная память, используемая в вычислительных системах, реализуется на микросхемах динамической памяти, обладающих относительно низким быстродействием. С другой стороны, микросхемы статической памяти 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 Подробнее о конвейере команд процессора речь пойдет в следующей главе.