Э. Таненбаум - Архитектура компьютера (1127755), страница 82
Текст из файла (страница 82)
4.24. Цифры в кружочках соответствуют компонентам на рис. 4.23. В микроархитектуре М?с-4 поток байтов заранее вызывается из памяти в автоматическом режиме, декодируется в ??УМ-команды, которые затем с помощью ПЗУ превращаются в последовательность операций и применяются по назначению. Первые три ступени конвейера при желании можно связать с задающим генератором тракта данных, но работа будет происходить не в каждом цикле. Например, блок выборки команд совершенно точно не смо- Повышение производительности 329 жет передавать новый код операции блоку декодирования в каждом цикле, по- скольку выполнение ЦУМ-команды занимает несколько циклов и очередь бы- стро переполнится. Об Ов От О2 Оз О4 От Блок выборки команд Декодер Очередь Операнды Выполнение р Память запись Рис.
4.24. Конвейер М!с-4 В каждом цикле значения регистров М1гк смещаются, и микрооперация, находящаяся в начале очереди, копируется в регистр М1К1. Затем сигналы управления от всех четырех регистров М1К передаются по тракту данных, вызывая определенные действия. Каждый регистр М1К контролирует отдельную часть тракта данных и, следовательно, разные микрошаги. В данной разработке имеется конвейеризированный процессор. Благодаря этому отдельные шаги становятся очень короткими, а тактовая частота — высокой. Многие процессоры проектируются именно таким образом, особенно те, которым приходится выполнять устаревший набор команд (С18С). Например, процессор Репйшп П в некоторых аспектах сходен с микроархитектурой М1с-4, как мы увидим позднее в этой главе.
Повышение производительности Все производители компьютеров хотят, чтобы их системы работали как можно быстрее. В этом разделе мы рассмотрим ряд передовых технологий повышения производительности системы (в первую очередь — процессора и памяти), которые исследуются в настоящее время. Поскольку в компьютерной индустрии конкуренция очень острая, между появлением новой идеи о повышении скорости работы компьютера и воплощением этой идеи обычно проходит очень немного времени.
Следовательно, большинство идей, которые мы сейчас будем обсуждать, вероятнее всего уже применяются в производстве. Рассматриваемые усовершенствования можно разделить на две категории, касаю|циеся реализации и архитектуры. Усовершенствования реализации — это такие способы построения новых процессора и памяти, после применения которых система работает быстрее, но архитектура при этом не меняется.
Изменение реализации без изменения архитектуры означает, что устаревшие программы смогут работать на новой машине, а это очень важно для успешной продажи. Чтобы усовершенствовать реализацию, можно, например, использовать более быстрый задающий генератор, но это — не единственный способ. Отметим, что рост производительности от процессора 80386 к процессорам 80486, Репгшш, Репйцш Рго, а затем и к Репгшш П, достигался без изменения архитектуры. Однако некоторые варианты усовершенствований можно реализовать только путем изменения архитектуры. Иногда, например, нужно добавить новые команды 330 Глава 4. Уровень микроархитектуры или регистры, причем таким образом, чтобы устаревшие программы могли работать на новых моделях.
В этом случае для достижения максимальной производительности программное обеспечение приходится переделывать или, по крайней мере, заново компилировать на новом компиляторе. Однако один раз в несколько десятилетий разработчики понимают, что старая архитектура уже никуда не годится и единственный способ развивать технологии дальше — начать все заново. Таким революционным скачком было появление в 80-х годах К15С-архитектуры, а сейчас уже приближается следующий прорыв. Мы рассмотрим соответствующий пример (1псе1 1А-64) в главе 5. Далее в этом разделе мы расскажем о четырех приемах повышения производительности процессора.
Начнем мы с трех хорошо зарекомендовавших себя вариантов усовершенствования реализации, а затем перейдем к варианту, требующему незначительного усовершенствования архитектуры. Указанные приемы касаются кэш-памяти, прогнозирования ветвлений, выгюлнения с изменением очередности и подменой регистров, а также спекулятивного выполнения. Кэш-память Одним из самых важных вопросов при разработке компьютеров была и остается организация системы памяти, поддерживающей передачу операндов процессору с той же скоростью, с которой он их обрабатывает. Стремительное увеличение быстродействия процессора, к сожалению, не сопровождается столь же стремительным повышением скорости работы памяти. Относительно процессора память работает все медленнее и медленнее. Учитывая чрезвычайную важность основной памяти, эта ситуация, которая ухудшается с каждым годом, серьезно тормозит развитие высокопроизводительных систем, заставляя разработчиков искать обходные пути.
Современные процессоры предъявляют определенные требования к системе памяти и в плане времени ожидания (задержки в доставке операнда), и в плане пропускной способности (объему данных, передаваемых в единицу времени). К сожалению, эти два аспекта системы памяти в значительной степени противоречивы. Обычно с повышением пропускной способности увеличивается время ожидания. Например, конвейерные технологии, которые мы использовали в микроархитектуре М1с-З, можно применить и к системе памяти, в этом случае запросы к памяти будут обрабатываться более рационально, с перекрытием. Однако, к сожалению, как и в микроархитектуре М|с-З, это приводит к увеличению времени ожидания отдельных операций памяти, С увеличением скорости работы задающего генератора становится все сложнее поддерживать такую систему памяти, которая могла бы передавать операнды за один или два цикла. Один из вариантов решения проблемы — добавление кэш-памяти.
Как мы отмечали в подразделе «Кэш-память» раздела «Основная память» главы 2, в кэш-памяти хранятся наиболее часто используемые слова, за счет чего повышается скорость доступа к ним. Если достаточно большой процент нужных слов находится в юш-памяти, время ожидания может значительно сократиться. Одной из самых эффективных технологий одновременного увеличения пропускной способности и уменьшения времени ожидания является применение Повышение производительности 331 нескольких блоков кэш-памяти.
Основной прием — введение отдельных кашей для команд и данных (так называемая разделенная кэш-память). Такая кэш-память имеет несколько преимуществ, в частности, операции могут начинаться независимо в каждой кэш-памяти, что удваивает пропускную способность системы памяти. Именно по этой причине в микроархитектуре М(с-1 нам понадобились два отдельных порта памяти: отдельный порт для каждого каша. Отметим, что каждый кэш имеет независимый доступ к основной памяти. В настоящее время многие системы памяти гораздо сложнее этих.
Между разделенной кэш-памятью и основной памятью часто помещается кэш-память второго уровня. Вообще говоря, поскольку требуются более совершенные системы, может быть три и более уровня кэш-памяти. На рис. 4.25 изображена система с тремя уровнями кэш-памяти. Прямо на микросхеме центрального процессора находится небольшой кэш для команд (Е1-1) и небольпюй кэш для данных (11-О) объемом обычно от 16 до 64 Кбайт. Есть еще кэш-память второго уровня (Е2), которая расположена не на самой микросхеме процессора, а рядом с ним в том же блоке.
Кэш-память второго уровня соединяется с процессором через высокоскоростной тракт данных. Эта кэш-память обычно не является разделенной и объединяет данные и команды. Ее размер — от 512 Кбайт до 1 Мбайт. Кзш-память третьего уровня (ЕЗ) находится на той же плате, что и процессор, и обычно состоит из статического ОЗУ в несколько мегабайтов, которое функционирует гораздо быстрее, чем динамическое ОЗУ основной памяти. Как правило, все содержимое кэш-памяти первого уровня находится в кэпг-памяти второго уровня, а все содержимое кэш-памяти второго уровня — в кэш-памяти третьего уровня. Корпус процессо Раэдепенн кэш-памя первого уровня Плата процессо Кэш-память в плате процессора (ствтическое Озу) Рис.
4.26. Система с тремя уровнями кэш-памяти 332 Глава 4. Уровень микроархитектуры Существует два варианта локализации адресов, от которых зависит работа кэш-памяти. Пространственная локализация основана на вероятности того, что в скором времени появится потребность обратиться к ячейкам памяти, расположенным рядом с недавно вызванными ячейками. Исходя из этого наблюдения, в кэш-память переносится больше данных, чем требуется в данный момент.
Временная локализация имеет место, когда недавно вызванные ячейки запрашиваются снова. Это может происходить, например, с ячейками памяти, находящимися рядом с вершиной стека, или с командами внутри цикла. Принцип временнбй локализации используется при выборе элементов, которые следует удалить из кэш-памяти в случае кэш-промаха. Обычно удаляются те элементы, к которым давно не было обращений. Во всех типах кэш-памяти используется следующая модель. Основная память разделяется на блоки фиксированного размера, которые называются строками каша. Строка каша состоит из нескольких последовательных байтов (обычно от 4 до 64). Строки нумеруются, начиная с О, то есть если размер строки составляет 32 байта, то строка 0 — это байты с 0 по 31-й, строка 1 — байты с 32-го по 63-й и т.
д. В любой момент в кэш-памяти находится несколько строк. Когда происходит обращение к памяти, контроллер кэш-памяти проверяет, есть ли нужное слово в кэш-памяти. Если слово есть (случай кэш-попадания), то можно сэкономить время, требуемое на доступ к основной памяти. Если данного слова в кэш-памяти нет (случай кэш-промаха), то одна из строк из каша удаляется, а вместо нее туда помещается запрошенная строка из основной памяти или из кэш-памяти более низкого уровня. Существует множество вариаций данной схемы, но в их основе всегда лежит идея держать в кэш-памяти как можно больше часто используемых строк, чтобы число кэш-попэданий было максимальным. Кзш-память прямого отображения Самый простой тип кэш-памяти — кэш-память прямого отображения.
Пример одноуровневой кэш-памяти прямого отображения показан на рис. 4.26, а. Данная кэш-память содержит 2048 элементов. Каждый элемент (ряд) может вмещать ровно одну сроку из основной памяти. Если размер строки каша составляет 32 байта (как в этом примере), кэш-память может вмещать 64 Кбайт. Каждый элемент кэш-памяти состоит из трех частей: + Бит достоверности указывает, есть достоверные данные в элементе или нет. Когда система загружается, все элементы маркируются как недостоверные. + Поле тега состоит из уникального 16-разрядного значения, указывающего соответствующую строку памяти, из которой поступили данные. + Поле данных содержит копию данных памяти.