- •8. Система памяти
- •8.1. Базовые концепции
- •8.2. Быстродействие, объем и стоимость
- •8.3.1. Функция отображения
- •8.3.2. Алгоритмы замещения
- •8.3.3. Примеры технологий отображения
- •8.3.4. Организация Кэша в коммерческих процессорах
- •8.4. Производительность
- •8.4.1. Чередование операций
- •8.4.2. Частота попаданий и накладные расходы при промахах
- •8.4.3. Кэши на микросхеме процессора
- •8.4.4. Другие способы увеличения быстродействия
- •8.5. Виртуальная память
- •8.5.1. Преобразование адресов
- •8.6. Требования к управлению памятью
8.4.2. Частота попаданий и накладные расходы при промахах
Отличным показателем эффективности конкретной реализации иерархии памяти является частота попаданий при доступе к информации на разных уровнях иерархии. Напомним, что попаданием называется успешное обращение к данным в кэше. Отношение количества попаданий к общему количеству попыток доступа называется частотой попаданий, а отношение количества промахов к общему количеству попыток доступа — частотой промахов.
В идеале вся иерархия памяти должна представляться процессору единым запоминающим устройством, время доступа к которому равно времени доступа к кэш-памяти на микросхеме процессора, а размер равен размеру магнитного диска. Степень приближения к этому идеалу зависит от частоты попаданий на разных уровнях иерархии памяти. В случае высокопроизводительных компьютеров частота попаданий должна превышать 0,9.
Производительность системы очень зависит от того, какие действия выполняются в случае промаха. Дополнительное время, уходящее на копирование необходимой информации в кэш, называется накладными расходами при промахах. Эти накладные расходы выливаются в простой процессора, поскольку он не может функционировать без команды или обрабатываемых ею данных. В общем случае накладные расходы — это время, необходимое для пересылки блока данных от самого медленного устройства в иерархии данных к самому быстрому. При использовании эффективных механизмов пересылки данных между различными устройствами общее время задержки значительно сокращается. Одним из таких механизмов является чередование адресов памяти, о котором говорилось в предыдущем разделе.
Пример 8.2______________________________________________________________________
Теперь давайте рассмотрим влияние кэша на общую производительность компьютера. Предположим, частота попаданий равна А, накладные расходы при промахе (то есть время доступа к информации в основной памяти) составляет M (нc), а время доступа к информации в кэше — С (нc). Среднее время доступа, каким оно представляется процессору, таково (параметры системы те же, что в примере 8.1):
tave = hC + (1 - h)M
Если у компьютера вообще нет кэша, то при наличии быстрого процессора и типичной DRAM на каждое обращение к памяти для чтения данных уходит 10 тактов. Предположим, что в компьютере имеется кэш с блоками по 8 слов и основная память с чередованием адресов. Тогда, как следует из раздела 8.3.4., на загрузку блока в кэш необходимо 17 тактов. Предположим, что 30 % команд в типичной программе выполняют чтение или запись данных. Это означает, что на каждые 100 выполненных команд приходится 130 обращений к памяти. Предположим, что частота попаданий в кэш составляет 0,95 для команд и 0,9 для данных, а также что накладные расходы при промахах операций чтения и записи одинаковы. Тогда приблизительная оценка повышения производительности в результате использования кэша будет такой:
Время без кэша ________________________130х10_________
Время с кэшем = 100(0,95 х 1 + 0,05 х 17) + 30(0,9 х 1 + 0,1 х 17) = 5,04
Получается, что при наличии кэша компьютер работает впятеро быстрее. Интересно посмотреть, насколько эффективен этот кэш по сравнению с так называемым идеальным кэшем, частота попаданий которого равна 100 % (при наличии такого кэша любое обращение к памяти выполняется за 1 такт). Вот приблизительная оценка относительной производительности двух указанных кэшей:
100(0,95 х 1 + 0,05 х 17) + 30(0.9 х 1 + 0,1 х 17) = 1,98
130
Это означает, что реальный кэш создает для процессора такую среду, где он, процессор, эффективно работает с большой основной памятью на основе DRAM, которая представляется ему лишь в два раза медленнее, чем кэш.
В данном примере мы для упрощения приняли, что для доступа к кэшу на микросхеме процессора и к основной памяти через системную шину применяется одна и та же тактовая частота. Однако высокопроизводительные процессоры работают на частоте, значительно превышающей частоту системной шины — как правило, в десятки раз. Поэтому давайте рассмотрим, как кэш влияет на систему такого типа.
Пример 8.3_________________________________________________________________
Предположим, у нас имеется один кэш, реализованный на микросхеме процессора, и основная память на основе микросхем SDRAM. Мы также предполагаем, что тактовая частота системной шины в два раза меньше тактовой частоты процессора. Как и в примере 8.2, кэш состоит из блоков по 8 слов, и частота попаданий в кэш составляет 0,95 для команд и 0,9 для данных. Временная диаграмма SDRAM такая же. Всего на пересылку блока требуется 15 тактов. Если тактовая частота процессора вчетверо выше, на пересылку блока из восьми слов между процессором и основной памятью уходит 60 тактов процессора. В схеме с блочной организацией на пересылку одного слова между процессором и основой памятью требуется 9 тактов шины. Как видите, на доступ к одному слову основной памяти уходит 36 тактов процессора. И это несмотря на то, что обращение к слову в кэше выполняется за один такт процессора! Вот что получается, если повторить вычисления из примера 8.2 для других исходных данных:
Время без кэша_ = ________________130 х 36_________________ = 7,77
Время с кэшем 100(0,95 х 1 + 0,05 х 60) + 30(0,9 х 1 + 0,1 х 60)
Таким образом, если учесть различие в скорости функционирования процессора и системной шины, кэш дает даже больший выигрыш в производительности.
В предшествующих примерах мы различали частоту попаданий в кэш для данных и для команд. Хотя в обоих случаях она может превышать 0,9, обычно для команд этот показатель выше, чем для данных. В общем случае частота попаданий зависит от организации кэша и от схемы доступа к командам и данным, осуществляемого конкретной программой.
Как же повысить частоту попаданий? Очевидно, это можно сделать путем увеличения объема кэша, но не следует забывать, что при этом возрастет его стоимость. Второй способ заключается в увеличении размера блока при неизменном общем размере кэша, что даст возможность полнее использовать свойство локализации ссылок в пространстве. Если для вычислений необходимы все элементы большого блока, лучше всего загружать их в кэш одним большим массивом, а не по частям. При этом можно будет воспользоваться преимуществами параллельного доступа к данным в памяти с чередованием адресов. Но увеличение размера блока не может быть беспредельным, поскольку начиная с некоторого момента частота попаданий уже не только не повышается, но даже начинает снижаться. Если блок слишком велик, то, пока он находится в кэше, к некоторым его элементам вообще не выполняются обращения. Другими словами, чтобы достичь наивысшей производительности, необходимо подобрать оптимальный размер блока. На практике чаще всего используются блоки размером от 16 до 128 байт.
Напоследок отметим, что способ сокращения накладных расходов промаха все-таки существует. Он заключается в использовании технологии сквозной загрузки, применяемой при считывании в кэш новых блоков команд и данных. Суть ее состоит в следующем: вместо того чтобы ожидать пересылку из памяти всего блока, процессор должен продолжать свою работу, как только в кэше окажется необходимое слово.