10 - Кэш - промах (1086675), страница 2
Текст из файла (страница 2)
. . .
. . .
. . .
. . .
Теги действительности
Канал 1
Канал 4
Диспетчер
Рис 1. Структура первичного кэша процессора 486
В случае промаха (Cache Miss) запрос на запись направляется только на внешнюю шину, а запрос на чтение обслуживается сложнее. Если этот зарос относится к кэшируемой области памяти, выполняется цикл заполнения целой строки кэша – все 16 байт (32 для Pentium) читаются из оперативной памяти и помещаются в одну из строк кэша, обслуживающего данный адрес. Если затребованные данные не укладываются в одной строке, заполняется и соседняя. Заполнение строки процессор старается выполнить самым быстрым способом – пакетным циклом с 32-битными передачами (64-битными для Pentium и старше).
Внутренний запрос процессора на данные удовлетворяется сразу, как только затребованные данные считываются из ОЗУ – заполнение строки до конца может происходить параллельно с обработкой полученных данных. Если в наборе, который обслуживает данный адрес памяти, имеется свободная строка (с нулевым битом достоверности), заполнена будет она и для нее установится бит достоверности. Если свободных строк в наборе нет, будет замещена строка, к которой дольше всех не было обращений. Выбор строки для замещения выполняется на основе анализа бит LRU (Least Recently Used) по алгоритму “псевдо-LRU”. Эти биты (по три на каждый из наборов) модифицируются при каждом обращении к строке данного набора (кэш-попадании или замещении).
Таким образом, выделение и замещение строк выполнятся только кэш-промахов чтения, при промахах записи заполнение строк не производится. Если затребованная область памяти присутствует в строке внутреннего кэша, то он обслужит этот запрос. Управлять кэшированием можно только на этапе заполнения строк; кроме того, существует возможность их аннулирования – объявления недостоверными и очистка всей кэш-памяти.
Очистка внутренней кэш-памяти при сквозной записи (обнуление бит достоверности всех строк) осуществляется внешним сигналом FLUSH# за один такт системной шины (и, конечно же, по сигналу RESET). Кроме того, имеются инструкции аннулирования INVD и WBINVD. Инструкция INVD аннулирует строки внутреннего кэша без выгрузки модифицированных строк, поэтому ее неосторожное использование при включенной политике обратной записи может привести к нарушению целостности данных в иерархической памяти. Инструкция WBINVD предварительно выгружает модифицированные строки в основную память (при сквозной записи ее действие совпадает с INVD). При обратной записи очистка кэша подразумевает и выгрузку всех модифицированных строк в основную память. Для этого, естественно, может потребоваться и значительное число тактов системной шины, необходимых для проведения всех операций записи.
Аннулирование строк выполняется внешними схемами – оно необходимо в системах, у которых в оперативную память запись может производить не только один процессор, а и другие контроллеры шины – процессор или периферийные контроллеры. В этом случае требуются специальные средства для поддержания согласованности данных во всех ступенях памяти – в первичной и вторичной кэш-памяти и динамического ОЗУ. Если внешний (по отношению к рассматриваемому процессору) контроллер выполняет запись в память, процессору должен быть подан сигнал AHOLD. По этому сигналу процессор немедленно отдает управление шиной адреса A[31:4], на которой внешним контроллером устанавливается адрес памяти, сопровождаемый стробом EADS#. Если адресованная память присутствует в первичном кэше, процессор аннулирует строку – сбрасывает бит достоверности этой строки (она освобождается). Аннулирование строки процессор выполняет в любом состоянии.
Управление заполнением кэша возможно и на аппаратном и на программном уровнях. Процессор позволяет кэшировать любую область физической памяти. Внешние схемы могут запрещать процессору кэшировать определенные области памяти установкой высокого уровня сигнала KEN# во время циклов доступа к этим областям памяти. Этот сигнал управляет только возможностью заполнения строк кэша из адресованной области памяти. Программно можно управлять кэшируемостью каждой страницы памяти – запрещать единичным значением бита PCD (Page Cache Disable) в таблице или каталоге страниц. Для процессоров с WB-кэшем бит PWT (Page Write Through) позволяет постранично управлять и алгоритмом записи. Общее программное управление кэшированием осуществляется посредством бит управляющего регистра CR0:CD (Cache Disable) и NW (No Write Through). Возможны следующие сочетания бит регистра:
-
CD=1, NW=1 – если после установки такого значения выполнить очистку кэша, кэш будет полностью отключен. Если же перед установкой этого сочетания бит кэша был заполнен, а очистка не производилась, кэш превращается в “замороженную” область статической памяти;
-
CD=1, CW=0 – заполнение кэша запрещено, но сквозная запись разрешена. Эффект аналогичен временному переводу сигнала KEN# в высокое (пассивное) состояние. Этот режим может использоваться для временного отключения кэша, после которого возможно его включение без очистки;
-
CD=0, NW=1 – запрещенная комбинация (вызывает отказ общей защиты);
-
CD=0, NW=0 – нормальный режим работы со сквозной записью.
Для полного запрета кэша необходимо установить CD=1 и NW=1, после чего выполнить очистку (Flush). Без очистки кэш будет обслуживать запросы в случае попаданий.
Процессоры 486 и старше имеют выходные сигналы PCD и PWT, управляющие работой вторичного (внешнего) кэша (они же управляют и внутренним кэшем). В циклах обращения к памяти, когда страничные преобразования не используются (например, при обращении к таблице каталогов страниц), источником сигналов являются биты PCD и PWT регистра CR3, при обращении к каталогу страниц – биты PCD и PWT из дескриптора соответствующего вхождения каталога, при обращении к самим данным – биты PCD и PWT из дескриптора страницы. Кроме того, оба этих сигнала могут принудительно устанавливаться общими битами управления кэшированием CD и NW регистра CRO.
Режим обратной записи может разрешаться только аппаратно сигналом WB/WT#, вырабатываемым внешними схемами.
В пространстве памяти РС имеются области, для которых кэширование принципиально недопустимо (например, разделяемая память адаптеров) или непригодна политика обратной записи. Кроме того, кэширование иногда полезно отключать при выполнении однократно исполняемых участков программы (например, инициализации) с тем, чтобы из кэша не вытиснялись более часто используемые фрагменты. Напомним, что запретить можно только заполнение строк, а обращение к памяти, уже представленной действительными строками кэша, все равно будет обслуживаться из кэша. Для полного запрета работы кэша строки должны быть аннулированы.
Программно при включенном режиме страничного преобразования кэшированием управляют биты атрибутов страниц (на уровне таблицы страниц и их каталога), биты PCD и PWT регистра CR3, и, наконец, глобально кэшированием управляют биты CD и NW регистра CR0.
Аппаратно (сигналом KEN#) внешние схемы могут управлять кэшированием (разрешать заполнение строк) для каждого конкретного адреса обращения к физической памяти.
Смешанная и разделенная кэш-память.
Внутренняя кэш-память использовалась ранее как для инструкций(команд), так и для данных. Такая память называлась смешанной, а ее архитектура – Принстонской, в которой в единой кэш-памяти, в соответствии с классическими принципами фон Неймана, хранились и команды и данные.
Сравнительно недавно стало обычным разделять кэш-память на две – отдельно для инструкций и отдельно для данных.
Преимуществом смешанной кэш-памяти является то, что при заданном объеме, ей свойственна более высокая вероятность попаданий, по сравнению с разделенной, поскольку в ней автоматически устанавливается оптимальный баланс между инструкциями и данными. Если в выполняемом фрагменте программы обращения к памяти связаны, в основном, с выборкой инструкций, а доля обращений к данным относительно мала, кэш-память имеет тенденцию заполнения инструкциями и наоборот.
С другой стороны, при раздельной кэш-памяти, выборка инструкций и данных может производиться одновременно, при этом исключаются возможные конфликты. Последнее особенно существенно в системах, использующих конвейеризацию команд, где процессор извлекает команды с опережением и заполняет ими буфер или конвейер.
Так,например, в процессоре Intel® 486 DX2 применялась смешанная кэш-память,
В Intel® Pentium® и в AMD Athlon™ с их суперскалярной организацией – раздельная. Более того, в этих процессорах помимо кэш-памяти инструкций и кэш-памяти данных используется также и адресная кэш-память. Этот вид кэша используется в устройствах управления памятью, в том числе для преобразования виртуальных адресов в физические.
Благодаря использованию нанотехнологий, для снижения потребляемой мощности, увеличения быстродействия ЭВМ( что достигается сокращением времени обмена данными между процессором и кэш-памятью) существует возможность, а более того имеются реальные примеры того, что кэш-память реализуют в одном кристале с процессором. Такая внутренняя кэш-память реализуется по технологии статического ОЗУ и является наиболее быстродействующей. Объем ее обычно составляет 64-128 Кбайт, причем дальнейшее увеличение ее объема приводит обычно к снижению быстродействия из-за усложнения схем управления и дешифрации адреса.
Альтернативой, широко применяемой в настоящее время, является вторая (внешняя) кэш-память большего объема, расположенная между внутренней кэш-памятью и ОП. В этой двухуровневой системе кэш-памяти, внутренней памяти отводится роль первого уровня L1, а внешней - второго L2. емкость L2 обычно на порядок и более выше, чем L1, а быстродействие и стоимость ниже. Память второго уровня также строится обычно как статическое ОЗУ. Емкость ее может составлять от 256 Кбайт до 1 Мбайта и технически реализуется как в виде отдельной микросхемы, однако может размещаться и на одном кристалле с процессором.
Самые современные процессоры от крупнейших производителей оснащаются сегодня кэш-памятью емкостью у Intel Pentium 4 на ядре Northwood - 512 Кбайт кэш-памяти L2, а процессоры Prescott будут выпускаться по 0,09-микронной технологии и получат кэш-память второго уровня удвоенного объема, который составит 1 Мбайт. Intel продолжает широко рекламировать свой "экстремальный" игровой процессор Pentium 4 Extreme Edition на основе модифицированного серверного ядра Gallatin с тактовой частотой 3,40 ГГц и кэш-памятью третьего уровня объемом 2 Мбайта. Она дополняет стандартный нортвудовский кэш L2 512 Кбайт и тоже работает на частоте ядра процессора (правда, с большей раза в два латентностью). Таким образом, в сумме новый Pentium 4 Extreme Edition имеет кэш-память объемом 2,5 Мбайт.
Дополнительная кэш-память третьего уровня ведет начало от серверных процессоров Xeon MP на 0,13-микронном ядре Gallatin и не имеет ничего общего с грядущим 90-нанометровым Prescott, однако этот кристалл (ядро) все же немного переработали с целью поддержки системной шины 800 МГц, уменьшения энергопотребления и др. и упаковали в стандартный корпус от текущих Pentium 4. В свою очередь AMD Athlon 64 и AMD Opteron работающие на более высокой частоте 2200 МГц, производятся по 0,13-микронной технологии (SOI) и содержат 105,9 млн. транзисторов и отличаются от предшествующих Athlon XP новым ядром с 64-битными возможностями вычислений (наряду с улучшенными 32-битными на базе прежнего ядра Athlon XP), кэш-памятью второго уровня объемом 1 Мбайт (причем кэш у Атлонов инклюзивный, то есть полный объем с учетом 128 Кбайт L1 составляет 1152 Кбайт).
При доступе к памяти, ЦП сначала обращается к кэш-памяти первого уровня. При промахе производится обращение к кэш-памяти второго уровня. Если информация отсутствует и в L2, производится обращение к ОП, и соответствующий блок заносится сначала в L2, а затем и в L1. Благодаря такой процедуре, часто запрашиваемая информация может быть легко восстановлена из кэш-памяти второго уровня.
Потенциальная экономия за счет применения L2 зависит от вероятности попаданий как в L1, так и L2. Однако, опыт Intel и AMD показывает, что использование кэш-памяти второго уровня существенно улучшает производительность. Именно поэтому во всех проанонсированых производителями новейших версиях процессоров применяется двухуровневая и даже трехуровневая организация кэш-памяти.
Статическая и динамическая память
В каждом современном ЦП предусмотрено некоторое количество статической памяти, работающей на частоте ядра. Именно статической, поскольку использование динамической памяти в этих целях представляется крайне нерациональным.
Одна ячейка статической памяти состоит из шести транзисторов и двух резисторов (для техпроцессов с проектными нормами до 0,5 мкм могли быть использованы только четыре транзистора на одну ячейку, с дополнительным слоем поликремния и с более жесткими ограничениями по максимальной тактовой частоте), в то время как аналогичная структура динамической памяти состоит из одного транзистора и одного конденсатора.
Быстродействие статической памяти намного выше (емкость, используемая в динамической памяти, имеет определенную скорость зарядки до требуемого уровня, определяющую "частотный потолок"), но из-за большего количества составляющих элементов она существенно дороже в производстве и отличается более высоким энергопотреблением. Битовое значение ячейки статической памяти характеризуется состоянием затворов транзисторов, а динамической - уровнем заряда конденсатора. Так как конденсаторы имеют свойство с течением времени разряжаться, то для поддержания их состояния требуется регулярная перезарядка (для современных микросхем динамической памяти - приблизительно 15 раз в секунду). Кроме того, при операции чтения из ячейки динамической памяти конденсатор разряжается, т. е. ячейка утрачивает свой первоначальный заряд, а следовательно должна быть перезаряжена.