ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.01.2021

Просмотров: 137

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

6


Лекция 9


4.4. Примеры микроархитектурного уровня


В этом разделе мы кратко рассмотрим наши три “тестовых” процессора в свете микроархитектуры.


4.4.1. Микроархитектура Pentium II


Pentium II поддерживает 32-битные операнды и арифметику, а также 64-битные операции с плавающей точкой. Кроме того, используются также 8- и 16-битные операнды и операции, унаследованные от предыдущих процес­соров этого семейства. Процессор может адресовать до 64 Гбайт памяти и счи­тывать слова из памяти по 64 бита за один раз. Как уже говорилось, картридж с одноряд­ным расположением контактов (SEC) системы Pentium II состоит из двух интег­ральных схем: центрального процессора (на ней находится разделенная кэш-­память первого уровня) и объединенной кэш-памяти второго уровня.

С точки зрения микроархитектуры Pentium II состоит из трех основных компонентов: блока выборки/декоди­рования, блока отправки/выполнения и блока возврата, которые действу­ют совместно как конвейер высокого уровня. Эти три блока обмениваются данными через пул команд - место для хранения информации о частично выполненных коман­дах. Информация в пуле команд находится в виде таблицы, которая называется ROB (ReOrder Buffer - буфер переупорядочивания команд). Блок выборки/декодирования загружает команды из памяти и разбивает их на микрооперации для хранения в ROB. Блок отправки/выполнения получает микрооперации из буфе­ра ROB и выполняет их. Блок возврата завершает выполнение каждой операции и обновляет регистры. Команды поступают в буфер ROB в порядке расположения, выпол­няться могут в произвольном порядке, но завершаться должны в запрограммированном порядке. Блок сопряжения с шиной отвечает за обмен информацией с системой памяти (как с кэш-памятью второго уровня, так и с основной памятью).

Блок выборки/декодирования отличается высокой степенью конвейеризации - он содержит семь стадий. Блок отправки/выполнения и блок возврата имеют еще пять стадий, то есть всего стадий 12.

Команды поступают на конвейер из кэша команд. Оттуда загружа­ются целые 32-байтные строки. Всякий раз, когда внутренний буфер пуст, туда копируется следующая строка кэш-памяти. Процессом выборки команд управляет специальный регистр - NEXT IP (NEXT Instruction Pointer). Поскольку в наборе команд Intel, который называется IA-32 (32-разряд­ная архитектура для процессоров Intel), содержатся команды разной длины и раз­личного формата, то для определения начала каждой команды происходит анализ потока байтов. На стадиях выборки могут рассматриваться до 30 команд вперед. К сожалению, при этом встречаются не всегда правильно прогнозируемые условные переходы. Перед декодированием команды выравниваются.

Декодирование в системе Pentium II состоит из превращения каж­дой команды IA-32 в одну или несколько микроопераций. Простые команды (например, пересылка из одного регистра в другой) преобразуются в одну микрооперацию. Выполнение более сложных команд мо­жет занимать до четырех микроопераций. Несколько особо сложных ко­манд требуют еще больше микроопераций и используют ПЗУ последовательнос­ти микроопераций для их упорядочения. Имеется три внутренних декодера (два для простых команд, третий - для более сложных). Каждая получаемая микрооперация содержит код операции, два входных и один выходной регистр.


На одной из стадий декодирования выстраивается очередь микрокоманд. Здесь же происходит статическое прогнозирование ветвления. Прогноз зависит от нескольких факторов. Для переходов, связанных с текущей выполняемой командой, обычно считается, что переход назад будет производиться, а переход впе­ред - нет. Затем идет динамическое прогнозирование с использованием специ­альной таблицы. Для конвейера с 12 стадиями неправильное пред­сказание обходится достаточно дорого (в смысле количества лишних циклов). Если перехода в таблице динамики нет, используется статическое прогнозирование.

Чтобы избежать взаимозависимостей WAR и WAW, система Pentium II поддерживает переименования регистров (подмены). Реальные реги­стры в командах IA-32 могут быть заменены в микрооперациях любым из 40 внут­ренних временных регистров, находящихся в буфере ROB. Подмена происходит на одной из стадий.

Наконец, микрооперации копируются в буфер ROB со скоростью три штуки за цикл. Сюда же при их наличии собираются операнды. Если операнды микрооперации и регистр результатов доступны, а операционный блок свободен, микрооперацию можно запустить. В противном случае она нахо­дится в буфере ROB, пока не появятся все необходимые ресурсы.

Блок отправки/выполнения устанавливает очередность, выполняет микрооперации, разрешает взаимо­зависимости и конфликты ресурсов. Он состоит из резервации (очередь из 20 элементов для микроопераций) и функциональных бло­ков, которые связаны с пятью портами. Поэтому за один цикл можно выпустить для выполнения пять микроопераций. Такая скорость превышает возможности блока возврата. Микро­операции могут запускаться не по порядку, но блок возврата должен завершать их выполнение по порядку. Чтобы следить за микрооперациями, регистрами и функ­циональными блоками, требуется сложный счетчик обращений. Когда операция готова для выполнения, она может начаться, даже если другие операции, которые поступили в буфер ROB раньше нее, еще не готовы. Если несколько микроопера­ций пригодны для выполнения одним и тем же функциональным блоком, с помо­щью сложного алгоритма выбирается важнейшая из них, и именно она запуска­ется следующей. Например, выполнение перехода гораздо важнее, чем выполнение арифметического действия, поскольку первый из них влияет на ход программы.

Когда микрооперация выполнена, ее результат переходит обратно в резервацию, а затем в буфер ROB, и там ожидает возврата. Блок возврата отвечает за отправку результа­тов в нужные места - в соответствующий регистр или в другие устройства блока отправки/выполнения, которым требуется данное значение. Блок отправки/вы-полнения содержит “официальные” регистры, то есть те, в которых хранятся зна­чения завершенных команд. Он имеет также ряд “промежуточных” реги­стров, значения которых были вычислены командой, которая еще не завершилась, поскольку выполнение предыдущих команд не закончилось. Система Pentium II поддерживает процедуру спекулятивного выполнения, по­этому некоторые команды могут выполняться напрасно, и их результаты никуда не нужно записывать. Именно поэтому поддерживается способность возвращаться в предыдущее состояние. Если стало известно, что какая-то микрооперация пришла из команды, которую не нужно было выполнять, результаты этой микрооперации отбрасываются. Все это контролирует блок возврата. Только результаты “офици­ально” выполненных команд могут возвращаться в регистры, причем это должно происходить в том же порядке, что и в программе, даже если команды выполня­лись в произвольном порядке.



4.4.2. Микроархитектура UltraSPARC II


UltraSPARC II - это машина с 64-разрядными регистрами и 64-разрядным трактом данных. В целях совместимости с 32-разрядными ЭВМ предыдущих версий она может манипулировать 32-разрядными опе­рандами и выполнить программы, написанные для ранних версий SPARC. Хотя внутренняя архитектура машины использует 64 разря­да, ширина шины памяти составляет 128 битов (аналогично Pentium II с 32-разрядной архитектурой и 64-разрядной шиной памяти).

Серия SPARC с самого начала представляла собой систему RISC. У боль­шинства команд есть два входных и один выходной регистр, поэтому они хорошо подходят для конвейерного выполнения в одном цикле. Разбивать коман­ды CISC на микрооперации RISC, как в системе Pentium II, не требуется.

UltraSPARC II - это суперскалярная машина, которая может выдавать на выполнение 4 ко­манды за цикл. Команды считываются по порядку, но запускаться и завершаться могут в произвольном порядке. Тем не менее прерывания процессора являются точными (то есть всегда известно, в каком месте программы было выполнение, когда произошло прерывание). Существует аппаратная поддержка спекулятивных загрузок в виде команды PREFETCH. Эта команда не вызывает ошибок при промахе кэша, т.к. не блокирует обращения к памяти. Компилятор может вставлять в код программы команды PREFETCH задолго до того, как они понадо­бятся, не испытывая неприятностей в случае отсутствия нужного слова в кэш-памяти.

За исключением кэш-памяти второго уровня, все компоненты UltraSPARC II расположены на микросхеме центрального процессора. Внутренний кэш команд - это 16 Кбайт двувходовой ассоциативной кэш-памяти, со стро­ками по 32 байта. Половина строки кэш-памяти (16 байтов) содержит ровно четыре команды, которые могут выдаваться за один цикл. Кэш-память данных - это 16 Кбайт кэш-памя­ти прямого отображения со сквозной записью и без заполнения по записи (см. п. 4.3.1). Здесь тоже используются 32-байтные строки, разделенные на 2 части по 16 байтов.

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

Рассмотрим функциональные блоки системы UltraSPARC II. Ее блок выборки/ отправки похож на блок выборки/декодирования в системе Pentium II. Однако у него работа проще, поскольку входные команды изначально представлены в виде микроопераций. Блок может выбирать команды из кэш-памяти как первого, так и второго уровня. За один цикл выбираются четыре команды. Каждая группа четырех команд в кэш-памяти содержит адрес следующей группы.

Внутри блока выборки/отправки находится устройство предсказания переходов. Оно использует специальный алгоритм прогнозирования. Кроме того, UltraSPARC II содержит ряд команд перехода, в которых компилятор может сообщать аппаратному обеспечению, каким именно способом предсказывать переход. Выбранные заранее команды помещаются в оче­редь из 12 элементов, а затем передаются в схему группировки.


Схема группировки - это блок, который выбирает по четыре команды за один раз из очереди для запуска. Его задача состоит в том, чтобы найти 4 команды, которые можно выпустить одновременно. Блок целых чисел содержит два раздельных АЛУ, что позволяет выполнять две команды параллельно. Блок вычислений с плаваю­щей точкой также содержит два АЛУ. Следовательно, в одной группе может нахо­диться по две команды каждого типа. Чтобы сделать группирование оптимальным, команды могут запускаться не по поряд­ку. Завершаются они также в произвольном порядке.

Блок целых чисел и блок вычислений с плавающей точкой содержат собствен­ные регистры, поэтому команды берут операнды прямо внутри блока и там же оставляют результаты. Регистры целых чисел и регистры с плавающей точкой разде­лены. Значения никогда не переходят из одного блока в другой. В блоке вычислений с плавающей точкой также находится графический блок, который вы­полняет специальные команды для двух- и трехмерных изображений, аудио и ви­део, аналогичные командам ММХ в системе Pentium II.

Блок загрузки/сохранения управляет командами LOAD и STORE. Если они имеются в кэш-памяти данных первого уровня, то выполняются без задержки. В против­ном случае нужная строка берется из кэш-памяти второго уровня или основной памяти (если речь идет о команде LOAD) или нужное слово записывается туда (если речь идет о команде STORE). Если нужно сохранить некоторое слово, осуществляется сквозная запись в кэш-память второго уровня, а в случае промаха - в основную память. Блок загрузки/сохранения хранит очереди незавершенных команд LOAD и STORE. Поэтому можно продолжать обрабатывать новые команды, пока завершается выполнение старых.

Система UltraSPARC II содержит конвейер с 9 стадиями. Некоторые из этих ста­дий различны для команд с целыми числами и команд с плавающей точкой. На стадии выборки считываются команды из кэш-памяти команд (если это возможно). При благоприятных обстоятельствах (отсутствии промахов кэш­-памяти, неправильного прогнозирования ветвлений, наличии правильной смеси команд и т. п.) машина может продолжать выбирать и запус­кать по 4 команды за цикл. На стадии декодирования перед копированием команд в очередь к каждой команде прибавляются дополнительные биты. Эти биты уско­ряют последующую обработку (например, сразу отправляя команду в соответству­ющий функциональный блок).

Стадия группировки соответствует рассмотренной выше схеме группировки.

С этого момента стадии конвейера для операций с целыми числами и для опе­раций с плавающей точкой разделяются. На стадии 4 в блоке целых чисел боль­шинство команд выполняется за один цикл. Однако команды STORE и LOAD требуют дополнительной обработки на стадии кэширования. Дальнейшие стадии в блоке целых чисел нужны для синхронизации работы двух конвейеров (т.е. являются фиктивными).


Блок с плавающей точкой содержит отдельные 4 стадии. Первая нужна для доступа к регистрам с плавающей точкой. Следующие три выполняют команды. Все команды с плавающей точкой выполняются за три цикла, за исклю­чением деления (12 циклов) и квадратного корня (22 цикла).

Еще одна стадия, общая для обоих блоков, нужна для разрешения исключительных ситуаций (например, деления на нуль). Наконец, на последней стадии результаты записываются обратно в регистры. Эта стадия напоминает блок возврата системы Pentium II. Если команда прошла эту стадию, она завершена.


4.4.3. Микроархитектура picoJava II


В системе picoJava II двоичные программы JVM могут работать практически без интерпретации. Большинство команд JVM выполняются непосредственно аппа­ратным обеспечением за один цикл, т.е. около 30 команд JVM являются микропро­граммными. Лишь небольшое число команд не может выполняться аппа­ратным обеспечением picoJava II и вызывает traps (ловушки). Эти команды связаны с такими особенностями JVM как создание и управле­ние сложными программными объектами (поддержка ООП).

Микросхема процессора picoJava II содержит разделенную кэш-память первого уровня. Кэш-память ко­манд, как и данных, факультативна (т.е. может отсутствовать). Объем каждой может составлять 1, 2, 4, 8 или 16 Кбайт с размером строки 16 байтов. Кэш-память команд является памятью прямого отображения. Кэш-память данных - это двухвходовая ассоциативная кэш-память. Она использует обратную запись и заполнение по записи. Каждая кэш-память соединяется с шиной памяти по 32-битному каналу. Система microJava 701 имеет оба блока кэш-памяти в обя­зательном порядке, объем каждого из них составляет 16 Кбайт.

Частью picoJava П также является факультативный блок с плавающей точкой.

Кэш-память команд передает в блок выборки, декодирования и свертывания по 8 байтов за раз. Этот блок, в свою очередь, связан с контроллером выполнения и с основным трактом данных (блоком операций с целыми числами и с плаваю­щей точкой). Ширина тракта данных составляет 32 бита для целочисленных опе­раций. Этот тракт данных может также оперировать числами с плавающей точкой с оди­нарной и двойной точностью.

Интересной частью picoJava II является регистровый файл, состоящий из 64-х 32-битных регистров. В этих регистрах могут содержаться верхние 64 слова стека JVM, что значительно повышает скорость доступа к словам в стеке. Как известно, JVM имеет стек операндов и стек локальных переменных. Оба они (или их часть) могут находиться в регистровом файле. Доступ к регистровому файлу происходит без задержек, тогда как доступ к кэш-памяти данных требует дополнительного цикла. Ширина канала между регистровым файлом и блоком операций с целыми числами и с плавающей точкой составляет 96 битов. За один цикл канал выдерживает два 32-битных считы­вания из стека и одну 32-битную запись в стек (96 = 2 x 32 + 32).


Смотрите также файлы