Э. Таненбаум - Архитектура компьютера (1127755), страница 116
Текст из файла (страница 116)
Сократить число обращений к памяти можно путем размещения большого кэша первого уровня на микросхеме процессора и еше большего кэша второго уровня в непосредственной близости от микросхемы. Двумя модулями кэш-памяти оснашаются все современные процессоры. В то же время существуют и другие методы, позволяющие сократить объем взаимодействия с памятью, и некоторые из них реализованы в 1А-64. Лучший способ ускорить обращения к памяти — выполнять эту операцию в фоновом режиме. В процессоре 1сап1шп 2 предусмотрено 128 64-разрядных регистров общего назначения.
Первые 32 из них являются статическими, а оставшиеся 96 группируются в стек регистров, напоминающий регистровое окно 1)1ггаВРАКС П1. В отличие от П1гаБРАКС, количество доступных программе регистров меняется от одной процедуры к другой. В итоге каждая процедура получает доступ к 32 статическим регистрам и некоторому (переменному) количеству регистров, распределяемых динамически.
При вызове процедуры указатель стека регистров смещается таким образом, чтобы входные параметры оказались видимыми в регистрах, но сами регистры не были распределены между локальными переменными. Процедура сама определяет количество необходимых ей регистров и соответствующим образом перемешает указатель стека.
Сохранять содержимое этих регистров при входе и восстанавливать при выходе не требуется, хотя, если процедуре нужно изменить статический регистр, она должна сначала явно сохранить его прежнее значение, а впоследствии восстановить его. Поскольку количество регистров выражено доступной переменной и обуславливается требованиями каждой конкретной процедуры, неэффективное применение регистров исключается. Кроме того, 464 Глава 5.
Уровень архитектуры набора команд увеличивается максимальная глубина вызова процедур, при которой регистры не требуется «сбрасывать» в память. В 1гап1пш 2 есть 128 регистров с плавающей точкой, организованных по стандарту 1ЕЕЕ 745 и не группируемых в стек. Большое количество регистров этого типа позволяет сохранять промежуточные результаты множества операций с плавающей точкой в регистрах, не перемещая их в память. Кроме того, в 1гап1шп 2 предусмотрено 64 1-разрядных предикатных регистра, 8 регистров ветвлений и 128 специализированных прикладных регистров, которые используются для самых различных целей, в частности для обмена параметрами между прикладными программами и операционной системой. Общая схема регистров 1гапппп 2 представлена на рис.
5.29. 84 1-разрядных предикатных регистра 128 регистров общего назначения 128 регистров с плавающей точкой 128 регистров прикладных регистров 98 регистров, используемых в качестве стека регистров 32 статических регистра Рис. 8.29. Регистры Иапмгп 2 Планирование команд Один из наиболее серьезных недостатков Репйшп 4 — сложность планирования команд для обработки в различных функциональных блоках без взаимозависимостей. Для решения этой проблемы в период выполнения задействуются очень сложные механизмы, аппаратная поддержка которых требует много места на микросхеме. В архитектуре 1А-64 и ее реализации — 1гап1шп 2 — эти проблемы решены путем передачи соответствующих функций компилятору. Каждая программа теперь состоит из последовательности групп команд. Команды в рамках одной группы не конфликтуют друг с другом, не потребляют больше ресурсов и не обращаются к большему количеству функциональных блоков, чем предусмотрено системой, не образуют КАттг- и 1йгА1Ч-взаимозависимости (ЪгАК-взаимозависимости допускаются в ограниченном объеме).
Создается впечатление, что последовательные группы команд выполняются строго по порядку, хотя на самом деле, если это безопасно, процессор может запустить часть команд следующей группы до завершения предыдущей. Таким образом, процессор может планировать выполнение команд внутри каждой отдельно взятой группы в любом порядке, по возможности, — в параллель- Архитектура 1А-64 и процессор 11апагп 2 465 ном режиме.
При этом вероятность возникновения конфликтов между командами равна нулю. Если группа команд нарушает вышеуказанные правила, поведение программы становится неопределенным. В такой ситуации обязанность по обеспечению соответствия полученного из исходной программы кода на ассемблере всем требованиям ложится на компилятор. Для того чтобы быстро провести компиляцию одновременно с отладкой программы, компилятор может поместить каждую команду в отдельную группу; сделать это просто, но производительность в результате этой операции снижается, а время оптимизации выходного кода значительно увеличивается. Команды объединяются в 128-разрядные пучки (ЬппгПез), подобные изображенному в верхней части рис. 5.30.
В каждом пучке содержится три 41-разрядных команды и 5-разрядный шаблон. Количество пучков в группе команд не всегда выражается целым числом — в некоторых случаях группы начинаются и заканчиваются посередине пучков. Биты 41 Команда 2 Команда 0 Команда 1 Шебпсн Биты 4 10 тип операции Регистр 3 Регистр 2 Регистр 1 Предикатный регистр Группа операций Рис. Б.ЗО. Пучок е архитектуре!А-64 состоит из трех команд Существует более 100 форматов команд.
На рис. 5.30 представлен наиболее распространенный формат. В данном случае он применяется для выполнения при помощи АЛУ операции А00, которая размещает сумму двух регистров в третьем. Поле группы операций определяет общий класс команды (например, целочисленная операция АЛУ). В поле типа операции указывается конкретная операция (например, А00 или 50В). Далее следуют три поля регистра. Последнее поле данного формата — поле предикатного регистра — мы обсудим чуть позже.
Шаблон пучка указывает, какие функциональные блоки нужны для его обработки, а также определяет положение границы группы команд (если таковая предусмотрена). Основными функциональными блоками считаются целочисленные и нецелочисленные команды АЛУ, обращения к памяти, операции с плавающей точкой, ветвление и т. д. Очевидно, что при наличии 6 блоков и 3 команд для полной ортогональности требуются 216 базовых комбинаций плюс 3 х 216 дополнительных комбинаций для определения маркеров группы после команд О, 1 и 2. Поскольку доступно всего 5 бит, из всего разнообразия комбинаций допускаются лишь некоторые.
С другой стороны, если бы в состав пучка можно было включить сразу три команды с плавающей точкой, процессор просто не смог бы 466 Глава 5. Уровень архитектуры набора команд их одновременно запустить. Таким образом, допустимыми считаются фактиче- ски осуществимые комбинации. Сокращение числа условных переходов— предикация Еще одна особенность архитектуры 1А-64 — новый способ обработки условных переходов. Если бы была возможность избавиться от большинства из них, центральный процессор стал бы гораздо проще и работал бы гораздо быстрее. На первый взгляд может показаться, что устранить условные переходы невозможно, поскольку в программах всегда полно операторов 16 Однако в архитектуре 1А-64 используется специальная технология, названная предикацией (ргег(1саг1оп), которая позволяет сильно сократить их число 114, 98~.
Кратко опишем эту технологию. В нынешних машинах все команды являются безусловными в том смысле, что когда центральный процессор встречает команду, он просто ее выполняет. Здесь никогда не решается вопрос «Выполнять или не выполнять?» И напротив, в предикатной архитектуре команды содержат условия, которые сообщают, в каком случае нужно выполнять команду, а в каком — нет. Именно этот переход от безусловных команд к предикатным позволяет избавиться от многих условных переходов.
Вместо того чтобы выбирать ту или иную последовательность безусловных команд, все команды сливаются в одну последовательность предикатных команд, в которой у разных команд разные предикаты. Чтобы понять, как работает предикация, рассмотрим простой пример (листинги 5.9 — 5.11), в котором показано условное выполнение команд (условное выполнение — предтеча предикации).
В листинге 5.9 мы видим оператор 16 В листинге 5.10 после его трансляции получилось три команды: сравнения, условного перехода и перемещения. В листинге 5.11 мы избавились от условного перехода, используя новую команду СИОЧ2, которая является командой условного перемещения. Эта команда проверяет, равен ли третий регистр К1 нулю. Если да, то команда копирует ВЗ в В2. Если нет, то команда не выполняет никаких действий.
Листинг 5.9. Оператор й 1 Е ЕЙ1 01 Й2 " ЙЗ; Листинг 5.10. Код на ассемблере для листинга 5.9 СИР Й1.0 ВИЕ Е1 НОЧ й2. ЙЗ Е1 Листинг 5.11. Условная команда СНОЧ2 Й2.ЙЗ.Й1 Если у нас есть команда, которая может копировать данные, когда какой-либо регистр равен нулю, значит, у нас может быть и такая команда, которая копирует данные, если какой-нибудь регистр не равен нулю. Пусть это будет команда СИОЧЧ. При наличии обеих команд мы уже на пути к полному условному выполнению.
Представим оператор 11 с несколькими операторами присваивания в части Феп и несколькими операторами присваивания в части е1зе. Весь этот фраг- Архитектура!А-64 и процессор Иапгат 2 467 мент программы можно транслировать в код, который будет устанавливать какой-нибудь регистр на О, если условие не выполнено, и на какое-нибудь другое значение, если условие выполнено. Таким образом, присваивания в части Феп можно скомпилировать в последовательность команд СМОЧИ, а присваивания в части е1 зе — в последовательность команд СИОЧ2. Все эти команды, в том числе команды установки регистров, СМОЧИ и СИОЧ2, формируют единый основной блок без условных переходов.
Команды можно даже переупорядочить при компиляции или во время выполнения программы. Единственное требование состоит в том, чтобы условие было известно к тому моменту, когда условные команды потребуется помещать в выходные регистры (то есть где-то в конце конвейера). Простой пример фрагмента программы с операторами ФИеп и е1 зе приведен в листингах 5.12 — 5.14. Листинг 6.12. Оператор И ~ЦЙ1 01 ( Й2 ЙЗ; Й4 Й5, ) е14е ( Йб Р7. ЙВ - Й9: Листинг 6.13. Код на ассемблере дпя листинга 5.12 СИР Й1.0 ВИЕ Е1 МОН й2,ЙЗ МОЧ Й4,95 Вй 02 Е1; МОЧ Йб.Й7 МОЧ ЙВ,Й9 02; Листинг 6.14. Условное выполнение СМОЧ7 й2,ЙЗ.й1 СИОЧ2 Й4,95,91 СМОЧИ Йб,ЙЧ.Й1 СМОЧИ ЙВ.Й9.91 Мы показали только очень простые условные команды (взятые из архитектуры команд Репг(пгп 4), но в архитектуре 1А-64 все команды предикатные.