ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.01.2021
Просмотров: 137
Скачиваний: 1
Лекция 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).