Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
21.05.2015
Размер:
69.63 Кб
Скачать

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).

Если, например, стек операндов состоит из двух слов, то в регистровом файле могут находиться до 62 слов локальных переменных. При помеще­нии дополнительного слова в стек или его выталкивании может возникать дриблинг. Если в стек, например, помещается 63-я локальная переменная, то самая глубокая из них выгружается обратно в память. Если, наоборот, в регистровом файле освобождается место, то в него перезагружаются слова из глубины стековой памяти. Специ­альные регистры на микросхеме определяют, насколько полным должен быть ре­гистр, чтобы слова из нижней части стека записывались в память, и насколько пу­стым он может быть для того, чтобы перезагрузить регистровый файл из памяти. Для облегчения дриблинга регистровый файл действу­ет как кольцевой буфер с указателями на самое нижнее и на самое верхнее слова. Дриблинг происходит автоматически всякий раз, когда регистровый файл пере­полняется или пустеет.

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

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

Блок декодирования умеет свертывать команды. Чтобы это объяснить, рассмотрим выра­жение n = k + m. Предполагается, что k, m и n - локальные переменные, занимающие в стеке позиции 7, 1 и 3 соответственно. Его трансляция на JVM может быть следующей:

ILOAD 7 ; Поместить в вершину стека k

ILOAD 1 ; Поместить в вершину стека m

IADD ; Заменить две верхние переменные суммой

ISTORE 3 ; Вытолкнуть и записать на место n

Если при выполнении все три переменные будут находиться достаточно высоко в сте­ке, чтобы располагаться в регистровом файле, то для выпол­нения этой последовательности команд вообще не потребуются обращения к памя­ти. Избавление от обращений к памяти - основной способ повышения производительности. Однако машина picoJava II делает больше. Рассматриваемая последовательность четырех команд просто складывает два регистра и сохраняет полученное значе­ние в третьем регистре. Блок декодирования распознает эту ситуацию и запускает лишь одну микрооперацию: трехрегистровую команду ADD. Таким образом, вместо четы­рех CISC-команд JVM, для которых может потребоваться несколько обращений к памяти, мы имеем одну RISC-микрооперацию сложения. Этот процесс называется свертыванием команд.

Процесс свертыва­ния происходит только тогда, когда требуемые локальные переменные находятся достаточно близко от вершины стека, то есть содержатся в регистровом файле. Тем не менее свертывание команд происходит довольно часто. Измерения пока­зывают, что picoJava II может выполнять программы на языке Java в 5 раз быс­трее, чем если те же программы скомпилировать на машинный язык для Pentium с аналогичной тактовой частотой, и в 15 раз быстрее, чем при интер­претируемом выполнении той же программы на машине Pentium.

В машине picoJava II используется примитивное про­гнозирование ветвлений: она всегда предсказывает, что перехода не будет. Это объясняется намерением сохранить микросхему простой и дешевой. Однако благодаря более короткому конвейеру (6 стадий вместо 12, как в системе Pentium II) проигрыш при непра­вильном предсказании оказывается менее существенным (около 3-х циклов).

4.4.4. Сравнение рассмотренных архитектур

Несмотря на большие различия, микроархитектуры всех трех машин имеют сходные функциональные блоки. Кроме того, их микрооперации имеют одинаковую структуру - содержат код операции, два входных регистра и один выходной регистр. Все машины могут вы­полнять микрооперацию за один цикл, конвейеризированы и применяют прогнозирование ветвления. Все они содержат разделенную кэш-память для ко­манд и для данных, объем каждой составляет 16 Кбайт. Внутреннее сходство говорит о том, что для современной техники эти общие идеи наиболее эффективны.

Главное различие между рассмотренными процессорами составляет переход от команд к микрокомандам. Компьютеру Pentium II приходится разбивать CISC-команды, чтобы преобразовать их в трехрегистровый формат, необходимый для функционального блока. У машины picoJava II обратная основная задача - скомбинировать несколько команд для полу­чения микрооперации (свертывание). Машине UltraSPARC II в этом плане вообще не нужно ничего делать, поскольку ее первоначальные ко­манды уже представляют собой микрооперации.

Соседние файлы в папке Архитектура ЭВМ