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

428
Глава 5. Уровень архитектуры команд
в конце конвейера). Простой пример куска программы с then и el se приведен в лис-
тингах 5.13-5.15.
Листинг 5.13.
Оператор if
if(Rl=0) {
R2=R3;
R4=R5;
} else {
R6=R7:
R8=R9:
}
Листинг 5.14.
Код на ассемблере для листинга 5.13
CMP R1.0
BNE L1
MOV R2.R3
MOV R4.R5
BR L2
LI: MOV R6.R7
MOV R8.R9
L2:
Л и с т и н г 5 . 1 5 .
Условное выполнение
CMOVZ R2.R3.R1
CMOVZ R4.R5.R1
CMOVN R6.R7.R1
CMOVN R8.R9.R1
Мы показали только очень простые условные команды (взятые из Pentium II),
но в архитектуре IA-64 все команды предикатны. Это значит, что выполнение каж-
дой команды можно сделать условным. Дополнительное 6-битное поле, о котором
мы упомянули выше, выбирает один из 64 1-битных предикатных регистров. Сле-
довательно, оператор i f может быть скомпилирован в код, который устанавливает
один из предикатных регистров на 1, если условие истинно, и на 0, если условие
ложно. Одновременно с этим данное поле автоматически устанавливает другой
предикатный регистр на обратное значение. При использовании предикации
машинные команды, которые формируют операторы then и el se, будут сливаться
в единый поток команд, первый из них — с использованием предиката, а второй —
с использованием его обратного значения.
Листинги 5.16-5.18 показывают, как можно использовать предикацию для
устранения переходов. Команда CMPEQ сравнивает два регистра и устанавливает
предикатный регистр Р4 на 1, если они равны, и на 0, если они не равны. Кроме
того, команда устанавливает парный регистр, например Р5, на обратное условие.
Теперь команды частей i f и then можно поместить одну за другой, причем каждая
из них связывается с каким-нибудь предикатным регистром (регистр указывается
в угловых скобках). Сюда можно поместить любой код, при условии что каждая
команда предсказывается правильно.
Листинг 5.16.
Оператор if
if(Rl==R2)
R3=R4+R5:
Else
R6=R4-R5

Intel IA-64
429
Листинг 5.17.
Код на ассемблере для листинга 5.16
CMP R1.R2
BNE L1
MOV R3.R4
ADD R3.R5
BR L2
LI: MOV R6.R4
SUB R6.R5
L2:
Листинг 5.18.
Выполнение с предикацией
CMPEQ R1.R2.P4
<Р4> ADD R3.R4.R5
<Р5> SUB R6.R4.R5
В архитектуре IA-64 эта идея доведена до логического конца: здесь с предикат-
ными регистрами связаны и команды сравнения, и арифметические команды, а
также некоторые другие команды, выполнение которых зависит от какого-либо
предикатного регистра. Команды с предикацией могут помещаться в конвейер по-
следовательно без каких-либо проблем и простаиваний. Поэтому они очень полезны.
В архитектуре IA-64 предикация происходит следующим образом. Каждая ко-
манда действительно выполняется, и в самом конце конвейера, когда уже нужно
сохранять результат в выходной регистр, производится проверка, истинно ли пред-
сказание. Если да, то результаты просто записываются в выходной регистр. Если
предсказание ложно, то записи в выходной регистр не происходит. Подробно о пре-
дикации вы можете прочитать в книге [34].
Спекулятивная загрузка
Еще одна особенность IA-64 — наличие спекулятивной загрузки. Если команда
LOAD спекулятивна и оказывается ложной, то вместо того чтобы вызвать исключе-
ние (exception), она просто останавливается и сообщает, что регистр, с которым
она связана, недействителен. Если этот регистр будет использоваться позднее, то
произойдет исключение (exception).
Компилятор должен перемещать команды LOAD в более ранние позиции относи-
тельно других команд с тем, чтобы они выполнялись еще до того, как они понадо-
бятся. Поскольку выполнение этих команд начинается раньше, чем нужно, они
могут завершиться еще до того, как потребуются результаты. Компилятор встав-
ляет команду CHECK в том месте, где ему нужно получить значение определенного
регистра. Если значение там уже есть, команда CHECK работает как NOP, и выполне-
ние программы сразу продолжается дальше. Если значения в регистре еще нет,
следующая команда должна простаивать.
Итак, машина с архитектурой IA-64 имеет несколько источников повышения
скорости. Во-первых, это современная конвейеризированная трехадресная маши-
на RISC типа загрузка/сохранение. Во-вторых, компилятор определяет, какие ко-
манды могут выполняться одновременно, не вступая в конфликт, и группирует
эти команды в пучки. Таким образом, процессор может просто распределять пучок,
не совершая никаких проверок. В-третьих, предикация позволяет сливать команды
обоих переходов от оператора if, устраняя при этом условный переход, а также и
само прогнозирование этого перехода. Наконец, спекулятивная загрузка позволя-

4 3 0 Глава 5. Уровень архитектуры команд
ет вызывать операнды заранее, и даже если позднее окажется, что эти операнды не
нужны, ничего страшного не произойдет.
Проверка в реальных условиях
Если все эти нововведения функционируют, процессор Merced действительно бу-
дет чрезвычайно мощным. Однако здесь нужно высказать несколько предостере-
жений. Во-первых, такая продвинутая машина никогда не создавалась раньше.
История показывает, что грандиозные планы часто не удается осуществить по
самым разным причинам.
Во-вторых, придется составлять компиляторы для IA-64. А составление хоро-
шего компилятора для IA-64 — дело очень сложное. Кроме того, многочисленные
исследования в параллельном программировании, проведенные за последние 30 лет,
оказались не очень успешными. Если в программе есть какой-то параллелизм или
если компилятор не может извлечь его, все пучки команд в архитектуре IA-64 будут
короткими, а от этого большого увеличения производительности не произойдет.
В-третьих, для реализации этой идеи должна существовать полностью 64-бит-
ная операционная система. Windows 95 и Windows 98 такими системами не явля-
ются и вряд ли когда-нибудь будут. Это значит, что всем придется перейти на
Windows NT или UNIX, и такой переход не будет безболезненным. Спустя 10 лет
с момента появления 32-битного процессора 386 система Windows 95 все еще со-
держала множество 16-битных команд и никогда не использовала аппаратное обес-
печение с сегментацией, которое около 10 лет включается во все процессоры Intel
(сегментацию мы будем обсуждать в главе 6). Сколько времени потребуется на то,
чтобы операционные системы стали полностью 64-битными, никто не знает.
В-четвертых, многие будут судить об архитектуре IA-64 по тому, как на ней
будут работать старые 16-битные игры MS DOS. Когда появился Pentium Pro, он не
пользовался особенным успехом, поскольку старые 16-битные программы работали
на нем с такой же скоростью, как и на обычной машине Pentium. Поскольку старые
16-битные (и 32-битные) программы не будут использовать новые особенности
процессоров IA-64, никакие предикатные регистры им не помогут. Людям придется
приобретать средства наращивания для своего программного обеспечения, подхо-
дящие для новых компиляторов типа IA-64. Многие из них будут очень дорогими.
Наконец, другие производители (включая Intel) могут выпустить альтернатив-
ные варианты, которые будут давать высокую производительность, используя при
этом более привычные архитектуры RISC, возможно, с большим количеством
условных команд. Более высокоскоростные версии Pentium II также будут серьез-
ным соперником для IA-64. Вероятно, пройдет очень много лет, прежде чем IA-64
будет доминировать на компьютерном рынке, подобно архитектуре IA-32.
Краткое содержание главы
Для большинства людей уровень архитектуры команд — это «машинный язык».
На этом уровне машина имеет память с байтовой организацией или с пословной

Вопросы и задания 431
организацией, состоящую из нескольких десятков мегабайтов и содержащую такие
команды, как MOVE, ADD и BEQ.
В большинстве современных компьютеров память организована в виде по-
следовательности байтов, при этом 4 или 8 байтов группируются в слова. Обычно
в машине имеется от 8 до 32 регистров, каждый из которых содержит одно слово.
Команды обычно имеют 1,2 или 3 операнда, обращение к которым происходит
с помощью различных способов адресации: непосредственной, прямой, регистро-
вой, индексной и т. д. Команды обычно могут перемещать данные, выполнять унар-
ные и бинарные операции (в том числе арифметические и логические), совершать
переходы, вызывать процедуры, осуществлять циклы, а иногда и выполнять не-
которые операции ввода-вывода. Типичные команды перемещают слово из памяти
в регистр или наоборот, складывают, вычитают, умножают или делят два регистра
или регистр и слово из памяти, или сравнивают два значения в регистрах или па-
мяти. Обычно в компьютере содержится не более 200 команд.
Для осуществления передачи управления на втором уровне используется ряд
элементарных действий: переходы, вызовы процедур, вызовы сопрограмм, ловуш-
ки и прерывания. Переходы нужны для того, чтобы остановить одну последова-
тельность команд и начать новую. Процедуры нужны для того, чтобы изолировать
какой-то блок программы, который можно вызывать из различных мест этой же
программы. Сопрограммы позволяют двум потокам управления работать одновре-
менно. Ловушки используются для сообщения об исключительных ситуациях (на-
пример, о переполнении). Прерывания позволяют осуществлять процесс ввода-
вывода параллельно с основным вычислением, при этом центральный процессор
получает сигнал, как только ввод-вывод завершен.
Задачу «Ханойская башня» можно решить с использованием рекурсии.
Наконец, архитектура IA-64 использует модель вычисления EPIC. Для повы-
шения скорости работы в этой архитектуре предусмотрены предикация и спеку-
лятивная загрузка. IA-64 может иметь значительное преимущество над Pentium II,
но она возлагает на компилятор огромное бремя параллелизма.
Вопросы и задания
1. В Pentium II команды могут содержать любое число байтов, даже нечетное.
В UltraSPARC II все команды содержат четное число байтов. В чем преиму-
щество системы Pentium II?
2. Разработайте расширенный код операций, который позволяет закодировать
в 36-битной команде следующее:
• 7 команд с двумя 32-битными адресами и номером одного 3-битного
регистра;
• 500 команд с одним 15-битным адресом и номером одного 3-битного
регистра;
• 50 команд без адресов и регистров.

4 3 2 Глава 5. Уровень архитектуры команд
3. Можно ли разработать такой расширенный код операций, который позво-
лял бы кодировать в 12-битной команде следующее:
• 4 команды с тремя регистрами;
• 255 команд с одним регистром;
• 16 команд без регистров.
(Размер регистра составляет 3 бита.)
4. В некоторой машине имеются 16-битные команды и 6-битные адреса. Одни
команды содержат один адрес, другие — два. Если существует п двухадрес-
ных команд, то каково максимальное число одноадресных команд?
5. Имеется одноадресная машина с регистром-аккумулятором. Ниже приве-
дены значения некоторых слов в памяти:
• слово 20 содержит число 40;
+ слово 30 содержит число 50;
• слово 40 содержит число 60;
• слово 50 содержит число 70.
Какие значения следующие команды загрузят в регистр-аккумулятор?
• LOAD IMMEDIATE 20
• LOAD DIRECT 20
• LOAD INDIRECT 20
• LOAD IMMEDIATE 30
• LOAD DIRECT 30
• LOAD INDIRECT 30.
6. Для каждого из четырех видов машин — безадресной, одноадресной, двух-
адресной и трехадресной — напишите программу вычисления следующего
выражения:
X=(A+BxC)/(D-ExF).
7. В наличии имеются следующие команды:
• безадресные:
PUSH М
POP М
ADD
SUB
MUL
DIV
• одноадресные:
LOAD M
STORE M
ADD M