ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12163
Скачиваний: 10

Intel IA-64 423
щие 11 команд связывают две цепочки и два целых числа в одну цепочку в этом
буфере и передают ее в println для вывода на экран.
Если п не равно 1, управление передается к L1. Переменная к вычисляется про-
стым путем с использованием арифметических операций над числами в стеке.
Затем совершаются три вызова один за другим.
Машина IJVM содержит ряд команд для вызова процедур. В данном случае
компилятор использовал три разные команды. Все они содержат 2-байтный опе-
ранд, который индексирует набор констант, чтобы найти указатель на дескриптор,
сообщающий все о вызываемой процедуре. Константы #10, #11 и т. д. — индексы
в наборе констант.
Наличие нескольких типов команд для вызова процедур связано с оптими-
зацией. Команда INVOKESTATIC используется для вызова статических процедур,
например towers. Команда INVOKESPECIAL применяется для вызова процедур
инициализации, нестандартных процедур и процедур надкласса текущего класса.
Наконец, команда IN
VOKEV
I
RTUAL
используется для внутренних (библиотечных)
вызовов.
Intel IA-64
Со временем увеличивать скорость работы IA-32 становилось все сложнее и слож-
нее. Единственным возможным решением этой проблемы стала разработка совер-
шенно новой архитектуры команд. Новая архитектура, которая разрабатывалась
совместно компаниями Intel и Hewlett Packard, получила название
IA-64.
Это пол-
ностью 64-битная машина от начала до конца. Появление полной серии процессо-
ров, в которых реализуется эта архитектура, ожидается в ближайшие годы. Самым
первым процессором этого типа был процессор
Merced
с высокой производитель-
ностью, хотя в будущем наверняка появится полный спектр процессоров разного
уровня.
Поскольку все, что делает компания Intel, очень важно для компьютерной про-
мышленности, мы подробно рассмотрим архитектуру IA-64. Однако ключевые идеи
этой архитектуры уже очень хорошо известны многим исследователям, поэтому
они могут отражаться в других разработках. Вообще, некоторые из них уже реали-
зованы в разных формах в экспериментальных системах. В следующих разделах
мы изложим, с какой проблемой столкнулась компания Intel, каким образом архи-
тектура IA-64 помогла справиться с этой проблемой и как работают ключевые идеи
этого проекта.
Проблема с Pentium II
Основная проблема заключалась в том, что IA-32 — это старая архитектура ко-
манд с совершенно не подходящими для современной техники свойствами. Это
архитектура CISC с командами разной длины и огромным количеством различ-
ных форматов, которые трудно декодировать быстро и на лету. Современная
техника лучше всего работает с архитектурами команд RISC с командами одной

4 2 4 Глава 5. Уровень архитектуры команд
длины и с кодом операции фиксированной длины, который легко декодировать.
Команды IA-32 можно разбить на микрооперации типа RISC во время выполне-
ния программы, но для этого требуется дополнительное аппаратное обеспечение
(пространство на микросхеме), что занимает время и усложняет разработку. Это
первый недостаток.
IA-32 — это архитектура, которая ориентирована на двухадресные команды.
В настоящее время популярны архитектуры команд типа загрузка/сохранение,
где обращение к памяти совершается только в тех случаях, когда нужно поместить
операнды в регистры, а все вычисления выполняются с использованием трехад-
ресных регистровых команд. Поскольку скорость работы процессора растет гораз-
до быстрее, чем скорость работы памяти, положение дел с IA-32 со временем все
больше ухудшается. Это второй недостаток.
Архитектура IA-32 содержит небольшой и нерегулярный набор регистров. Из-за
столь малого числа регистров общего назначения (четыре или шесть, в зависимос-
ти от того, как считать ESI и EDI) постоянно нужно записывать в память проме-
жуточные результаты, и поэтому приходится делать дополнительные обращения
к памяти, даже когда они по логике вещей не нужны. Это третий недостаток.
Из-за недостаточного числа регистров возникает множество ситуаций зависи-
мостей, особенно WAR-зависимостей, поскольку промежуточные результаты нуж-
но куда-то поместить, а дополнительных регистров нет. При недостатке регистров
требуется переименование регистров в скрытые регистры. Во избежание слиш-
ком частых промахов кэш-памяти команды приходится выполнять не по порядку.
Однако семантика архитектуры IA-32 определяет точные прерывания, поэтому ко-
манды, выполняемые не по порядку, должны записывать результаты в выходные
регистры в строгом порядке. Для всего этого требуется очень сложное аппаратное
обеспечение. Это четвертый недостаток.
Чтобы скорость работы была высокой, нужна сильно конвейеризированная
система (12 стадий). Однако это значит, что для выполнения команды потребует-
ся 11 циклов. Следовательно, становится существенным точное предсказание пе-
реходов, поскольку в конвейер должны попадать только нужные команды. Но даже
при низком проценте неправильных предсказаний существенно снижается произ-
водительность. Это пятый недостаток.
Чтобы избежать проблем с неправильным прогнозированием переходов, про-
цессору приходится осуществлять спекулятивное выполнение команд со всеми
вытекающими отсюда последствиями. Это шестой недостаток.
Мы не будем перечислять недостатки дальше, поскольку уже сейчас ясно, что
за ними кроется реальная проблема. И мы еще не упомянули, что 32-битные адре-
са архитектуры IA-32 ограничивают размер отдельных программ до 4 Гбайт, а это
требование очень сложно выполнять на дорогостоящих серверах с высокой произ-
водительностью.
Ситуации с IA-32 можно сравнить с положением в небесной механике как раз
перед появлением Коперника. В те времена в астрономии доминировала теория,
что Земля является центром Вселенной и неподвижна, а планеты движутся вокруг
нее. Однако новые наблюдения показывали все больше и больше несоответствий
этой теории действительности, и в конце концов теория полностью разрушилась.

Intel IA-64 425
Компания Intel находится приблизительно в таком же положении. Огромное
количество транзисторов в процессоре Pentium II предназначено для переделыва-
ния команд CISC в команды RISC, разрешения конфликтов, прогнозирования пере-
ходов, исправления неправильных предсказаний и решения многих других задач
подобного рода, оставляя лишь незначительное число транзисторов на долю
реальной работы, которая нужна пользователю. Поэтому компания Intel пришла
к следующему выводу: нужно выбросить IA-32 и начать все заново (IA-64).
Модель IA-64: открытое параллельное
выполнение команд
Первой реализацией архитектуры IA-32 был 64-битный процессор RISC (один из
примеров этого процессора — UltraSPARC II). Поскольку архитектура IA-64 была
разработана совместно с компанией Hewlett Packard, в ее основу, несомненно, лег-
ла архитектура PA-RISC. Merced — это двухрежимный процессор, который может
выполнять и программы IA-32, и программы IA-64, но мы будем говорить только
об архитектуре IA-64.
Архитектура IA-64 — это архитектура типа загрузка/сохранение с 64-битными
адресами и 64-битными регистрами. Здесь имеется 64 регистра общего назначе-
ния, доступных для программ IA-64 (и дополнительные регистры для программ
IA-32). Все команды имеют фиксированный формат: код операции, два 6-битных
поля для указания входных регистров, одно 6-битное поле для указания выходно-
го регистра и еще одно 6-битное поле, которое мы обсудим позже. Большинство
команд берут два регистровых операнда, выполняют над ними какую-нибудь опе-
рацию и помещают результат в выходной регистр. Для параллельного выполне-
ния различных операций существует много функциональных блоков. Как видим,
пока ничего необычного в этой архитектуре нет. Большинство RISC-процессоров
имеют сходную архитектуру.
А необычной здесь является идея о
пучке
связанных команд. Команды посту-
пают группами по три штуки (рис. 5.31). Каждая такая группа называется пучком.
Каждый 128-битный пучок содержит три 40-битные команды фиксированного
формата и 8-битный шаблон. Пучки могут быть связаны вместе (при этом ис-
пользуется бит конца пучка), поэтому в одном пучке может присутствовать более
трех команд. Формат содержит информацию о том, какие команды могут выпол-
няться параллельно. При такой системе и при наличии большого числа регистров
компилятор может выделять блоки команд и сообщать процессору, что эти коман-
ды можно выполнять параллельно. Таким образом, компилятор должен переупо-
рядочивать команды, проверять, нет ли взаимозависимостей, проверять доступ-
ность функциональных блоков и т. д. вместо аппаратного обеспечения. Основная
идея состоит в том, что работа упорядочивания и распределения команд RISC пере-
дается от аппаратного обеспечения компилятору. Именно поэтому эта технология
называется
EPIC (Explicitly Parallel Instruction Computing — технология парал-
лельной обработки команд с явным параллелизмом).

4 2 6 Глава 5. Уровень архитектуры команд
Команда 1
Команда 2
Команда 3
Шаблон
Команда 1
Команда 2
Команда 3
Шаблон
Команда 1
Команда 2
Команда 3
Шаблон
Команды
можно
связать
вместе
R1
R2
R3
Регистр
предиката
Рис. 5 . 3 1
. Архитектура IA-64 основана на пучках из трех команд
Есть несколько причин, по которым следует совершать упорядочивание команд
во время компиляции. Во-первых, поскольку теперь всю работу выполняет ком-
пилятор, аппаратное обеспечение можно сильно упростить, используя миллионы
транзисторов для других полезных функций (например, можно увеличить кэш-
память первого уровня). Во-вторых, для любой программы распределение должно
производиться только один раз (во время компиляции). В-третьих, поскольку ком-
пилятор теперь выполняет всю работу, у поставщика программного обеспечения
появится возможность использовать компилятор, который часами оптимизирует
свою программу.
Идея пучков команд может быть использована при создании целого семейства
процессоров. Процессоры с низкой производительностью могут запускать по од-
ному пучку за цикл. Перед тем как выпустить новый пучок, центральный процес-
сор должен дождаться завершения всех команд. Процессоры с высокой произво-
дительностью способны запускать несколько пучков за один цикл (по аналогии
с современными суперскалярными процессорами). Кроме того, процессор с высо-
кой производительностью может начать запускать команды из нового пучка еще
до того, как закончится выполнение всех команд предыдущего пучка. Естествен-
но, нужно все время проверять, доступны ли нужные регистры и функциональные
блоки, но зато вовсе не надо проверять, не будут ли конфликтовать разные коман-
ды одного пучка, поскольку компилятор гарантирует, что этого не произойдет.
Предикация
Еще одна особенность архитектуры IA-64 — новый способ обработки условных
переходов. Если бы была возможность избавиться от большинства из них, цент-
ральный процессор стал бы гораздо проще и работал бы гораздо быстрее. На пер-
вый взгляд может показаться, что устранить условные переходы невозможно, по-
скольку в программах всегда полно операторов if. Однако в архитектуре IA-64
используется специальная технология, названная
предикацией
1
,
которая позво-
ляет сильно сократить их число [10,63]. Ниже мы кратко опишем эту технологию.
От англ. predicate — утверждение, предикат. —
Примеч. научн.ред.

Intel IA-64
427
В современных машинах все команды являются безусловными в том смысле,
что когда центральный процессор натыкается на команду, он просто ее выполняет.
Здесь никогда не решается вопрос: «Выполнять или не выполнять?» Напротив,
в архитектуре с предикацией команды содержат условия, которые сообщают, в каком
случае нужно выполнять команду, а в каком — нет. Именно этот сдвиг от безуслов-
ных команд к командам с предикацией позволяет избавиться от многих условных
переходов. Вместо того чтобы выбирать ту или иную последовательность без-
условных команд, все команды сливаются в одну последовательность команд с пре-
дикацией, используя разные предикаты для различных команд.
Чтобы понять, как работает предикация, рассмотрим простой пример (лис-
тинги 5.10-5.12), в котором показано
условное выполнение
команд (условное вы-
полнение — предтеча предикации). В листинге 5.10 мы видим оператор if. В листин-
ге 5.11 мы видим трансляцию этого оператора в три команды: команду сравнения,
команду условного перехода и команду перемещения.
Листинг 5.10.
Оператор if
if (Rl=0)
R2=R3:
Листинг 5 . 1 1 .
Код на ассемблере для листинга 5.10
CMP R1.0
BNE L1
MOV R2.R3
L1:
Листинг 5.12.
Условная команда
CMOVZ R2.R3.R1
В листинге 5.12 мы избавились от условного перехода, используя новую ко-
манду CMOVZ, которая является условным перемещением. Эта команда проверяет,
равен ли третий регистр R1 нулю. Если да, то команда копирует R3 в R2. Если нет,
то команда не выполняет никаких действий.
Если у нас есть команда, которая может копировать данные, когда какой-либо
регистр равен нулю, значит, у нас может быть и такая команда, которая копирует
данные, если какой-нибудь регистр не равен нулю. Пусть это будет команда
CMOVN.
При наличии обеих команд мы уже на пути к полному условному выполнению.
Представим оператор if с несколькими присваиваниями в части then и нескольки-
ми присваиваниями в части el se. Весь этот кусок программы можно транслиро-
вать в код, который будет устанавливать какой-нибудь регистр на 0, если условие
не выполнено, и на какое-нибудь другое значение, если условие выполнено. Сле-
дуя установке регистров, присваивания в части then можно скомпилировать в по-
следовательность команд CMOVN, а присваивания в части el se — в последователь-
ность команд CMOVZ.
Все эти команды, регистровая установка, CNOVN и CMOVZ формируют единый
основной блок без условных переходов. Команды можно даже переупорядочить
при компиляции или во время выполнения программы. Единственное требова-
ние при этом состоит в том, чтобы условие было известно к тому моменту, ко-
гда условные команды уже нужно помещать в выходные регистры (то есть где-то