Архитектуры с полным и сокращенным набором команд 4 4 7
Архитектуры с полным и сокращенным набором команд
Современная технология программирования ориентирована на языки высокого уровня (ЯВУ), главная задача которых — облегчить процесс написания программ. Более 90% всего процесса программирования осуществляют на ЯВУ. К сожале­нию, операции, характерные для ЯВУ, отличаются от операций, реализуемых ма­шинными командами. Эта проблема получила название семантического разрыв а и ведет она к недостаточно эффективному выполнению программ. Пытаясь преодо­леть семантический разрыв, разработчики ВМ расширяют систему команд, допол­няя ее командами, реализующими сложные операторы ЯВУ на аппаратурном уров­не, вводят дополнительные виды адресации и т. п. Вычислительные машины, где реализованы эти средства, принято называть ВМ с полным набором команд (CISC — Complex Instruction Set Computer). Ктипу CISC можно отнести практически все ВМ, выпускавшиеся до середины 80-х годов и значительную часть из выпускае­мых в настоящее время.
Характерные для CISC способы решения проблемы семантического разрыва, вместе с тем ведут к усложнению архитектуры ВМ, главным образом устройства управления, что, в свою очередь, негативно сказывается на производительности в целом. Кроме того, в CISC очень сложно организовать эффективный конвейер команд, который, как уже отмечалось, является одним из наиболее перспектив­ных путей повышения производительности ВМ. Все это заставило более внима­тельно проанализировать программы, получаемые после компиляции с ЯВУ. Был предпринят комплекс исследований [128,158,177,178,209], в результате которых обнаружились интересные закономерности:
-  Реализация сложных команд, эквивалентных операторам ЯВУ, требует увели­чения емкости управляющей памяти в микропрограммном УУ. Микропрограм-как их доля в общем объеме программы зачастую не превышает 0,2%.
-  В откомпилированной программе операторы ЯВУ реализуются в виде проце­дур (подпрограмм), поэтому на операции вызова процедуры и возврата из нее приходится от 15 до 45% вычислительной нагрузки.
-  При вызове процедуры вызывающая программа передает этой процедуре неко­торое количество аргументов. Согласно [209], в 98% случаев число передавае­мых аргументов не превышает шести. Примерно такое же положение сложи­лось и с параметрами, которые процедура возвращает вызывающей программе. Более 80% переменных, используемых программой [177,178], являются локаль­ными, то есть создаются при входе в процедуру и уничтожаются при выходе из нее. Количество локальных переменных, создаваемых отдельной процедурой, в 92% случаев не превышает шести [209].
-  Почти половину операций в ходе вычислений составляет операция присваива-
ния, сводящаяся к пересылке данных между регистрами, ячейками памяти или регистрами и памятью.
4 4 8 Глава 9. Основные направления в архитектуре процессоров
Детальный анализ результатов исследований привел к серьезному пересмотру традиционных архитектурных решений, следствием чего стало появление арш-тектуры с сокращенным набором команд (RISC — Reduced Instruction Set Compu­ter) . Термин «RISC» впервые был использован Паттерсоном и Дитцелем в 1980 году.
Основные черты RISC-архитектуры
Главные усилия в архитектуре RISC направлены на построение максимально эф­фективного конвейера команд, то есть такого, где все команды извлекаются из па­мяти и поступают в ЦП на обработку в виде равномерного потока, причем ни одна команда не должна находиться в состоянии ожидания, а ЦП должен оставаться загруженным на протяжении всего времени. Кроме того, идеальным будет вариант, когда любой этап цикла команды выполняется в течение одного тактового периода,
Последнее условие относительно просто можно реализовать для этапа выборки. Необходимо лишь, чтобы все команды имели стандартную длину, равную ширине шины данных, соединяющей ЦП и память. Унификация времени исполнения для различных команд — значительно более сложная задача, поскольку наряду с реги­стровыми существуют также команды с обращением к памяти.
Помимо одинаковой длины команд, важно иметь относительно простую под­систему декодирования и управления: сложное устройство управления (УУ) бу­дет вносить дополнительные задержки в формирование сигналов управления. Очевидный путь существенного упрощения УУ — сокращение числа выполняе­мых команд, форматов команд и данных, а также видов адресации.
Излишне напоминать, что в сокращенном списке команд должны оставаться те, которые используются наиболее часто. Исследования показали, что 80-90% времени выполнения типовых программ приходится на относительно малую часть команд (10-20%). К наиболее часто востребуемьгм действиям относятся пересыл­ка данных, арифметические и логические операции. Основная причина, препят­ствующая сведению всех этапов цикла команды к одному тактовому периоду, - по­тенциальная необходимость доступа к памяти для выборки операндов и/или записи результатов. Следует максимально сократить число команд, имеющих доступ к па­мяти. Это соображение добавляет к ранее упомянутым принципам RISC еще два:
-  доступ к памяти во время исполнения осуществляется только командами «Чте-
ние» и «Запись»;
-  все операции, кроме «Чтение» и «Запись», имеют тип «регистр-регистр».
Для упрощения выполнения большинства команд и приведения их к типу «ре­гистр-регистр* требуется снабдить ЦП значительным числом регистров общего назначения. Большое число регистров в регистровом файле ЦП позволяет обеспе­чить временное хранение промежуточных результатов, используемых как операн­ды в последующих операциях, и ведет к уменьшению числа обращений к памяти, ускоряя выполнение операций. Минимальное число регистров, равное 32, приня­то как стандарт де-факто большинством производителей RISC-компьютеров,
Суммируя сказанное, концепцию RISC-компьютера можно свести к следую­щим положениям:
-  выполнение всех (или, по крайней мере, 75% команд) за один цикл;
-  стандартная однословная длина всех команд, равная естественной длине слова
и ширине шины данных и допускающая унифицированную поточную обработ­ку всех команд;
Архитектуры с полным и сокращенным набором команд -449
-  малое число команд (не более 128);
-  малое количество форматов команд (не более 4);
-  малое число способов адресации (не более 4);
-  доступ к памяти только посредством команд «Чтение» и -«Запись»;
-  все команды, за исключением «Чтения» и «Записи», используют внутрипро-
цессорные межрегистровые пересылки;
-  устройство управления «жесткой» логикой;
-  относительно большой (не менее 32) процессорный файл регистров общего
назначения (согласно [210] число РОН в современных RISC-микропроцессо­рах может превышать 500).
Регистры в RISC-процессорах
Отличительная черта RISC-архитектуры — большое число регистров общего на­значения, что объясняется стремлением свести все пересылки к типу «регистр-регистр». Но увеличение числаРОН способно дать эффект лишь при разумном их использовании. Оптимизация использования регистров в RISC-процессорах обес­печивается как программными, так и аппаратными средствами.
Программная оптимизация выполняется на этапе компиляции программы, на­писанной на ЯВУ. Компилятор стремится так распределить регистры процессора, чтобы разместить в них те переменные, которые в течение заданного периода вре­мени будут использоваться наиболее интенсивно.
На начальном этапе компилятор выделяет каждой переменной виртуаль­ный регистр. Число виртуальных регистров в принципе не ограничено. Затем компилятор отображает виртуальные регистры на ограниченное количество физических регистров. Виртуальные регистры, использование которых не пе­рекрывается, отображаются на один и тот же физический регистр. Если в оп­ределенном фрагменте программы физических регистров не хватает, то их роль для оставшихся виртуальных регистров выполняют ячейки памяти. В ходе вычислений содержимое каждой такой ячейки с помощью команды «Чтение» временно засылается в регистр, после чего командой «Запись» вновь возвра­щается в ячейку памяти.
Задача оптимизации состоит в определении того, каким переменным в данной точке программы выгоднее всего выделить физические регистры. Наиболее рас­пространенный метод, применяемый для этой цели, известен какраскраска графа. В общем случае метод формулируется следующим образом. Имеется граф, состоя­щий из узлов и ребер. Необходимо раскрасить узлы так, чтобы соседние узлы име­ли разный цвет и чтобы при этом общее количество привлеченных цветов было минимальным. В нашем случае роль узлов выполняют виртуальные регистры. Если два виртуальных регистра одновременно присутствуют в одном и том же фрагмен­те программы, они соединяются ребром. Делается попытка раскрасить граф в п цветов, где п — число физических регистров. Если такая попытка не увенча­лась успехом, то узлам, которые не удалось раскрасить, вместо физических регис­тров выделяются ячейки в памяти.
На рис. 9.37 приведен пример раскраски графа [36], в котором шесть виртуаль­ных регистров отображаются на три физических. Показаны временная последо-
45 0 Глава 9. Основные направления в архитектуре процессоров
вательность активного вовлечения в выполнение каждого виртуального регистра (рис. 9.37, а) и раскрашенный граф (рис. 9-37, б).
Как видно, не удалось раскрасить только виртуальный регистр F, его придется отображать на ячейку памяти.
Аппаратная оптимизация использования регистров в RISC-процессорах ори­ентирована на сокращение затрат времени при работе с процедурами. Наиболь­шее время в программах, написанных на ЯВУ, расходуется на вызовы процедур и возврат из них. Связано это с созданием и обработкой большого числа локаль­ных переменных и констант. Одним из механизмов для борьбы с этим эффектом являются так называемые,регистровые окна. Главная их задача — упростить и ус­корить передачу параметров от вызывающей процедуры к вызываемой и обратно.
Рис. 9.37. Иллюстрация методараскраски графа: а — временная последовательность
активногоиспользованиявиртуальныхрегистров; б— граф взаимного
использования регистров
Регистровый файл разбивается на группы регистров, называемые окнами. От­дельное окно назначается глобальным переменным. Глобальные регистры доступ­ны всем процедурам, выполняемым в системе в любое время. С другой стороны, каждой процедуре выделяется отдельное окно в регистровом файле. Все окна име­ют одинаковый размер (обычно по 32 регистра) и состоят из трех полей. Левое поле каждого регистрового окна одновременно является и правым полем предше­ствующего ему окна (рис. 9.38). Среднее поле служит для хранения локальных переменных и констант процедуры.
База окна (первый в последовательности регистров окна) указывается полем, называемым указателем текущего окна (CWP, Current Window Pointer), обычно расположенным в регистре (слове) состояния ЦП. Если текущей процедуре на­значено регистровое окно j CWP содержит значение j
Каждой вновь вызванной процедуре выделяется регистровое окно, непосред­ственно следующее за окном вызвавшей ее процедуры. Последние £ регистров окна; одновременно являются первыми к регистрами OKHaj + 1. Если процедура, зани­мающая окно j обращается к процедуре, которой в данной архитектуре должно быть назначено окно j + 1, она может передать в процессе вызова к аргументов.
Архитектуры с полным и сокращенным набором команд 4 5 1
Упомянутые к регистров сразу же будут доступны вызванной процедуре без вся­ких пересылок. Естественно, вызов приведет кувеличению содержимого поля CPW наединицу.
Глубина вложения процедур одна в другую может быть весьма велика, и жела­тельно, чтобы количество регистровых окон не было сдерживающим фактором. Это достигается за счет организации окон в виде циклического буфера.
На рис. 9.39 показан циклический буфер из шести окон, заполненный на глу-бину4(процедураАвызвалаВ, ВвызвалаС, СвызвалаЦ). Указателътекущегоокна (CWP) идентифицирует окно активной наданный момент процедуры — D, то есть окно 03, При выполнении процедуры все ссыпки на регистры в командах преобра-зуютсявсмещениеотносительно С\¥Р.Указательсохраненногоокна(8\¥Р, Saved
4 5 2 Глава 9. Основные направления в архитектуре процессоров
Window Pointer) содержит номер последнего из окон, сохраненных в памяти по причине переполнения циклического буфера. Если процедура D теперь вызовет процедуру Е, аргументы для нее она поместит в общее для обеих поле регистровых окон (пересечение окон 03 и 04 а значение CWP увеличится на единицу, то есть CWP будет показывать на окно 04.
Если далее процедура Е вызовет нроцедуру F, то этот вызов при существующем состоянии буфера не может быть выполнен, поскольку окно для F(05) перекрыва­ется с окном процедуры А (00). Следовательно, при попытке F начать загружать правое поле своего окна будут потеряны параметры процедуры А (А^). Поэтому когда CWP увеличивается на единицу (операция выполняется по модулю 6) и ока­зывается равным SWP, возникает прерывание и окно процедуры А сохраняется в памяти (запоминаются только поля А^ и A^J. Далее значение CWP инкремен-тируется и производится вызов процедуры F, Аналогичное прерывание происхо­дит и при возврате, например когда выполнится возврат из В в A CWP уменьшает-приведет к восстановлению содержимого окна процедуры А из памяти.
Как видно из примера, регистровый файл из п окон способен поддерживать п - 1 вызов процедуры. Число п не должно быть большим. В [208] показано, что при 8 регистровых окнах сохранение и восстановление окон в памяти требуется лишь для 1% операций вызова процедур. В ВМ Pyramid, например, используется 16 окон по 32 регистра в каждом.
Теоретически такой прием не исключен и в CISC. Однако устройство управле­ния CISC-процессора оккупирует на кристалле более 50% площади, оставляя мало места для других подсистем, в частности для большого файла регистров. УУ RISC занимает порядка 10% поверхности кристалла, предоставляя возможность иметь большой регистровый файл.
Другая часто встречаемая техника аппаратной оптимизации использования регистров — придание некоторым из них специального качества: такие регистры в состоянии принимать на себя имя любого РОН. Набор регистров, обладающих подфуалмсвош,твом,пгаываютбуферомпереименования. Прием оказывается очень удобным при конвейеризации команд и позволяет предотвратить конфликты, когда одна команда хочет воспользоваться регистром, в данный момент занятым другой командой.
Преимущества и недостатки RISC
Сравнивая достоинства и недостатки CISC и RISC, невозможно сделать однознач­ный вывод о неоспоримом преимуществе одной архитектуры над другой. Для от­дельных сфер использования ВМ лучшей оказывается та или иная. Тем не менее ниже приводится основная аргументация «за» и «против» RISC-архитектуры,
Для технологии RISC характерна сравнительно простая структура устройства управления. Площадь, выделяемая на кристалле микросхемы для реализации УУ, существенно меныпе.Так, в RISC I она составляет 6%,а в RISC II — 10%. Как след­ствие, появляется возможность разместить на кристалле большое число регистров ЦП (138 в RISC II). Кроме того, остается больше места для других узлов ЦП и для дополнительныхустройств: кэш-памяти, блока арифметики с плавающей запятой, части основной памяти, блока управления памятью, портов ввода/вывода.
Унификация набора команд, ориентация на потоковую конвейерную обработ­ку, унификация размера команд и длительности их выполнения, устранение пери-
Суперскалярные процессоры 45 3
одов ожидания в конвейере — все эти факторы положительно сказываются на об­щи быстродействии. Простое устройство управления имеет немного вентилей и, следовательно, короткие линии связи для прохождения сигналов управления. Малое число команд, форматов и режимов приводит к упрощению схемы декоди­рования, и оно происходит быстрее. Применяемое в RISC УУ с «жесткой»логи-кой быстрее микропрограммного. Высокой производительности способствует и уп­рощение передачи параметров между процедурами. Таким образом, применение RISC ведет к сокращению времени выполнения программы или увеличению ско­рости, за счет сокращения числа циклов на команду.
Простота У У, сопровождаемая снижением стоимости и повышением надежно­сти, также говорит в пользу RISC. Разработка УУ занимает меньше времени. Про­стое УУ будет содержать меньше конструктивных ошибок и поэтому более надежно.
Многие современные CISC-машины, такие как VAX 11/780, VAX-8600, имеют много средств для прямой поддержки функций ЯВУ, наиболее частых в этих язы­ках (управление процедурами, операции с массивами, проверка индексов масси­вов, защита информации, управление памятью и т. д.). RISC также обладает рядом средств для непосредственной поддержки ЯВУ и упрощения разработки компи­ляторов ЯВУ, благодаря чему эта архитектура в плане поддержки ЯВУ ни в чем не уступает CISC,
Недостатки RISC прямо связаны с некоторыми преимуществами этой архи­тектуры. Принципиальный недостаток — сокращенное число команд: на выполне­ние ряда функций приходится тратить несколько команд вместо одной в CISC. Это удлиняет код программы, увеличивает загрузку памяти и трафик команд меж­ду памятью и ЦП. Недавние исследования показали, что RISC-программа в сред­нем на 30% длиннее CISC-программы, реализующей те же функции.
Хотя большое число регистров дает существенные преимущества, само по себе оно усложняет схему декодирования номера регистра, тем самым увеличивается время доступа к регистрам,
УУ с «жесткой» логикой, реализованное в большинстве RISC-систем, менее гибко, более склонно к ошибкам, затрудняет поиск и исправление ошибок, уступа­ет при выполнении сложных команд.
Однословная команда исключает прямую адресацию для полного 32-битового адреса Поэтому ряд производителей допускают небольшую часть команд двой­ной длины, например в Intel 80960.
Суперскалярные процессоры
Поскольку возможности по совершенствованию элементной базы уже практичес­ки исчерпаны, дальнейшее повышение производительности ВМ лежит в плоско­сти архитектурных решений. Как уже отмечалось, один из наиболее эффективных подходов в этом плане — введение в вычислительный процесс различных уровней параллелизма Ранее рассмотренный конвейер команд — типичный пример такого подхода Тем же целям служат и арифметические конвейеры, где конвейеризации подвергается процесс выполнения арифметических операций. Дополнительный уровень параллелизма реализуется в векторных и матричных процессорах, но толь­ко при обработке многокомпонентных операндов типа векторов и массивов. Здесь высокое быстродействие достигается за счет одновременной обработки всех ком­понентов вектора или массива, однако подобные операнды характерны лишь для
Hosted by uCoz