ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.12.2021
Просмотров: 1195
Скачиваний: 2
4 4 6 Глава 9. Основные направления в архитектуре процессоров •
Рис. 9.36. Традиционная и суперконвейерная обработка команд
ней. Супер конвейеризация здесь стала следствием разбиения этапов выборки ко-
манды и выборки операнда, а также введения в конвейер дополнительного этапа
проверки тега, появление которой обусловлено архитектурой системы команд ма-
шины.
К сожалению, выигрыш, достигаемый за счет суперконвейеризации, на прак-
тике может оказаться лишь умозрительным. Удлинение конвейера ведет не толь-
ко к усугублению проблем, характерных для любого конвейера, но и возникнове-
нию дополнительных сложностей. В длинном конвейере возрастает вероятность
конфликтов. Дороже встает ошибка предсказания перехода — приходится очищать
большее число ступеней конвейера, на что требуется больше времени. Усложняет-
ся логика взаимодействия ступеней конвейера. Тем не менее создателям ВМ уда-
ется успешно справляться с большинством из перечисленных проблем, свидетель-
ством чего служит неуклонное возрастание числа ступеней в конвейерах команд
современных процессоров (табл. 9.1).
Архитектуры с полным и сокращенным набором команд 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 направлены на построение максимально эф-
фективного конвейера команд, то есть такого, где все команды извлекаются из па-
мяти и поступают в ЦП на обработку в виде равномерного пoтока, причем ни одна
команда не должна находиться в состоянии ожидания, а ЦП должен оставаться
загруженным на протяжении всего времени. Кроме того, идеальным будет вариант,
когда любой этап цикла команды выполняется в течение одного тактового периода,
Последнее условие относительно просто можно реализовать для этапа выборки.
Необходимо лишь, чтобы все команды имели стандартную длину, равную ширине
шины данных, соединяющей ЦП и память. Унификация времени исполнения для
различных команд — значительно более сложная задача, поскольку наряду с реги-
стровыми существуют также команды с обращением к памяти.
Помимо одинаковой длины команд, важно иметь относительно простую под-
систему декодирования и управления: сложное устройство управления (УУ) бу-
дет вносить дополнительные задержки в формирование сигналов управления.
Очевидный путь существенного упрощения УУ — сокращение числа выполняе-
мых команд, форматов команд и данных, а также видов адресации.
Излишне напоминать, что в сокращенном списке команд должны оставаться
те, которые используются наиболее часто. Исследования показали, что 80-90%
времени выполнения типовых программ приходится на относительно малую часть
команд (10-20%). К наиболее часто востребуемым действиям относятся пересыл-
ка данных, арифметические и логические операции. Основная причина, препят-
ствующая сведению всех этапов цикла команды к одному тактовому периоду, - по-
тенциальная необходимость доступа к памяти для выборки операндов и/или записи
результатов. Следует максимально сократить число команд, имеющих доступ
к
па-
мяти. Это соображение добавляет к ранее упомянутым принципам RISC еще два:
-
доступ к памяти во время исполнения осуществляется только командами «Чте-
ние» и «Запись»;
-
все операции, кроме «Чтение» и «Запись», имеют тип «регистр-регистр».
Для упрощения выполнения большинства команд и приведения их к типу «ре-
гистр-регистр* требуется снабдить ЦП значительным числом регистров общего
назначения. Большое число регистров в регистровом файле ЦП позволяет обеспе-
чить временное хранение промежуточных результатов, используемых как операн-
ды в последующих операциях, и ведет к уменьшению числа обращений к памяти,
ускоряя выполнение операций. Минимальное число регистров, равное 32, приня-
то как стандарт де-факто большинством производителей RISC-компьютеров,
Суммируя сказанное, концепцию RISC-компьютера можно свести к следую-
щим положениям:
-
выполнение всех (или, по крайней мере, 75% команд) за один цикл;
-
стандартная однословная длина всех команд, равная естественной длине слова
и ширине шины данных и допускающая унифицированную поточную обработ-
ку всех команд;
Архитектуры с полным и сокращенным набором команд 4 4 9
-
малое число команд (не более 128);
- малое количество форматов команд (не более 4);
- малое число способов адресации (не более 4);
- доступ к памяти только посредством команд «Чтение» и -«Запись»;
- все команды, за исключением «Чтения» и «Записи», используют внутрипро-
цессорные межрегистровые пересылки;
-
устройство управления «жесткой» логикой;
- относительно большой (не менее 32) процессорный файл регистров общего
назначения (согласно [210] число РОН в современных RISC-микропроцессо-
рах может превышать 500).
Регистры в RISC-процессорах
Отличительная черта RISC-архитектуры — большое число регистров общего на-
значения, что объясняется стремлением свести все пересылки к типу «регистр-
регистр». Но увеличение числа РОН способно дать эффект лишь при разумном их
использовании. Оптимизация использования регистров в RISC-процессорах обес-
печивается как программными, так и аппаратными средствами.
Программная оптимизация
выполняется на этапе компиляции программы, на-
писанной на ЯВУ. Компилятор стремится так распределить регистры процессора,
чтобы разместить в них те переменные, которые в течение заданного периода вре-
мени будут использоваться наиболее интенсивно.
На начальном этапе компилятор выделяет каждой переменной виртуаль-
ный регистр. Число виртуальных регистров в принципе не ограничено. Затем
компилятор отображает виртуальные регистры на ограниченное количество
физических регистров. Виртуальные регистры, использование которых не пе-
рекрывается, отображаются на один и тот же физический регистр. Если в оп-
ределенном фрагменте программы физических регистров не хватает, то их роль
для оставшихся виртуальных регистров выполняют ячейки памяти. В ходе
вычислений содержимое каждой такой ячейки с помощью команды «Чтение»
временно засылается в регистр, после чего командой «Запись» вновь возвра-
щается в ячейку памяти.
Задача оптимизации состоит в определении того, каким переменным в данной
точке программы выгоднее всего выделить физические регистры. Наиболее рас-
пространенный метод, применяемый для этой цели, известен
как раскраска графа.
В общем случае метод формулируется следующим образом. Имеется граф, состоя-
щий из узлов и ребер. Необходимо раскрасить узлы так, чтобы соседние узлы име-
ли разный цвет и чтобы при этом общее количество привлеченных цветов было
минимальным. В нашем случае роль узлов выполняют виртуальные регистры. Если
два виртуальных регистра одновременно присутствуют в одном и том же фрагмен-
те программы, они соединяются ребром. Делается попытка раскрасить граф
в n цветов, где
п —
число физических регистров. Если такая попытка не увенча-
лась успехом, то узлам, которые не удалось раскрасить, вместо физических регис-
тров выделяются ячейки в памяти.
На рис. 9.37 приведен пример раскраски графа [36], в котором шесть виртуаль-
ных регистров отображаются на три физических. Показаны временная последо-
4 5 0 Глава 9. Основные направления в архитектуре процессоров
вательность активного вовлечения в выполнение каждого виртуального регистра
(рис. 9.37,
а)
и раскрашенный граф (рис. 9.37,
б).
Как видно, не удалось раскрасить только виртуальный регистр F, его придется
отображать на ячейку памяти.
Аппаратная оптимизация
использования регистров в RISC-процессорах ори-
ентирована на сокращение затрат времени при работе с процедурами. Наиболь-
шее время в программах, написанных на ЯВУ, расходуется на вызовы процедур
и возврат из них. Связано это с созданием и обработкой большого числа локаль-
ных переменных и констант. Одним из механизмов для борьбы с этим эффектом
являются так называемые
регистровые окна.
Главная их задача — упростить и ус-
корить передачу параметров от вызывающей процедуры к вызываемой и обратно.
Рис. 9.37. Иллюстрация метода раскраски графа:
a —
временная последовательность
активного использования виртуальных регистров;
б
— граф взаимного
использования регистров
Регистровый файл разбивается на группы регистров, называемые окнами. От-
дельное окно назначается глобальным переменным. Глобальные регистры доступ-
ны всем процедурам, выполняемым в системе в любое время. С другой стороны,
каждой процедуре выделяется отдельное окно в регистровом файле. Все окна име-
ют одинаковый размер (обычно по 32 регистра) и состоят из трех полей. Левое
поле каждого регистрового окна одновременно является и правым полем предше-
ствующего ему окна (рис. 9.38). Среднее поле служит для хранения локальных
переменных и констант процедуры.
База окна
(первый в последовательности регистров окна) указывается полем,
называемым указателем текущего окна (CWP, Current Window Pointer), обычно
расположенным в регистре (слове) состояния ЦП. Если текущей процедуре на-
значено регистровое окно j CWP содержит значение j
Каждой вновь вызванной процедуре выделяется регистровое окно, непосред-
ственно следующее за окном вызвавшей ее процедуры. Последние
k
регистров окна;
одновременно являются первыми
k
регистрами окна j + 1. Если процедура, зани-
мающая окно j обращается к процедуре, которой в данной архитектуре должно
быть назначено окно j + 1, она может передать в процессе вызова
k
аргументов.