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

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

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

Добавлен: 13.01.2021

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

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

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

5


Лекция 8


4. Микроархитектурный уровень


В архитектурной иерархии компьютера он расположен над цифровым логическим уровнем. Его задача - интерпретация команд уровня 2 (уровня машинных команд, или команд макроархитектуры). Строение микроархитектурного уровня существенно зависит от уровня 2 (например, RISC или CISC), а также от стоимости и назначения компьютера. В RISC-архитектуре каждая команда выполняется за 1 цикл центрального процессора, в CISC выполнение команды может занимать несколько циклов. Чтобы выполнить машинную команду, необходимо расшифровать ее, найти операнды, считать их, произвести операцию и записать результаты в память. Эти действия выполняет микропрограмма.


4.1. Основы микроархитектуры


В связи c различиями систем интерпретируемых команд, подходов к их реализации, в настоящее время не существует общих принципов разработки микроархитектурного уровня. Поэтому мы рассмотрим некоторый упрощенный пример того, какой могла бы быть микроархитектура. Этот пример содержит некоторое подмножество микроархитектуры виртуальной машины Java (IJVM - Integer JVM).

Рассматриваемая микроархитектура содержит в ПЗУ микропрограмму, которая способна выбирать, декодировать и выполнять команды IJVM. Для этих целей невозможно использование интерпретатора JVM фирмы Sun, поскольку он написан на C, а нам требуется минимальная микропрограмма, запускающая отдельные вентили аппаратуры.

С точки зрения микропрограммирования каждую команду макроархитектуры можно считать “функцией”, вызываемой “основной программой” - бесконечным циклом. Микропрограмма содержит также набор глобальных переменных, определяющих состояние компьютера. Каждая “функция” (команда макроархитектуры) изменяет значения этих переменных, формируя новое состояние. К таким переменным можно отнести, например, счетчик команд (регистр PC).

Каждая машинная команда IJVM может состоять из одного или более полей. К ним относятся: код операции, тип операнда, его адрес. Для стековой машины, которой является JVM, операнд может быть только один и присутствует не всегда. Рассматриваемая модель выполнения команды называется циклом выборка-выполнение. Каждая микрокоманда на один цикл процессора занимает тракт данных (АЛУ + регистры процессора). Он содержит несколько 32-разрядных регистров с символическими именами (например, PC, SP, MDR), доступных микропрограмме (но не машинным командам). Одна микрокоманда использует простейшие схемы нижнего уровня (сумматор, инвертер, сдвиг), выполняя элементарную операцию над словами. Точная синхронизация тракта данных делает возможным считывание и запись одного и того же регистра за один цикл, при этом цикл тракта данных разбивается на несколько подциклов. Границы подциклов определяются временем прохождения синхронизирующего сигнала.


IJVM может взаимодействовать с основной памятью двумя способами: посредством порта с пословной адресацией (32-битный) и порта с байтовой адресацией (8-битный). Порт с пословной адресацией управляется двумя регистрами: MAR (Memory Address Register - регистр адреса) и MDR (Memory Data Register - регистр данных). Порт с байтовой адресацией управляется регистром PC, который записывает 1 байт в 8 младших разрядов регистра MBR (Memory Buffer Register - буферный регистр памяти). Этот порт может только считывать данные и используется для чтения однобайтных кодов операций из потока команд. Регистры запускаются одним из сигналов управления.

Сигналы, управляющие трактом данных, можно разделить на 5 групп:

  • запись данных в регистры;

  • разрешение передачи данных из регистров в АЛУ;

  • управление АЛУ и схемой сдвига;

  • чтение/запись памяти через MAR/MDR;

  • чтение памяти через PC/MBR.


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

Микропрограмма хранится в специальной управляющей памяти. В IJVM управляющая память состоит из слов. Одно слово соответствует одной 32-битной микрокоманде. Каждая микрокоманда наряду с собственной информацией содержит также адрес следующей микрокоманды. Таким образом, способ расположения микрокоманд в управляющей памяти отличается от последовательного расположения машинных команд в основной памяти. Функционально управляющая память представляет собой ПЗУ. Она имеет собственный адресный регистр и собственный регистр данных. Назовем их соответственно MPC (MicroProgram Counter - микропрограммный счетчик, содержит управляющие сигналы и адрес текущей микрокоманды) и MIR (MicroInstruction Register - регистр микрокоманд, содержит текущую микрокоманду). Управляющей памяти не требуются сигналы чтения и записи, т.к. процесс считывания происходит автоматически и постоянно. Регистр MPC может быть виртуальным, т.е. представлять собой место скопления сигналов.


4.2. Направления разработки микроархитектурного уровня


При разработке микроархитектурного уровня аналогично другим уровням существует альтернатива между быстродействием и стоимостью. Существуют 3 основных пути увеличения скорости выполнения операций:

  • сокращение количества циклов, необходимых для выполнения команды;

  • упрощение организации машины с целью сокращения цикла;

  • одновременное выполнение нескольких операций.

Количество циклов, необходимых для выполнения набора операций, называется длиной пути. Сокращения длины пути можно добиться следующими способами:

  • слияние цикла интерпретатора (“основной программы”) с микропрограммой (в конце каждой последовательности микрокоманд - “функции” происходит переход к следующей последовательности, без возврата в “основную программу”);


  • использование дополнительной входной шины (каждому из операндов - своя шина);

  • упреждающая выборка команд (выборку команд осуществляет блок, реализованный в виде конечного автомата и независимый от блока обработки команд);

  • микроархитектурный конвейер (использование наряду с блоком выборки других дополнительных блоков - декодирования, формирования очереди, …).


4.3. Увеличение производительности на микроархитектурном уровне


Здесь мы кратко рассмотрим несколько современных технологий, применяемых для увеличения производительности процессора и памяти, с точки зрения микроархитектурного уровня. Эти технологии можно разделить на 2 категории: усовершенствование реализации и усовершенствование архитектуры.

Усовершенствования реализации - это такие способы построения процессора и памяти, при которых система работает быстрее, но архитектура не меняется. Этот факт означает, что старые программы будут работать на новой машине. Этим путем, например, шло развитие от i80386 к Pentium II.

Революционные способы усовершенствования приводят к новой архитектуре. Таким было появление RISC-архитектуры в 80-х годах. К подобным явлениям относят и Intel IA-64, который будет рассмотрен в последующих разделах.

В данном разделе мы рассмотрим 4 технологии, из которых первые 3 относятся к усовершенствованию реализации, а последняя требует поддержки архитектуры.


4.3.1. Кэш-память


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

Существует 2 типа локализации адресов основной памяти для передачи ее содержимого в кэш и обратно. Пространственная локализация основана на вероятности того, что следующими будут требоваться ячейки памяти, расположенные рядом с недавно выбранными. Из этих соображений в кэш-память переносится больше данных (подряд расположенных), чем требуется в каждый момент. Временная локализация рассчитывает на повторный запрос недавно использованных ячеек. Это происходит, например, с командами внутри цикла или данными рядом с вершиной стека. Принцип временной локализации применяется при выборе того, какие элементы удалить из кэш-памяти. Обычно стираются те, к которым давно не было обращений.

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


Другой вид кэш-памяти - ассоциативная с множественным доступом. Она позволяет в каждом своем элементе хранить по 2 или более строк. Кэш-память с n возможными элементами для каждого адреса называется n-входовой ассоциативной кэш-памятью. Такая память существенно снижает риск конфликтов, но имеет более сложную структуру. Для проверки наличия нужной строки приходится анализировать n элементов. Практика показывает, что хорошие результаты дает память с n = 2 или n = 4. При использовании такой памяти возникает аналогичная проблема: какой элемент удалять при занесении нового? Здесь часто применяется алгоритм LRU (Least Recently Used – удаление наиболее давно использовавшихся). Для его реализации при каждом использовании некоторого элемента кэш-памяти он перемещается в начало своего списка n строк. Поэтому при необходимости удаления всегда стирается последний элемент этого списка.

Особую проблему при работе к кэш-памятью составляет запись данных. Вопрос в следующем: если слово находится в кэш-памяти, то при его изменении нужно ли делать запись только в кэш-память (отложив завершение операции до момента удаления по LRU) или сразу же записывать и в основную память? Ни одно из решений не дает явных преимуществ. Немедленное обновление элемента основной памяти называется сквозной записью. Этот подход проще реализуется и более надежен, но увеличивает поток передаваемой в память информации (особенно при многократных модификациях). Альтернативный вариант называется обратной записью.

Смежная проблема возникает при модификации слов, не находящихся в кэш-памяти. Нужно ли их при этом предварительно переносить в кэш или записывать новое содержимое прямо в основную память? Обычно при использовании обратной записи данные в этом случае переносятся в кэш-память. Такой подход называется заполнением по записи. Он полезен при повторных операциях записи слов. Если используется сквозная запись, то обычно напрямую модифицируется основная память.


4.3.2. Прогнозирование ветвления


Вторая технология усовершенствования реализации называется прогнозированием ветвления. Как говорилось выше, современные компьютеры сильно конвейеризированы. Для обеспечения работы конвейеров процессору (блоку выборки команд) приходится считывать из памяти команды асинхронно, не дожидаясь выполнения каждой команды. Удобнее всего работать с линейным кодом, в этом случае из памяти просто считываются последовательные слова. Однако программы часто содержат команды перехода (в том числе условного), что делает линейное считывание менее эффективным. До выполнения текущей команды неизвестно, какая команда выполнится после нее. Поэтому неизвестно, какую команду считывать следующей. В ранних машинах в такой ситуации конвейер простаивал. В современных компьютерах применяется прогнозирование условных переходов. Например, можно предполагать, что все условные переходы назад будут осуществляться, а переходы вперед – нет. Это может срабатывать в большинстве случаев, т.к. команда условного перехода назад часто помещается в конце цикла. Очевидно, что при этом возможна определенная часть неверных предсказаний. При верном предсказании программа продолжает выполнение. При неверном – возникает проблема отмены команд, которые были выполнены конвейером неправомерно. Для этого при сохранении результатов часто используются скрытые регистры, содержимое которых копируется в обычные регистры только после подтверждения правомерности выполненных команд. В связи со сказанным возникает потребность в повышении точности прогнозов ветвлений.


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

Статическое прогнозирование ветвления осуществляется компилятором. В частности, только он точно знает об используемых в программе управляющих структурах (в частности, циклах) и может передать эту информацию в программу. Иногда для этой цели используется архитектурная поддержка (в UltraSPARC II имеется набор команд условного перехода с дополнительным битом). Еще один статический метод прогнозирования состоит в профилировании – предварительном выполнении программы с фиксацией ветвлений, информация о которых передается компилятору, который затем выдает специальные команды условного перехода.


4.3.3. Выполнение с изменением последовательности и подмена регистров


Выполняемая программа состоит из отдельных команд. Команды часто находятся во взаимозависимости. Например, одни команды могут использовать результаты выполнения других команд. Чтобы достичь лучшей производительности, некоторые процессоры пропускают взаимозависимые команды и переходят к выполнению независимых команд. Таким образом гарантируется актуальность предварительной выборки, но последовательность выполнения команд отличается от запрограммированной. При этом, очевидно, переупорядочивание команд не должно изменять результаты их естественного выполнения. Для этого требуется исследование видов взаимозависимости команд.

Их можно выделить три:

  • RAW (Read After Write) – операнд очередной команды является результатом предыдущей команды;

  • WAR (Write After Read) – предыдущая команда должна завершить считывание регистра до того как следующая его перезапишет;

  • WAW (Write After Write) – очередная команда должна записать результат в регистр после того как предыдущая команда запишет этот же регистр.

Очевидно, что технология изменения последовательности команд более эффективна для программ с меньшей взаимозависимостью команд. Ее можно уменьшить искусственными методами. Одним из них является подмена регистров. Современные процессоры содержат десятки скрытых регистров, используемых для записи промежуточных результатов. Замена обычных регистров скрытыми во многих случаях позволяет устранить WAR- и WAW-взаимозависимости команд.


4.3.4. Спекулятивное выполнение


Компьютерные программы можно разбивать на базовые элементы, каждый из которых представляет собой линейную последовательность команд (цепочку) с точкой входа в начале и точкой выхода в конце. Базовые элементы связываются между собой операторами управления (ветвления, циклы). Рассмотренная в предыдущем пункте технология работает в пределах одного базового элемента. Однако, большинство базовых элементов коротки и в них недостаточно возможностей для параллелизма. Поэтому делаются попытки перестановок базовых элементов, приводящие к эквивалентным, но более эффективным, программам. С точки зрения параллелизма выгодно передвигать потенциально медленные блоки операций на более ранние стадии выполнения. Такое перемещение называется подъемом. Оно приводит к выполнению некоторых команд до того как будет известно, что их выполнение понадобится. Этот процесс называется спекулятивным выполнением. Применение этой технологии требует поддержки компилятора, аппаратуры и некоторого усовершенствования архитектуры компьютера. Часто переупорядочивание команд за пределами одного базового элемента осуществляется компилятором.


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