ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 6686
Скачиваний: 8
г
Процессоры 63
I работчики вправе были включать туда новые наборы команд, которые могли бы
увеличить общую производительность системы. Так как основное внимание уде-
[ лялось простым командам, которые могли быстро выполняться, разработчики вско-
ре осознали, что ключом к высокой производительности компьютера была разра-
ботка команд, к выполнению которых можно быстро приступать. Сколько времени
занимает выполнение одной команды, было не так важно, как то, сколько команд
может быть начато в секунду.
В то время как разрабатывались эти простые процессоры, всеобщее внимание
привлекало относительно небольшое количество команд (обычно их было около 50).
Для сравнения: число команд в DEC VAX и больших IBM в то время составляло
от 200 до 300. RISC — это сокращение от Reduced Instruction Set Computer —
компьютер с сокращенным набором команд. RISC противопоставлялся CISC
(Complex Instruction Set Computer — компьютер с полным набором команд).
В качестве примера CISC можно привести VAX, который доминировал в то время
в научных компьютерных центрах. На сегодняшний день мало кто считает, что
главное различие RISC и CISC состоит в количестве команд, но название со-
храняется до сих пор.
С этого момента началась грандиозная идеологическая война между сторонни-
ками RISC и разработчиками VAX, Intel и больших IBM. По их мнению, наилуч-
ший способ разработки компьютеров — включение туда небольшого количе-
ства простых команд, каждая из которых выполняется за один цикл тракта данных
(см. рис. 2.2), то есть берет два регистра, производит над ними какую-либо ариф-
метическую или логическую операцию (например, сложения или логическое И) и
помещает результат обратно в регистр. В качестве аргумента они утверждали, что
даже если RISC должна выполнять 4 или 5 команд вместо одной, которую выпол-
няет CISC, притом что команды RISC выполняются в 10 раз быстрее (поскольку
они не интерпретируются), он выигрывает в скорости. Следует также отметить,
что к этому времени скорость работы основной памяти приблизилась к скорос-
ти специальных управляющих постоянных запоминающих устройств, потому
недостатки интерпретации были налицо, что повышало популярность компью-
i теров RISC.
Учитывая преимущества производительности RISC, можно было бы предпо-
ложить, что такие компьютеры, как Alpha компании DEC, стали доминировать над
компьютерами CISC (Pentium и т. д.) на рынке. Однако ничего подобного не про-
изошло. Возникает вопрос: почему?
Во-первых, компьютеры RISC были несовместимы с другими моделями, а мно-
гие компании вложили миллиарды долларов в программное обеспечение для про-
дукции Intel. Во-вторых, как ни странно, компания Intel сумела воплотить те же
идеи в архитектуре CISC. Процессоры Intel, начиная с 486-го, содержат ядро RISC,
которое выполняет самые простые (и обычно самые распространенные) коман-
ды за один цикл тракта данных, а по обычной технологии CISC интерпретиру-
ются более сложные команды. В результате обычные команды выполняются быс-
тро, а более сложные и редкие — медленно. Хотя при таком «гибридном» подходе
работа происходит не так быстро, как у RISC, данная архитектура имеет ряд пре-
имуществ, поскольку позволяет использовать старое программное обеспечение без
изменений.
Глава 2. Организация компьютерных систем
Принципы разработки современных компьютеров
Прошло уже более двадцати лет с тех пор, как были сконструированы первые ком-
пьютеры RISC, однако некоторые принципы разработки можно перенять, учиты-
вая современное состояние технологий аппаратного обеспечения. Если происхо-
дит очень резкое изменение в технологиях (например, новый процесс производства
делает время цикла памяти в 10 раз меньше, чем время цикла центрального про-
цессора), меняются все условия. Поэтому разработчики всегда должны учитывать
возможные технологические изменения, которые могут повлиять на баланс меж-
ду компонентами компьютера.
Существует ряд принципов разработки, иногда называемых
принципами RISC,
которым по возможности стараются следовать производители универсальных про-
цессоров. Из-за некоторых внешних ограничений, например требования совмес-
тимости с другими машинами, приходится время от времени идти на компромисс,
но эти принципы — цель, к которой стремится большинство разработчиков. Ниже
мы обсудим некоторые из них.
Все команды непосредственно выполняются аппаратным обеспечением.
Все
обычные команды непосредственно выполняются аппаратным обеспечением. Они
не интерпретируются микрокомандами. Устранение уровня интерпретации обес-
печивает высокую скорость выполнения большинства команд. В компьютерах типа
CISC более сложные команды могут разбиваться на несколько частей, которые
затем выполняются как последовательность микрокоманд. Эта дополнительная
операция снижает скорость работы машины, но она может быть применима для
редко встречающихся команд.
Компьютер должен начинать выполнение большого числа команд.
В совре-
менных компьютерах используется много различных способов для увеличения
производительности, главное из которых — возможность обращаться к как можно
большему количеству команд в секунду. Процессор 500-MIPS способен присту-
пать к выполнению 500 млн команд в секунду, и при этом не имеет значения, сколь-
ко времени занимает само выполнение этих команд
(MIPS
— это сокращение от
Millions of Instructions Per Second — «миллионы команд в секунду».)
Этот прин-
цип предполагает, что параллелизм может играть главную роль в улучшении про-
изводительности, поскольку приступать к большому количеству команд за корот-
кий промежуток времени можно только в том случае, если одновременно может
выполняться несколько команд.
Хотя команды некоторой программы всегда расположены в определенном по-
рядке, компьютер может приступать к их выполнению и в другом порядке (так как
необходимые ресурсы памяти могут быть заняты) и, кроме того, может заканчи-
вать их выполнение не в том порядке, в котором они расположены в программе.
Конечно, если команда 1 устанавливает регистр, а команда 2 использует этот ре-
гистр, нужно действовать с особой осторожностью, чтобы команда 2 не считывала
регистр до тех пор, пока он не будет содержать нужное значение. Чтобы не допус-
тить подобных ошибок, необходимо вводить большое количество соответствую-
щих записей в память, но производительность все равно становится выше благо-
даря возможности выполнять несколько команд одновременно.
Процессоры 65
Команды должны легко
декодироваться.
Предел количества вызываемых ко-
манд в секунду зависит от процесса декодирования отдельных команд. Декодиро-
вание команд осуществляется для того, чтобы определить, какие ресурсы им необ-
ходимы и какие действия нужно выполнить. Полезны любые средства, которые
способствуют упрощению этого процесса. Например, используются регулярные
команды с фиксированной длиной и с небольшим количеством полей. Чем мень-
ше разных форматов команд, тем лучше.
К памяти должны
обращаться только команды загрузки и сохранения.
Один
из самых простых способов разбивания операций на отдельные шаги — потребо-
вать, чтобы операнды для большинства команд брались из регистров и возвраща-
лись туда же. Операция перемещения операндов из памяти в регистры может
осуществляться в разных командах. Поскольку доступ к памяти занимает много
времени, а подобная задержка нежелательна, работу этих команд могут выполнять
другие команды, если они не делают ничего, кроме передвижения операндов меж-
ду регистрами и памятью. Из этого наблюдения следует, что к памяти должны об-
ращаться только команды загрузки и сохранения (LOAD и STORE).
Должно быть большое количество регистров.
Поскольку доступ к памяти про-
исходит довольно медленно, в компьютере должно быть много регистров (по край-
ней мере 32). Если слово однажды вызвано из памяти, при наличии большого чис-
ла регистров оно может содержаться в регистре до тех пор, пока будет не нужно.
Возвращение слова из регистра в память и новая загрузка этого же слова в регистр
нежелательны. Лучший способ избежать излишних перемещений — наличие до-
статочного количества регистров.
Параллелизм на уровне команд
Разработчики компьютеров стремятся к тому, чтобы улучшить производительность
машин, над которыми они работают. Один из способов заставить процессоры рабо-
тать быстрее — увеличение их скорости, однако при этом существуют некоторые
технологические ограничения, связанные с конкретным историческим периодом.
Поэтому большинство разработчиков для достижения лучшей производительнос-
ти при данной скорости работы процессора используют параллелизм (возможность
выполнять две или более операций одновременно).
Существует две основные формы параллелизма: параллелизм на уровне команд
и параллелизм на уровне процессоров. В первом случае параллелизм осуществля-
ется в пределах отдельных команд и обеспечивает выполнение большого количе-
ства команд в секунду. Во втором случае над одной задачей работают одновремен-
но несколько процессоров. Каждый подход имеет свои преимущества. В этом
разделе мы рассмотрим параллелизм на уровне команд, а в следующем — паралле-
лизм на уровне процессоров.
Конвейеры
Уже много лет известно, что главным препятствием высокой скорости выполне-
ния команд является их вызов из памяти. Для разрешения этой проблемы разра-
ботчики придумали средство для вызова команд из памяти заранее, чтобы они
66
Глава 2. Организация компьютерных систем
имелись в наличии в тот момент, когда будут необходимы. Эги команды помеща-
лись в набор регистров, который назывался
буфером выборки с упреждением.
Таким образом, когда была нужна определенная команда, она вызывалась прямо
из буфера, и не нужно было ждать, пока она считается из памяти. Эта идея исполь-
зовалась еще при разработке IBM Stretch, который был сконструирован в 1959 году.
В действительности процесс выборки с упреждением подразделяет выполне-
ние команды на два этапа: вызов и собственно выполнение. Идея
конвейера
еще
больше продвинула эту стратегию вперед. Теперь команда подразделялась уже не
на два, а на несколько этапов, каждый из которых выполнялся определенной час-
тью аппаратного обеспечения, причем все эти части могли работать параллельно.
На рис. 2.3,
а
изображен конвейер из 5 блоков, которые называются стадиями.
Стадия С1 вызывает команду из памяти и помещает ее в буфер, где она хранится
до тех пор, пока не будет нужна. Стадия С2 декодирует эту команду, определяя ее
тип и тип операндов, над которыми она будет производить определенные действия.
Стадия СЗ определяет местонахождение операндов и вызывает их или из регистров,
или из памяти. Стадия С4 выполняет команду, обычно путем провода операндов
через тракт данных (см. рис. 2.2). И наконец, стадия С5 записывает результат обрат-
но в нужный регистр.
С1
Блок
выборки
команд
С2
Блок
декодирования
СЗ
Блок
выборки
операндов
С4
Блок
выполнения
команд
С5
Блок
возврата
С1
С2
СЗ
С4
С5
3 4
Время
Рис. 2.3. Конвейер из 5 стадий (а); состояние каждой стадии в зависимости
от количества пройденных циклов (б). Показано 9 циклов
На рис. 2.3,
б
мы видим, как действует конвейер во времени. Во время цикла 1
стадия С1 работает над командой 1, вызывая ее из памяти. Во время цикла 2 ста-
дия С2 декодирует команду 1, в то время как стадия С1 вызывает из памяти коман-
ду 2. Во время цикла 3 стадия СЗ вызывает операнды для команды 1, стадия С2
декодирует команду 2, а стадия С1 вызывает третью команду. Во время цикла 4
стадия С4 выполняет команду 1, СЗ вызывает операнды для команды 2, С2 деко-
дирует команду 3, а С1 вызывает команду 4. Наконец, во время пятого цикла С5
записывает результат выполнения команды 1 обратно в регистр, тогда как другие
стадии работают над следующими командами.
Процессоры 67
Чтобы лучше понять принципы работы конвейера, рассмотрим аналогичный
пример. Представим себе кондитерскую фабрику» на которой выпечка тортов и их
упаковка для отправки производятся раздельно. Предположим, что в отделе от-
правки находится длинный конвейер, вдоль которого стоят 5 рабочих (или блоков
обработки). Каждые 10 секунд (это время цикла) первый рабочий ставит пустую
коробку для торта на ленту конвейера. Эта коробка отправляется ко второму рабо-
чему, который кладет в нее торт. После этого коробка с тортом доставляется третье-
му рабочему, который закрывает и запечатывает ее. Затем она поступает к чет-
вертому рабочему, который ставит на ней ярлык. Наконец, пятый рабочий снимает
коробку с конвейерной ленты и помещает ее в большой контейнер для отправки
в супермаркет. Примерно таким же образом действует компьютерный конвейер:
каждая команда (в случае с кондитерской фабрикой — торт) перед окончатель-
ным выполнением проходит несколько шагов обработки.
Возвратимся к нашему конвейеру, изображенному на рис. 2.3. Предположим,
что время цикла у этой машины 2 не. Тогда для того, чтобы одна команда прошла
через весь конвейер, требуется 10 не. На первый взгляд может показаться, что
такой компьютер может выполнять 100 млн команд в секунду, в действительно-
сти же скорость его работы гораздо выше. Во время каждого цикла (2 не) завер-
шается выполнение одной новой команды, поэтому машина выполняет не 100 млн,
а 500 млн команд в секунду.
Конвейеры позволяют найти компромисс между
временем ожидания
(сколь-
ко времени занимает выполнение одной команды) и
пропускной способностью
процессора
(сколько миллионов команд в секунду выполняет процессор). Если
время цикла составляет Т не, а конвейер содержит п стадий, то время ожидания
составит пТ не, а пропускная способность — 1000/Т млн команд в секунду.
Суперскалярные архитектуры
Один конвейер — хорошо, а два — еще лучше. Одна из возможных схем процессо-
ра с двойным конвейером показана на рис. 2.4. В основе разработки лежит конвей-
ер, изображенный на рис. 2.3. Здесь общий отдел вызова команд берет из памяти
сразу по две команды и помешает каждую из них в один из конвейеров. Каждый
конвейер содержит АЛУ для параллельных операций. Чтобы выполняться парал-
лельно, две команды не должны конфликтовать при использовании ресурсов (на-
пример, регистров), и ни одна из них не должна зависеть от результата выполне-
ния другой. Как и в случае с одним конвейером, либо компилятор должен следить,
чтобы не возникало неприятных ситуаций (например, когда аппаратное обеспече-
ние выдает некорректные результаты, если команды несовместимы), либо же кон-
фликты выявляются и устраняются прямо во время выполнения команд благода-
ря использованию дополнительного аппаратного обеспечения.
Сначала конвейеры (как двойные, так и одинарные) использовались только
в компьютерах RISC. У 386-го и его предшественников их не было. Конвейеры в про-
цессорах компании Intel появились только начиная с 486-й модели
1
.486-й процес-
Необходимо отметить, что параллельное функционирование отдельных блоков процессора исполь-
зовалось и в предыдущем — 386-м — микропроцессоре. Оно стало прообрщом 5-стадийного конвейера
микропроцессора 486. —
Примеч. научи ред.