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

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

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

Добавлен: 24.12.2021

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

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

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

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


background image

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, устраняя при этом условный переход, а также и
само прогнозирование этого перехода. Наконец, спекулятивная загрузка позволя-


background image

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.

Краткое содержание главы

Для большинства людей уровень архитектуры команд — это «машинный язык».

На этом уровне машина имеет память с байтовой организацией или с пословной


background image

Вопросы и задания 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 команд без адресов и регистров.


background image

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