CISC и RISC архитектуры процессоров. Сравнительный анализ CISC и RISC архитектур

При проектировании суперминикомпьютеров на базе последних достижений СБИС-технологии оказалось невозможным полностью перенести в нее архитектуру удачного компьютера, выполненного на другой элементной базе. Такой перенос был бы очень неэффективен из-за технических ограничений на ресурсы кристалла: площадь, количество транзисторов, мощность рассеивания и т. д.

Для снятия указанных ограничений в Беркли (США, Калифорния) была разработана RISC(Restricted (reduced) instruction set computer)-архитектура (регистро-ориентированная архитектура). Компьютеры с такой архитектурой иногда называют компьютерами с сокращенным набором команд. Суть ее состоит в выделении наиболее употребительных операций и создании архитектуры, приспособленной для их быстрой реализации. Это позволило в условиях ограниченных ресурсов разработать компьютеры с высокой пропускной способностью.

2.1. Основные принципы RISC-архитектуры

В компьютерной индустрии наблюдается настоящий бум систем с RISC-архитектурой. Рабочие станции и серверы, созданные на базе концепции RISC, завоевали лидирующие позиции благодаря своим исключительным характеристикам и уникальным свойствам операционных систем типа UNIX, используемых на этих платформах.

В самом начале 80-х годов почти одновременно завершились теоретические исследования в области RISC-архитектуры, проводившиеся в Калифорнийском, Стэнфордском университетах, а также в лабораториях фирмы IBM. Особую значимость имеет проект RISC-1, который возглавили профессора Давид Паттерсон и Карло Секуин. Именно они ввели в употребление термин RISC и сформулировали четыре основных принципа RISC-архитектуры:

* каждая команда независимо от ее типа выполняется за один машинный цикл, длительность которого должна быть максимально короткой;

* все команды должны иметь одинаковую длину и использовать минимум адресных форматов, что резко упрощает логику центрального управления процессором;

* обращение к памяти происходит только при выполнении операций записи и чтения, вся обработка данных осуществляется исключительно в регистровой структуре процессора;

* система команд должна обеспечивать поддержку языка высокого уровня. (Имеется в виду подбор системы команд, наиболее эффективной для различных языков программирования.)

Со временем трактовка некоторых из этих принципов претерпела изменения. В частности, возросшие возможности технологии позволили существенно смягчить ограничение состава команд: вместо полусотни инструкций, использовавшихся в архитектурах первого поколения, современные RISC-процессоры реализуют около 150 инструкций. Однако основной закон RISC был и остается незыблемым: обработка данных должна вестись только в рамках регистровой структуры и только в формате команд "регистр – регистр –регистр".

В RISC-микропроцессорах значительную часть площади кристалла занимает тракт обработки данных, а секции управления и дешифратору отводится очень небольшая его часть.

Аппаратная поддержка выбранных операций, безусловно, сокращает время их выполнения, однако критерием такой реализации является повышение общей производительности компьютера в целом и его стоимость. Поэтому при разработке архитектуры необходимо проанализировать результаты компромиссов между различными подходами, различными наборами операций и на их основе выбрать оптимальное решение.

Развитие RISC-архитектуры в значительной степени определяется успехами в области проектирования оптимизирующих компиляторов. Только современная технология компиляции позволяет эффективно использовать преимущества большого регистрового файла, конвейерной организации и высокой скорости выполнения команд. Есть и другие свойства процесса оптимизации в технологии компиляции, обычно используемые в RISC-процессорах: реализация задержанных переходов и суперскалярная обработка, позволяющие в один и тот же момент времени посылать на выполнение несколько команд.

2.2. Отличительные черты RISC - и CISC - архитектур

Двумя основными архитектурами набора команд, используемыми компьютерной промышленностью на современном этапе развития вычислительной техники, являются архитектуры CISC и RISC. Основоположником CISC-архитектуры – архитектуры с полным набором команд (CISC – Complete Instruction Set Computer) можно считать фирму IBM с ее базовой архитектурой IBM/360, ядро которой используется с 1964 г. и дошло до наших дней, например, в таких современных мейнфреймах, как IBM ES/9000.

Лидером в разработке микропроцессоров с полным набором команд считается компания Intel с микропроцессорами X86 и Pentium. Это практически стандарт для рынка микропроцессоров.

Простота архитектуры RISC-процессора обеспечивает его компактность, практическое отсутствие проблем с охлаждением кристалла, чего нет в процессорах фирмы Intel, упорно придерживающейся пути развития архитектуры CISC. Формирование стратегии CISC-архитектуры произошло за счет технологической возможности перенесения "центра тяжести" обработки данных с программного уровня системы на аппаратный, так как основной путь повышения эффективности для CISC-компьютера виделся, в первую очередь, в упрощении компиляторов и минимизации исполняемого модуля. На сегодняшний день CISC-процессоры почти монопольно занимают на компьютерном рынке сектор персональных компьютеров, однако RISC-процессорам нет равных в секторе высокопроизводительных серверов и рабочих станций.

Основные черты RISC-архитектуры с аналогичными по характеру чертами CISC-архитектуры отображаются следующим образом (табл. 2.1):

Таблица 2.1. Основные черты архитектуры

CISC‑архитектура

RISC-архитектура

Многобайтовые команды

Однобайтовые команды

Малое количество регистров

Большое количество регистров

Сложные команды

Простые команды

Одна или менее команд за один цикл процессора

Несколько команд за один цикл процессора

Традиционно одно исполнительное устройство

Несколько исполнительных

устройств

Одним из важных преимуществ RISC-архитектуры является высокая скорость арифметических вычислений. RISC-процессоры первыми достигли планки наиболее распространенного стандарта IEEE 754, устанавливающего 32-разрядный формат для представления чисел с фиксированной точкой и 64-разрядный формат "полной точности" для чисел с плавающей точкой. Высокая скорость выполнения арифметических операций в сочетании с высокой точностью вычислений обеспечивает RISC-процессорам безусловное лидерство по быстродействию в сравнении с CISC-процессорами.

Другой особенностью RISC-процессоров является комплекс средств, обеспечивающих безостановочную работу арифметических устройств: механизм динамического прогнозирования ветвлений, большое количество оперативных регистров, многоуровневая встроенная кэш-память.

Организация регистровой структуры – основное достоинство и основная проблема RISC. Практически любая реализация RISC-архитектуры использует трехместные операции обработки, в которых результат и два операнда имеют самостоятельную адресацию – R1: = R2, R3. Это позволяет без существенных затрат времени выбрать операнды из адресуемых оперативных регистров и записать в регистр результат операции. Кроме того, трехместные операции дают компилятору большую гибкость по сравнению с типовыми двухместными операциями формата "регистр – память" архитектуры CISC. В сочетании с быстродействующей арифметикой RISC-операции типа "регистр – регистр" становятся очень мощным средством повышения производительности процессора.

Вместе с тем опора на регистры является ахиллесовой пятой RISC-архитектуры. Проблема в том, что в процессе выполнения задачи RISC-система неоднократно вынуждена обновлять содержимое регистров процессора, причем за минимальное время, чтобы не вызывать длительных простоев арифметического устройства. Для CISC-систем подобной проблемы не существует, поскольку модификация регистров может происходить на фоне обработки команд формата "память – память".

Существуют два подхода к решению проблемы модификации регистров в RISC-архитектуре: аппаратный, предложенный в проектах RISC-1 и RISC-2, и программный, разработанный специалистами IВМ и Стэндфордского университета. Принципиальная разница между ними заключается в том, что аппаратное решение основано на стремлении уменьшить время вызова процедур за счет установки дополнительного оборудования процессора, тогда как программное решение базируется на возможностях компилятора и является более экономичным с точки зрения аппаратуры процессора.

2.3. Некоторые задачи реализации RISC-процессоров

Нас будет в основном интересовать выбор оптимального набора операций. При его решении мы можем по некоторой джентльменской смеси задач, для выполнения которой предназначен компьютер, выбрать пакет контрольных программ и построить для них профиль их выполнения либо использовать метод статических или динамических измерений параметров самих программ.

При профилировании программы определяется доля общего времени центрального процессора, затрачиваемого на выполнение каждого оператора (операции) программы. Анализ полученных результатов позволит выявить характерные особенности профилируемой программы.

При статических или динамических измерениях подсчитывается, сколько раз в программе встречается тот или иной оператор (операция) или как часто признаки принимают положительные или отрицательные значения в тексте программы (статика) либо в результате выполнения (динамика).

Сочетание результатов, полученных в ходе предложенных исследований, дает общую картину анализируемой программы. Вот результаты одного из таких измерений в статике, проведенные для программ-компиляторов: операторы присваивания – 48 %; условные операторы – 15; циклы – 16; операторы вызова-возврата – 18; прочие операторы – 3 %.

Измерение трехсот процедур, используемых в программах – операционных системах в динамике показали следующие измерения типов операндов: константы – 33 %; скаляры – 42; массивы (структуры) – 20 и прочие – 5 %.

При этом статистика среди команд управления потоком данных следующая. В разных тестовых пакетах программ команды условного перехода занимают от 66 до 78 %, команды безусловного перехода – от 12 до 18 %, частота переходов на выполнение составляет от 10 до 16 %.

Отсюда можно сделать вывод, что операторы присваивания занимают основную часть в программах-компиляторах, а операнды типа константа и локальные скаляры составляют основную часть операндов в процедурах, к которым происходит обращение в процессе выполнения программы.

Подобные количественные и качественные измерения образуют основу для оптимизации процессорной архитектуры.

Так, если операторы присваивания занимают 48 % всех операторов, то ясно, что операцию доступа к операндам следует реализовать аппаратно. Особенно это важно, если речь идет о нечисловых задачах, в которых операции вычислительного плана, как правило, просты. В условных операторах, операторах цикла и вызова-возврата производятся манипуляции над множеством операндов, что также подтверждает необходимость аппаратной реализации операции доступа к операндам.

При анализе типов операндов мы учитывали три категории:

* константы – не меняются во время выполнения программы и имеют, как правило, небольшие значения;

* скаляры – обращение к ним происходит, как правило, явно по их имени. Их обычно немного, и они описываются в процедурах как локальные;

* обращение к элементам массивов и структур происходит посредством индексов и указателей, т. е. через косвенную адресацию. Этих элементов, как правило, много.

Для осуществления доступа к операнду необходимо вначале определить физический адрес ячейки, где хранится операнд, а затем осуществить доступ к операнду. Если операнд – константа, ее можно указать в команде. Доступ к ней может быть осуществлен немедленно после обращения. В других случаях все зависит от типа памяти, где хранится операнд. Регистровые блоки и кэш-память мало отличаются по емкости, скорости доступа и стоимости, однако существенно отличаются по накладным расходам на адресацию. Обращение к кэш-памяти осуществляется при помощи адресов полной длины, которые требуют более высокой полосы пропускания каналов обмена. Как правило, этот адрес приходится формировать во время выполнения программы, что как минимум требует полноразрядного сложения или обращения к регистру либо и того, и другого. Регистровые блоки адресуются короткими номерами регистров, которые обычно указываются в команде, что упрощает их декодирование. Однако регистровая память может хранить только определенные типы данных, в то время как кэш-память может использоваться и как основная. В связи с этим распределение скалярных переменных по регистрам необычайно важно, ибо существенно влияет на скорость обработки.

Необходимо решить вопрос с размером регистровых окон, ибо в обычной архитектуре окна однорегистровые, что требует операции запоминания-восстановления при каждом вызове-возврате.

При вызовах процедур необходимо запоминать содержимое регистров, а при возвращении – восстанавливать их, на что тратится значительное время. Вызовы процедур в современных структурированных программах делаются довольно часто, при этом суммарные накладные расходы на выполнение команд вызова и возврата из процедур на стандартных процессорах доходит до 50 % всех обращений к памяти в программе. Чтобы уменьшить время передачи данных между процедурами-родителями и процедурами-дочерьми (в случае, когда глубина их вложенности больше единицы), можно создать блок регистров, предоставив и родителям, и дочерям доступ к некоторым из них. Другими словами, необходимо создать перекрывающиеся блоки регистров. Такая возможность реализуется через перекрывающиеся "окна", накладываемые на блок регистров. Этот механизм реализован в RISC-архитектуре. Многие измерения показывают, что около 97 % процедур имеют не более шести параметров, что требует, чтобы перекрытие соседних окон шло где-то на пять регистров.

Процессор всегда содержит указатель текущего окна с возможностью его модификации в рамках реализованной глубины вложения процедур. Если глубина переполняется, часть содержимого окон направляется в основную память, чтобы иметь место для новых процедур. Для простоты реализации в ОП направляется содержимое целого окна. Это говорит о целесообразности введения многооконного механизма с заданным размером окна. Размер окна определяется количеством передаваемых параметров, а количество окон – допустимой вложенностью процедур.

Среди достоинств применения больших регистровых блоков можно выделить высокую скорость доступа к блокам и увеличение частоты вызова процедур. Среди недостатков – высокая стоимость большого регистрового блока, организуемого в ущерб другим функциональным блокам на кристалле.

Аппаратная реализация механизма перекрытия окон должна вводиться, если получаемый выигрыш перекрывает затраты.

Так как значительная часть процедур требует от трех до шести параметров, то следует подумать об оптимизации использования окон. Во-первых, пересылать в ОП в случае переполнения регистрового блока можно не все окна, а только содержимое регистров, используемых для данной процедуры, и, во-вторых, применять механизм с окнами переменных размеров, определяемых во время выполнения.

Перспективной разновидностью RISC-архитектуры явилась архитектура SPARC (Scalable Processor Architecture).

Замечание. Scaling – масштабирование, т. е. способность представлять данные таким образом, чтобы и они, и результат проводимых с ними вычислений находились в диапазоне чисел, которые могут обрабатываться в рамках данного процесса или на данном оборудовании.

Новая серия SPARCSTATIONS фирмы Sun Microsystems базируется на SPARC-архитектуре. Первые модели этой фирмы были изготовлены уже в 1989 г. Операционной средой для всех станций фирмы Sun является SunOS – разновидность OS Unix, снабженная многооконным графическим интерфейсом Open Look.

Для повышения скорости обработки данных используются компьютеры с VLIW (Very Long Instruction Word)-архитектурой. Структура команды таких компьютеров наряду с кодом операции и адресами операндов включает теги и дескрипторы. Наряду с существенным ускорением обработки данных такая архитектура позволяет экономить память при достаточном количестве обращений к командам и сокращать общее количество команд в системе команд.

2.4. Методы адресации и типы команд

В машинах с регистрами общего назначения метод (или режим) адресации объектов, с которыми манипулирует команда, может задавать константу, регистр или ячейку памяти.

В табл. 2.2 представлены основные методы адресации операндов, которые реализованы в компьютерах, рассмотренных в настоящей книге.

Таблица 2.2. Методы адресации

Метод
адресации

Пример
команды

Смысл
команды

Использование команды

Регистровая

Для записи требуемого значения в регистр

Непосредственная или литерная

Для задания констант

Базовая со смещением

R4= R4+M(100+R1)

Для обращения к локальным переменным

Косвенная регистровая

Для обращения по указателю к вычисленному адресу

Индексная

R3 = R3+M(R1+R2)

Прямая или абсолютная

Полезна для обращения
к статическим данным

Косвенная

R1 = R1+M(M(R3))

Если R3 – адрес указателя р, то выбирается значение по этому указателю

Автоинкрементная

Полезна для прохода в цикле по массиву с шагом: R2 – начало массива. В каждом цикле R2 получает приращение d

Автодекрементная

Аналогична предыдущей. Обе могут использоваться для реализации стека

Базовая индексная со смещением и масштабированием

R1=R1+M(100)+R2+R3*d

Для индексации массивов

Адресация непосредственных данных и литерных констант обычно рассматривается как один из методов адресации памяти (хотя значения данных, к которым в этом случае производятся обращения, являются частью самой команды и обрабатываются в общем потоке команд).

В табл. 2.2 на примере команды сложения (Add) приведены наиболее употребительные названия методов адресации, хотя при описании архитектуры в документации производители компьютеров и ПО используют разные названия для этих методов. В табл. 2.2. знак "=" используется для обозначения оператора присваивания, а буква M обозначает память (Memory). Таким образом M(R1) обозначает содержимое ячейки памяти, адрес которой определяется содержимым регистра R1.

Использование сложных методов адресации позволяет существенно сократить количество команд в программе, но при этом значительно увеличивается сложность аппаратуры.

Команды традиционного машинного уровня можно разделить на несколько типов, которые показаны в табл. 2.3.

Таблица 2.3. Основные типы команд

Тип операции

Арифметические
и логические

Целочисленные арифметические и логические операции: сложение, вычитание, логическое сложение, логическое умножение и т. д.

Пересылки данных

Операции загрузки/записи

Управление потоком команд

Безусловные и условные переходы, вызовы процедур и возвраты

Системные операции

Системные вызовы, команды управления виртуальной памятью и т. д.

Операции с плавающей точкой

Операции сложения, вычитания, умножения и деления над вещественными числами

Десятичные операции

Десятичное сложение, умножение, преобразование форматов и т. д.

Операции над строками

Пересылки, сравнения и поиск строк

Тип операнда может задаваться либо кодом операции в команде, либо с помощью тега, который хранится вместе с данными и интерпретируется аппаратурой во время обработки данных.

Обычно тип операнда (целый, вещественный, символ) определяет и его размер. Как правило, целые числа представляются в дополнительном коде. Для задания символов компания IBM использует код EBCDIC, другие компании применяют код ASCII. Для представления вещественных чисел с одинарной и двойной точностью придерживаются стандарта IEEE 754.

В ряде процессоров применяют двоично кодированные десятичные числа, которые представляют в упакованном и неупакованном форматах. Упакованный формат предполагает, что для кодирования цифр 0 – 9 используют 4 разряда и две десятичные цифры упаковываются в каждый байт. В неупакованном формате байт содержит одну десятичную цифру, которая обычно изображается в символьном коде ASCII.

2.5. Компьютеры со стековой архитектурой

При создании компьютера одновременно проектируют и систему команд (СК) для него. Существенное влияние на выбор операций для их включения в СК оказывают:

* элементная база и технологический уровень производства ком-пьютеров;

* класс решаемых задач, определяющий необходимый набор операций, воплощаемых в отдельные команды;

* системы команд для компьютеров аналогичного класса;

* требования к быстродействию обработки данных, что может породить создание команд с большой длиной слова (VLIW-команды).

Анализ задач показывает, что в смесях программ доминирующую роль играют команды пересылки и процессорные команды, использующие регистры и простые режимы адресации.

На сегодняшний день наибольшее распространение получили следующие структуры команд: одноадресные (1A), двухадресные (2A), трехадресные (3A), безадресные (БА), команды с большой длиной слова (VLIW – БДС) (рис. 2.1):

Дескрипторы

Рис. 2.1. Структуры команд

Причем операнд может указываться как адресом, так и непосредственно в структуре команды.

В случае БА-команд операнды выбираются и результаты помещаются в стек (магазин, гнездо). Типичными первыми представителями БА-компьютеров являются KDF-9 и МВК "Эльбрус". Их характерной особенностью является наличие стековой памяти.

Стек – это область оперативной памяти, которая используется для временного хранения данных и операций. Доступ к элементам стека осуществляется по принципу FILO (first in, last out) – первым вошел, последним вышел. Кроме того, доступ к элементам стека осуществляется только через его вершину, т. е. пользователю "виден" лишь тот элемент, который помещен в стек последним.

Рассмотрим функционирование процессора со стековой организацией памяти.

При выполнении различных вычислительных процедур процессор использует либо новые операнды, до сих пор не выбиравшиеся из памяти компьютера, либо операнды, употреблявшиеся в предыдущих операциях. В процессорах с классической структурой обращение к любому операнду (1A-ЭВМ) требует цикла памяти.

Рассмотрим пример.

Пусть процессор вычисляет значение выражения

DIV_ADBLOCK142">

Номер
команды

Комментарии

– рабочая ячейка

– рабочая ячейка

Замечание. Выполнение команды типа https://pandia.ru/text/78/406/images/image016_43.gif" width="28" height="28">

Как следует из приведенной программы, операнд a выбирается из памяти 2 раза (команды 4 и 5), b – 3 раза (команды 2, 7 и 8). Кроме того, потребовались дополнительные обращения к памяти для запоминания и вызова из памяти результатов промежуточных вычислений (команды 3, 6, 9, 10).

Если главным фактором, ограничивающим быстродействие компьютера, является время цикла памяти, то необходимость в дополнительных обращениях к памяти значительно снижает скорость его работы. Очевидно, что принципиально необходимы только обращения к памяти за данными в первый раз. В дальнейшем они могут храниться в триггерных регистрах или СОЗУ.

Указанные соображения получили свое воплощение в ряде логических структур процессора. Одна из них – процессор со стековой памятью. Принцип ее работы поясняет схема, представленная на рис. 2.2.

Стековая память представляет собой набор из n регистров, каждый из которых способен хранить одно машинное слово. Одноименные разряды регистров P1, P2, ..., Pn соединены между собой цепями сдвига. Поэтому весь набор регистров может рассматриваться как группа n‑разрядных сдвигающих регистров, составленных из одноименных разрядов регистров P1, P2, ..., Pn. Информация в стеке может продвигаться между регистрами вверх и вниз.

Движение вниз: (P1) ® P2, (P2) ® P3, ..., а P1 заполняется данными из главной памяти.

Движение вверх: (Pn) ® Pn‑1, (Pn‑1) ® Pn‑2, а Pn заполняется нулями.



Рис. 2.2. Стековая организация процессора

Регистры P1 и P2 связаны с АЛУ, образуя два операнда для выполнения операции. Результат операции записывается в P1. Следовательно, АЛУ выполняет операцию .

Одновременно с выполнением арифметической операции (АО) осуществляется продвижение операндов вверх, не затрагивая P1, т. е. (P3) ® P2, (P4) ® P3 и т. д.

Таким образом, АО используют подразумеваемые адреса, что уменьшает длину команды. В принципе, в команде достаточно иметь только поле, определяющее код операции. Поэтому компьютеры со стековой памятью называют безадресными. В то же время команды, осуществляющие вызов или запоминание информации из главной памяти, требуют указания адреса операнда. Поэтому в ЭВМ со стековой памятью используются команды переменной длины. Например, в KDF-9 команды АО – однослоговые, команды обращения к памяти и передач управления – трехслоговые, остальные – двуслоговые.

Команды располагаются в памяти в виде непрерывного массива слогов независимо от границ ячеек памяти. Это позволяет за один цикл обращения к памяти вызвать несколько команд.

Для эффективного использования возможностей такой памяти в ЭВМ вводятся спецкоманды:

· дублирование ~ (P1) ® P2, (P2) ® P3, ... и т. д., а (P1) остается при этом неизменным;

· реверсирование ~ (P1) ® P2, а (P2) ® P1, что удобно для выполнения некоторых операций.

Рассмотрим тот же пример для новой ситуации (табл. 2.5):

0 " style="border-collapse:collapse;border:none">

Вызов b

Дублирование

Вызов c

Сложение

Реверсирование

Дублирование

Умножение

Вызов a

Дублирование

Умножение

Сложение

Как следует из табл. 2.5, понадобились лишь три обращения к памяти для вызова операндов (команды 1, 3, 8). Меньше обращений принципиально невозможно. Операнды и промежуточные результаты поступают для операций в АУ из стековой памяти; 9 команд из 12 являются безадресными.

Вся программа размещается в трех 48-разрядных ячейках памяти.

Главное преимущество использования магазинной памяти состоит в том, что при переходе к подпрограммам (ПП) или в случае прерывания нет необходимости в специальных действиях по сохранению содержимого арифметических регистров в памяти. Новая программа может немедленно начать работу. При введении в стековую память новой информации данные, соответствующие предыдущей программе, автоматически продвигаются вниз. Они возвращаются обратно, когда новая программа закончит вычисления.

Наряду с указанными преимуществами стековой памяти отметим также:

* уменьшение количества обращений к памяти;

* упрощение способа обращения к ПП и обработки прерываний.

Недостатки стековой организации памяти:

· большое число регистров с быстрым доступом;

· необходимость в дополнительном оборудовании, чтобы следить за переполнением стековой памяти, ибо число регистров памяти конечно;

· приспособленность главным образом для решения научных задач и в меньшей степени для систем обработки данных или управления технологическими процессами.

2.6. Оптимизация системы команд

Важным вопросом построения любой системы команд является оптимальное кодирование команд. Оно определяется количеством регистров и применяемых методов адресации, а также сложностью аппаратуры, необходимой для декодирования. Именно поэтому в современных RISC-архитектурах используются достаточно простые методы адресации, позволяющие резко упростить декодирование команд. Более сложные и редко встречающиеся в реальных программах методы адресации реализуются с помощью дополнительных команд, что, вообще говоря, приводит к увеличению размера программного кода. Однако такое увеличение программы с лихвой окупается возможностью простого увеличения частоты RISC-процессоров. Этот процесс мы можем наблюдать сегодня, когда максимальные тактовые частоты практически всех RISC-процессоров (Alpha, R4400, HyperSPARC и Power2) превышают тактовую частоту, достигнутую процессором Pentium.

Общую технологию проектирования системы команд для новой ЭВМ можно обозначить так: зная класс решаемых задач, выбираем некоторую типовую СК для широко распространенного компьютера и исследуем ее на предмет присутствия всего разнообразия операций в заданном классе задач. Вовсе не встречающиеся или редко встречающиеся операции не покрываем командами. Все частоты встреч операций для задания их в СК всякий раз можно определить из соотношений "стоимость затрат – сложность реализации – получаемый выигрыш".

Второй путь проектирования СК состоит в расширении имеющейся системы команд. Один из способов такого расширения – создание макрокоманд, второй – используя имеющийся синтаксис языка СК, дополнить его новыми командами с последующим переассемблированием, через расширение функций ассемблера. Оба эти способа принципиально одинаковы, но отличаются в тактике реализации аппарата расширения.

Так, система команд для ПК IBM покрывает следующие группы операций: передачи данных, арифметические операции, операции ветвления и циклов, логические операции и операции обработки строк.

Разработанную СК следует оптимизировать. Один из способов оптимизации состоит в выявлении частоты повторений сочетаний двух или более команд, следующих друг за другом в некоторых типовых задачах для данного компьютера, с последующей заменой их одной командой, выполняющей те же функции. Это приводит к сокращению времени выполнения программы и уменьшению требуемого объема памяти.

Мы можем исследовать и часто генерируемые компилятором некоторые последовательности команд, убирая из них избыточные коды.

Оптимизацию можно проводить и в пределах отдельной команды, исследуя ее информационную емкость. Для этого можно применить аппарат теории информации, в частности для оценки количества переданной информации – энтропию источника. Тракт "процессор – память" можно считать каналом связи.

Замечание. Энтропия – это мера вероятности пребывания системы в данном состоянии (в статистической физике).

2.7. Процессоры с микропрограммным управлением

Известны два подхода к построению логики формирования функциональных импульсов. Один из них: каждой операции процессора соответствует набор логических схем, выполненных на диодах, транзисторах и т. д. и определяющих, какой функциональный импульс (ФИ) и в каком такте должен быть возбужден. Пусть некоторый ФИ должен появиться в такте j операции m при условии наличия переполнения сумматора или в такте i операции n. Требуемое действие будет выполнено, если подать сигналы, соответствующие указанным кодам операции, тактам и условиям на входы схем И, а выходы последних через схему ИЛИ соединить с формирователем ФИ (рис. 2.3).



Такой принцип управления операциями получил название "жесткой" или "запаянной" логики и широко применяется во многих компьютерах.

Рис. 2.3. Формирование функционального импульса

Другой принцип организации управления : каждой микрооперации (МИО) ставится в соответствие слово (или часть слова), называемое микрокомандой и хранимое в памяти подобно тому, как хранятся в памяти команды обычного компьютера. Здесь команде соответствует микропрограмма, т. е. набор микрокоманд (МИК), указывающих, какие ФИ и в какой последовательности необходимо возбуждать для выполнения данной операции. Такой подход получил название микропрограммирования или "хранимой логики". Это подчеркивает тот факт, что в микропрограммном компьютере логика управления реализуется не в виде электронной схемы , а в виде закодированной информации, находящейся в каком-то регистре.

Идея микропрограммирования, высказанная в 1951 г. Уилксом, до недавнего времени не находила широкого применения, ибо:

· не было надежных и быстродействующих ЗУ для хранения микропрограммы;

· неправильно понимались задачи и выгоды микропрограммирования.

Поясним второй аргумент. Считалось, ценность микропрограммирования в том, что каждый потребитель может сконструировать себе из МИК нужный ему набор операций в данной конкретной задаче. Замена наборов команд достигалась бы заменой информации в ЗУ без каких-либо переделок в аппаратуре. Однако в этом случае программисту необходимо было бы знать все тонкости работы инженера-разработчика компьютера. А основная тенденция развития ЭВМ в связи с автоматизацией программирования состоит в том, чтобы освободить программиста от детального изучения устройств компьютера и в максимальной степени приблизить язык компьютера к языку человека. Поэтому микропрограммные компьютеры считали трудными для пользователя.

В последнее время интерес к микропрограммному принципу возродился, так как:

· созданы односторонние (читающие) быстродействующие ЗУ с малым циклом памяти;

· микропрограммирование рассматривается не как средство повышения гибкости программирования, а как метод построения системы управления процессором, удобный для инженера-разработчика компьютера.

Программист в своей работе может и не подозревать о микропро-граммной структуре компьютера и использовать все средства ПО и языки программирования самого высокого уровня. Использование микропрограммного принципа позволяет облегчить разработку и изменение логики процессора.

С появлением программного доступа к состоянию процессора после выполнения каждой МИК обеспечивается возможность создания экономичной системы автоматической диагностики неисправностей и появляется способность к эмуляции, т. е. к выполнению на данной ЭВМ программы, составленной в кодах команд другого компьютера. Это достигается введением дополнительного набора МИК, соответствующих командам эмулируемого компьютера.

Эти возможности способствуют распространению методов микропрограммирования при построении УУ в современных компьютерах.

2.7.1. Горизонтальное микропрограммирование



Существуют два вида микропрограммного управления: горизонтальное и вертикальное. При горизонтальном – каждому разряду МИК соответствует определенная МИО, выполняемая независимо от содержания других разрядов. Микропрограмма может быть представлена в виде матрицы n ´ m, где n – число ФИ, m – количество МИК, т. е. строка соответствует одной МИК, а столбец – одной МИО (рис. 2.4).

Рис.2.4. Микропрограмма при горизонтальном
микропрограммировании

Примерные значения разрядов МИК приведены на рис. 2.5.

Рис.2.5. Значение разрядов МИК (МИО):

1 – гашение сумматора; 2 – гашение указателя переполнения; 3 – обратный код сумматора; 4 – гашение регистра множителя частного; 5 – инвертирование знака; 6 – сдвиг содержимого сумматора влево; 7 – сдвиг содержимого сумматора вправо; 8 – увеличение содержимого сумматора на 1; 9

чтение из ЗУ в сумматор; …

Наличие "1" в пересечении какой-либо строки и столбца означает посылку ФИ в данную МИК, а наличие "0" – его отсутствие.

Размещение "1" в нескольких разрядах МИК означает выполнение нескольких МИО одновременно. Конечно, возбуждаемые МИО должны быть совместимы.

Пусть, например, разряды 9-разрядной МИК принимают следующие значения: . Тогда, если заданные разряды соответствуют семантике, указанной на рис. 2.5, то МИО, определяемые разрядами 9, 7 и 6, несовместимы.

Для расширения возможностей МИК иногда используют многотактный принцип исполнения МИК. При этом каждому разряду присваивается номер такта, в котором выполняется соответствующая ему МИО, т. е. здесь все совместимые МИО имеют один номер такта. Все остальные такты нумеруются в порядке их естественного выполнения. Однако универсальную нумерацию МИО в МИК указать затруднительно.

Достоинства горизонтального микропрограммирования:

· возможность одновременного выполнения нескольких МИО;

· простота формирования ФИ (без схем дешифрации).

Недостатки:

· большая длина МИК, так как число ФИ в современных компьютерах достигает нескольких сот, и соответственно большой объем ЗУ для
хранения МИК;

· из-за ограничений совместимости операций, а также из-за последовательного характера выполнения алгоритмов операций лишь небольшая часть разрядов МИК будет содержать "1". В основном матрица будет состоять из нулей. Неэффективное использование ЗУ привело к малому распространению горизонтального микропрограммирования.

2.7.2. Вертикальное микропрограммирование

При вертикальном микропрограммировании каждая МИО определяется не состоянием одного разряда, а двоичным кодом, содержащимся в определенном поле МИК. Микрокоманда несколько напоминает формат обычных команд. Отличие состоит в том, что:

· выполняется более элементарное действие – МИО вместо операции;

· адресная часть (в большинстве случаев) определяет не ячейку памяти, а операционный регистр процессора.



Формат МИК при вертикальном микропрограммировании приведен на рис. 2.6.

Рис. 2.6. Формат вертикальной МИК

Поля Р1 и Р2 в адресной части МИК указывают двоичные номера операционных регистров, содержимое которых участвует в одной операции. Одно из полей является одновременно и адресом результата. Таким образом, реализация арифметической или логической МИО, указанной в данной МИК,

может быть выражена формулой

(P1) Ä (P2) ® P1, или (P2) ®P1,

где Ä – символ МИО.

Для МИК обращения к памяти поле P1 указывает регистр, куда принимается информация, а P2 – регистр, содержимое которого является адресом обращения к ЗУ. Указанный формат МИК не единственный.

Каждая МИК выполняет следующие функции:

· указывает выполняемую МИО;

· указывает следующую МИО через задание "следующего адреса";

· задает продолжительность МИК;

· указывает дополнительные действия – контроль и т. д.

Обычно в слове МИК имеются четыре зоны, соответствующие указанным функциям. Вообще говоря, некоторые из зон могут указываться неявно, например выбор очередной МИК может осуществляться из следующей ячейки, продолжительность МИК может быть определена одинаковой для всех МИК и т. д.

Первыми компьютерами с микропрограммным управлением среди отечественных ЭВМ были МИР, НАИРИ, среди зарубежных – IBM/360,
Spectra 70.

Упражнения

1. Проанализируйте особенности RISC‑ и CISC‑архитектур компьютеров.

2. Приведите конкретные примеры воплощения RISC‑архитектур в реальных компьютерах.

3. Промоделируйте работу RISC‑программы на CISC-компьютере.

4. Проанализируйте и сравните по различным параметрам (быстродействию, памяти, сложности программирования) программы для одно‑, двух‑, трех‑ и безадресных компьютеров.

5. Проведите оптимизацию системы команд, если задан конкретный набор решаемых задач.

6. Разработайте микропрограммы выполнения заданных операций для реального компьютера. Проанализируйте целесообразность микропрограм-мной поддержки операций.

7. Разработайте систему команд для компьютера с VLIW‑архитектурой.


  • Перевод

Примечание переводчика. В оригинале статьи авторы (один из них - пионер RISC-процессоров Д. Паттерсон) аргументируют необходимость развития открытых ISA (instruction set architecture, наборов команд процессоров) и продуктов на их основе. В качестве аргументов выдвигается стимулирование развития тех областей вычислительной техники и экономических ниш, в которых коммерческие компании не заинтересованы или же недостаточно гибки. Они напоминают об успехах открытых стандартов и свободного программного обеспечения.

На расширенную версию этой статьи (а также на контр-статью от представителей ARM и контр-контр-параграф от авторов!) я наткнулся в августовском выпуске Microprocessor Report (MPR). Доступ к MPR ограничен и распространяется только на подписчиков, однако в открытом доступе есть оригинальный отчёт, размещённый на сайте университета Беркли. Его перевод я и предлагаю далее.

Instruction Sets Should Be Free: The Case For RISC-V by Krste Asanović and David A. Patterson. EECS Department, University of California, Berkeley - Technical Report No. UCB/EECS-2014-146 www.eecs.berkeley.edu/Pubs/TechRpts/2014/EECS-2014-146.html

Copyright notice and disclaimers

Copyright 2014, by the author(s).
All rights reserved.
Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission.



Заказные системы на чипе (SoC), в которых процессоры и их кэши занимают лишь малую часть кристалла, становятся вездесущими; сегодня уже сложно найти электронное устройство, в котором не используется процессор в составе SoC. Таким образом, всё больше компаний проектируют чипы, в которые входят процессоры, чем это было раньше. Учитывая, какую революцию произвели открытые стандарты и открытое программное обеспечение - например, сетевой протокол TCP/IP и операционная система Linux - почему один из самых важных интерфейсов остаётся проприетарным?

Аргументы в поддержку свободных, открытых ISA

Безусловно, некоторые наборы команд процессоров (ISA, англ. instruction set architecture) могут быть проприетарными по историческим и коммерческим причинам. Однако, не существует ни одного твёрдого технического основания для объяснения отсутствия свободных, открытых вариантов.
  1. Это не ошибка или упущение. Компании, владеющие успешными ISA, такие как ARM, IBM и Intel, владеют патентами на причуды своих систем команд, что препятствует остальным использовать их без лицензий 1 . Переговоры об использовании длятся по 6-24 месяца и могут стоить от 1 до 10 миллионов долларов, что исключает из процесса академические организации и всех, кому требуются лишь небольшие объёмы производства 2 . Лицензия от ARM даже не позволяет вам спроектировать собственное ядро; вы лишь получаете право на использование их дизайна (лишь около 15 больших компаний имеют право на создание новых ядер ARM). Даже «OpenPOWER» - это оксюморон; вы обязаны платить IBM, чтобы использовать эту ISA. Разумная с т.з. бизнеса, подобная практика лицензирования душит конкуренцию и инновации, запрещая многим проектировать и делиться собственными ISA-совместимыми ядрами.
  2. Это не из-за того, что сами владельцы ISA производят подавляющую долю программного обеспечения для своих систем. Несмотря на размеры программных экосистем, которые выросли вокруг популярных ISA, львиная доля ПО для них пишется внешними людьми.
  3. Эти компании не владеют сакральным знанием, требуемым для создания адекватной ISA. Это большая работа, но многие сегодня могут спроектировать набор инструкций.
  4. Самые популярные ISA - не самые изящные. Как 80x86, так и ARM не считаются эталонами хорошего дизайна.
  5. Для верификации совместимости с ISA не требуется контроль компаний. Открытые организации разработали механизмы для сертификации совместимости аппаратных средств много лет назад. Примеры: стандарт IEEE 754 для чисел с плавающей запятой, Ethernet, PCIe. Если бы это было не так, открытые IT-стандарты не были бы столь популярны.
  6. Наконец, нет гарантий, что проприетарные ISA будут существовать долго. Если компания разоряется и исчезает, она забирает свою ISA с собой. Кончина DEC закончила развитие наборов инструкций Alpha и VAX.

Отметим, что ISA на самом деле - спецификация интерфейса, но не его реализация. Существует три подхода к реализации некоторого интерфейса:

1. Частная закрытая, аналогично Apple iOS.
2. Лицензируемая открытая, наподобие Wind River VxWorks.
3. Свободная и открытая, пользователи которой могут изменять и делиться, как это сделано в Linux.

Проприетарные ISA на практике позволяют работать с первыми двумя подходами, но вам нужна свободная, открытая ISA для поддержки всех трёх подходов.

Отсюда мы делаем вывод, что промышленность только выиграет от жизнеспособной свободно доступной открытой ISA в той же мере, в какой на неё благотворно повлияло развитие свободного открытого ПО. Например, это создаст по-настоящему свободный открытый рынок процессорных дизайнов , которому в настоящее время мешают патенты на причуды ISA.

Это может привести к:

1. Инновациям через конкуренцию на свободном рынке многих дизайнеров, включая открытые и закрытые реализации ISA.
2. Общим открытым дизайнам ядер, что будет выражаться в сокращении времени выхода продукции на рынок, уменьшении стоимости от переиспользования, меньшем числе ошибок из-за пристального внимания многих людей 3 , и в прозрачности, которая, например, затруднит внедрение секретных бэкдоров правительственными агенствами.
3. Процессорам, доступным для большего числа устройств, что поможет развивать Интернет Вещей (IoT, англ. Internet of Things), со стоимостью порядка доллара.

Аргументы в поддержку RISC как стиля для свободной, открытой ISA

Для того, чтобы какая-либо ISA была принята сообществом open-source, мы считаем, что она должна иметь успешную историю коммерческого применения. Первый вопрос - какой стиль ISA демонстирует такую историю? За последние 30 лет история не знает ни одной успешной стековой архитектуры (Примечание переводчика: странное заявление, учитывая успех Java bytecode и.NET CLI - стековых архитектур ). Кроме как в сегменте приложений DSP (англ. digital signal processing), VLIW также постигла неудача: Multiflow всплыл брюхом вверх, а Itanium, несмотря на миллиардные инвестиции HP и Intel, не получил признания. Уже десятки лет ни одна новая CISC ISA не обретает успеха. Выжившие же CISC архитектуры транслируют свои сложные инструкции в более простые ISA, что очень оправдано для исполнения ценной унаследованной кодовой базы. Новая же ISA по определению не будет иметь такой базы, так что дополнительные расходы на аппаратуру и энергопотребление, требуемые для трансляции, сложно оправдать: почему бы сразу не использовать более простую ISA? RISC -подобные load-store наборы команд известны как минимум уже 50 лет, с эпохи CDC 6600 Сэймюра Крея. Тогда как 80x86 выиграл войны за ПК, RISC доминирует в планшетах и телефонах пост-ПК эры. В 2013 г. было продано более 10 миллиардов ARM, в сравнении с 0.3 миллиардами x86. Повторяя то, что мы уже говорили в 1980 4 , мы считаем, что RISC - лучший выбор для свободной и открытой ISA.

Более того, новая RISC ISA может быть лучше своих предшественников, если при её разработке учесть их ошибки:

  1. Исключение слишком многого: отсутствие команд load/store для байт и полуслов в первом варианте Alpha ISA и отсутствие load/store для чисел с плавающей запятой в MIPS I.
  2. Включение излишнего: встроенный сдвиг в инструкциях ARM и регистровые окна SPARC.
  3. Влияние микроархитектурных деталей на ISA: отложенные переходы в MIPS и SPARC, барьеры-ловушки для чисел с плавающей запятой на Alpha.

Для удовлетворения потребностей рынка встраиваемых решений, RISC-и даже предоставили решение проблемы размера кода: ARM Thumb и MIPS16 добавили 16-битные форматы для того, чтобы код был даже короче, чем у 80x86. Таким образом, существует общепризнанное соглашение о том, как в целом должна выглядеть хорошая RISC ISA.

Аргументы за использование существующей свободной открытой RISC ISA

Уже существует три свободных и открытых RISC ISA 5:
  • SPARC V8 - к чести Sun Microsystems, она сделала SPARC V8 стандартом IEEE в 1994.
  • OpenRISC - GNU-лицензированный open-source проект, начатый в 2000, с 64-битной ISA законченной в 2011.
  • RISC-V - в 2010, частично из-за ограничений ARM на свой IP и из-за отсутствия 64-битных режимов, а также из-за общей гротескности ARM v7, мы и наши студенты Andrew Waterman и Yunsup Lee разработали RISC-V 6 (произносится как «RISC-5») для нужд наших исследований и преподавательской деятельности и выпустили её под BSD-лицензией.

Так как обычно на то, чтобы отшлифовать все тонкости, уходят годы - вызревание OpenRISC заняло 11 лет, а у RISC-V ушло 4 года, - более правильно будет начать с уже существующей ISA, а не формировать комитет и начинать с нуля. Все RISC похожи, так что любая из них может быть хорошим кандидатом.

Так как ISA могут существовать десятилетиями, необходимо сперва экстраполировать и описать будущий ландшафт информационных технологий, чтобы понять, какие особенности могут оказаться важными, для облегчения процесса приоритезации. Скорее всего, преобладать будут три платформы: IoT - миллиарды дешёвых устройств с IP-адресами и доступом в Интернет; 2) персональные мобильные устройства, такие как современные телефоны и планшеты; 3) дата-центры (Warehouse-Scale Computers, WSCs). Можно иметь разные ISA для каждого типа платформ, однако жизнь будет проще, если она всюду будет одна. Такая картина будущего предлагает четыре ключевых требования на неё.

1. Формат «базовая ISA плюс расширения» 7 . Для повышения эффективности и уменьшения затрат SoC-системы добавляют собственные специфичные для приложения акселераторы. Для этого, а также чтобы поддерживать стабильную кодовую базу, свободная открытая ISA должна иметь: а) небольшое ядро инструкций, которые известны компиляторам и ОС, б) стандартные, но опциональные расширения для частых частных сценариев адаптации SoC к конкретному приложению, в) пространство для полностью новых кодов инструкций для работы акселераторов.

2. Компактная кодировка команд. Меньший объём кода желателен из-за чувствительности цены IoT-приложений к объёму используемой памяти.

3. Четверная точность (QP, quadruple-precision) вычислений над числами с плавающей запятой в дополнение к двойной и одинарной точностям. Некоторые приложения, исполняющиеся в дата-центрах сегодня, обрабатывают настолько большие объёмы данных, что они уже сейчас используют программные библиотеки для QP.

4. 128-битная адресация в дополнение к 32- и 64-битной. Ограничения по памяти IoT-устройств означают, что 32-битная адресация ещё долгое время будет актуальной. 64-битные адреса - де-факто стандарт для всех больших систем. Хотя промышленность WSC не потребует всех 2 128 байт, вполне правдоподобно, что через десятилетие понадобятся числа, превышающие 2 64 (16 эксабайт), для адресации хранилищ SSD. Ограниченный размер пространства адресов - одна из тех ошибок ISA, которые сложно исправить 8 , разумно планировать большие адреса уже сейчас.

Следующая таблица суммирует информацию о трёх свободных открытых ISA по этим четырём критериям, а также по наличию поддержки компиляторами и портированными ОС.

Аргументы в поддержку RISC-V как свободной открытой ISA

Наше сообщество должно объединиться вокруг единой ISA, чтобы проверить, что свободная открытая ISA может работать на практике. Только RISC-V удовлетворяет всем четырём требованиям. Она также от 10 до 20 лет моложе остальных RISC, так что мы имели возможность проанализировать и исправить их ошибки, такие как слоты задержки переходов SPARC и OpenRISC. Поэтому система команд RISC-V простая и понятная (см. таблицы 4 и 5 оригинальной статьи, а также www.riscv.org). В дополнение к тому, что остальные ISA не выполняют многие требования, есть вопросы к тому, что 64-битный SPARC V9 - проприетарный, а OpenRISC потерял импульс.
RISC-V всё ещё имеет большой импульс. Таблица 1 перечисляет различные группы, проектирующие SoC на основе RISC-V. Отчасти из-за использования высокопродуктивной, открытой системы проектирования аппаратуры Chisel 9 , университет Беркли имеет уже 8 типов чипов и новые разработки в процессе. Таблица 2 показывает, что одно 64-битное ядро RISC-V занимает половину площади, потребляет половину от мощности и при этом работает быстрее, чем 32-битный ARM с похожим конвеером или тем же техпроцессом. Хотя сложно полностью устранить нашу предвзятость в этом вопросе, мы полагаем, что RISC-V - лучший и безопасный выбор для свободной открытой RISC ISA. Поэтому мы будем проводить серию семинаров 10 для расширения сообщества RISC-V и, вдохновлённые примерами из таблицы 3, планируем создать некоммерческий фонд для задачи сертификации реализаций, а также для поддержки и развития ISA.

Заключение

Наши доводы даже более ясны для открытой ISA, чем для открытой ОС, так как ISA меняются очень медленно, тогда как алгоритмические инновации и новые приложения требуют непрерывной эволюции ОС. Также, как и TCP/IP, это - стандарт на интерфейс, который легче поддерживать и развивать по сравнению с ОС.

Открытые ISA использовались и раньше, но они никогда не становились популярными из-за недостатка спроса в них. Низкая цена и энергопотребление IoT, желание иметь альтернативу 80x86 для дата-центров и тот факт, что процессорные ядра - лишь малая, но вездесущая часть всех SoC, комбинируются в то предложение, способное удовлетворить возникший спрос. RISC-V нацелен в первую очередь на SoC, с базовым набором никогда не меняющихся команд, учитывая долгую жизнь идей RISC, с медленно эволюционирующим подмножеством опциональных расширений, а также уникальными инструкциями, которые никогда не будут переиспользованы. Хотя первый плацдарм для RISC-V может быть IoT или WSC, наша цель шире: так же, как Linux стал стандартной ОС для большинства вычислительных устройств, мы представляем себе RISC-V как стандартную ISA для всех вычислительных устройств будущего.

Предыдущие части:

Создание архитектуры RISC

Как уже неоднократно упоминалось, все х86-процессоры, решения компании Motorola и подавляющее большинство выпущенных в 1980-е годы кристаллов имели архитектуру CISC (Complex Instruction Set Computing). Совокупность всех особенностей привела к тому, что чипы стали не только сложными и дорогими в производстве, но и достигли своего потолка производительности. Для дальнейшего увеличения быстродействия требовалось наращивать количество транзисторов, однако освоенные технологические нормы не позволяли создавать более сложные решения. С этим столкнулась Intel при выпуске семейства i486. Для поднятия производительности они внесли изменения в архитектуру процессоров, добавив кэш-память, множители и конвейеры. Словом, 486-е «камни» получили некоторые «фишки» архитектуры RISC. Тем не менее к созданию RISC-платформы американская компания никакого отношения не имеет. Своим созданием архитектура обязана американскому инженеру Дэвиду Паттерсону, который руководил проектом Berkeley RISC с 1980 по 1984 годы.

Дэвид Паттерсон - отец RISC

Первоначальной идеей, которая затем воплотилась в столь масштабный проект Berkeley RISC, стало исследование работы Motorola 68000. В ходе наблюдений выяснилось, что программы попросту не использовали подавляющее большинство инструкций, заложенных в процессор. Например, система Unix при компиляции использовала лишь 30% команд. Поэтому в рамках проекта Berkeley RISC планировалось создать такой процессор, который бы содержал лишь самые необходимые инструкции.

После нескольких лет исследований и разработки было выпущено несколько образцов процессоров, название которых и дало имя всей архитектуры. Сама аббревиатура RISC расшифровывается как Restricted (Reduced) Instruction Set Computer, что переводится как «компьютер с сокращенным набором команд». «Сокращенный набор команд» вовсе не означает, что количество инструкций меньше, чем число команд CISC-кристаллов. Разница состоит в том, что любая инструкция платформы RISC является простой и выполняется за один такт (по крайней мере, должна выполняться), тогда как на выполнение RISC-инструкции могло уходить несколько десятков тактов. При этом длина команды является фиксированной. Например, 32 бита. Также у RISC имеется гораздо больше регистров общего назначения. Плюс для этой архитектуры характерна конвейеризация. Именно ее использование (вкупе с упрощенными командами) позволяет эффективно наращивать тактовую частоту процессоров RISC.

Команда проекта Berkeley RISC

Дебютными решениями стали RISC I и RISC II - детища Паттерсона и проекта Berkeley RISC. Первый содержал более чем 44 000 транзисторов и работал на частоте 4 МГц. Такой процессор при выполнении небольших программ был в среднем в два раза быстрее VAX 11/780 и примерно в четыре раза производительнее, чем «камень» Zilog Z8000. RISC II отличался от предшественника большим количеством инструкций: 39 против 32. Он был более быстрым. Его преимущество над процессором VAX достигало 200%, а Motorola 68000 в некоторых программах был медленнее примерно в четыре раза.

Нужно отметить, что Berkeley RISC был частью большого проекта под названием VLSI. Сюда также входил проект Стэнфордского университета MIPS, который стартовал в 1981 году.

Процессоры MIPS

Главой проекта MIPS был ученый Стэнфордского университета Джон Хэннесси. Как и в случае с Berkeley RISC, задачей стартапа было исследование и создание такого процессора, который использовал бы конвейер и сокращенный набор команд. Архитектура MIPS-решений также предусматривала наличие вспомогательных блоков в составе кристалла: например, модулей для работы с памятью, целочисленного АЛУ (арифметико-логическое устройство) и декодеров команд. Отличием плана MIPS от Berkeley RISC было использование удлиненного конвейера. Архитектура RISC, в принципе, предполагает использование конвейера, но Хэннесси пошел дальше и предложил максимально удлинить конвейер в процессоре, то бишь еще больше «раздробить» выполнение одной операции. Такой подход открывал еще большие просторы по наращиванию тактовой частоты. При этом удлинение конвейера обеспечивало более эффективное распараллеливание выполнения команд. В то время распараллеливание являлось отличительной чертой RISC-архитектуры, поскольку ни в одном CISC-процессоре эта функция не была реализована вплоть до появления в них конвейеров. Например, в MIPS, так же как и в RISC, выполнение одной команды могло быть еще не завершено, когда начиналась выполняться другая. В процессорах CISC для старта выполнения одной инструкции было необходимо, чтобы была окончена обработка другой.

Джон Хэннесси - создатель архитектуры MIPS, а ныне президент Стэнфордского университета

В первоначальной спецификации процессоров MIPS не была предусмотрена поддержка таких элементарных операций, как умножение и деление. Сделано это было специально. Таким образом, разработчики хотели избавиться от необходимости использования так называемых блокировок конвейера. Сама блокировка представляла собой приостановку конвейера в тех случаях, когда операцию на определенной стадии конвейера невозможно выполнить за один такт. Тем не менее первые реализации архитектуры MIPS работали с блокировками и даже поддерживали операции умножения и деления. Прошло некоторое время, прежде чем в процессорах была реализована первоначальная задумка.

В 1984 году Хэннесси покинул Стэнфордский университет и основал компанию MIPS Computer Systems, которая и занялась выпуском процессоров с одноименной архитектурой. Спустя год увидел свет первый продукт компании - 32-битный «камень» R2000. Он стал первой коммерчески доступной RISC-моделью в истории. В 1988 году появился процессор следующего поколения под названием R3000. В сравнении с R2000 он получил поддержку многопроцессорности и кэш-памяти инструкций и данных. «Трехтысячный» оказался коммерчески успешным. Процессор использовался в серверных системах и рабочих станциях таких компаний, как Silicon Graphics, DEC, Seiko Epson и многих других. Плюс R3000 стал сердцем игровой консоли Sony PlayStation.

Процессор MIPS R3000

На разработку следующего поколения MIPS-процессоров ушло три года. Процессор R4000 был представлен в 1991 году. Он получил 64-битную архитектуру, встроенный сопроцессор и работал на более высокой тактовой частоте, нежели предшественники. Так, минимальная частота R4000 составляла 100 МГц. Объем кэш-памяти инструкций и данных составлял 8 Кбайт каждый. Спустя два года была представлена доработанная версия процессора с индексом R4400. Новый кристалл обладал увеличенным вдвое кэшем и поддерживал кэш-память второго уровня большего объема. Помимо этого, были исправлены многочисленные ошибки при работе в 64-разрядном режиме.

Удивительно, что, несмотря на коммерческий успех своих процессоров, MIPS испытывала финансовые трудности и в конечном счете была куплена компанией SGI и переименована в MIPS Technologies. Следом начались выдаваться лицензии на производство клонов сторонним компаниям. Так, компания QED (Quantum Effects Devices) создала недорогие MIPS-процессоры, которые использовались в маршрутизаторах Cisco. А NEC занималась производством «камня» VR4300, который «прописался» в игровой консоли Nintendo 64.

Процессор NEC VR4300 использовался в приставке Nintendo 64

В 1994 году появился процессор R8000. Он стал первым MIPS-решением с суперскалярной архитектурой, которая подразумевает параллельное выполнение команд при условии, что исполнение одной команды не зависит от результата другой. Например, R8000 умел обрабатывать до четырех инструкций за такт.

В январе 1996 года MIPS представила процессор следующего поколения под названием R10000. «Десятитысячный» использовал такую же суперскалярную архитектуру, как и R8000, и, по сути, являлся доработанной версией предшественника. Также процессор имел кэш-память инструкций и данных объемом 32 Кбайт каждая и работал на частоте 175 МГц или 195 МГц. В 1997 году даже появилась версия чипа с частотой 250 МГц. Но даже при параметре 195 МГц R10000 был одним из быстрейших процессоров того времени.

Процессор R10000, произведенный компанией Toshiba

К сожалению, после запуска R10000 компания SGI забросила MIPS-архитектуру. Все последующие кристаллы основывались на ядре «десятитысячного» и не имели в сравнении с ним каких-то принципиальных отличий. Например, процессор R12000, представленный в 1998 году, получил дополнительную стадию в конвейер и улучшенную работу с очередями инструкций. Его тактовая частота составляла 270 МГц, 300 МГц или 360 МГц. После R12000 вышли еще два поколения процессоров MIPS: R14000 и R16000. Они получили поддержку более быстрых системных шин, увеличенные частоты и кэш-память большего объема. Например, R16000 мог работать на частоте 700 МГц и поддерживал 64 Кбайт кэш-памяти инструкций и данных.

После этого MIPS занялась продажей лицензий на 32-битную и 64-битную архитектуры MIPS32 и MIPS64.

Процессоры SPARC

Компания Sun Microsystems также решилась на разработку архитектуры - SPARC (Scalable Processor ARChitecture). Так, инженеры черпали вдохновение из проекта Berkeley RISC. А сам Дэвид Паттерсон даже привлекался к проекту в качестве консультанта. Тем не менее в результате SPARC больше напоминала MIPS-архитектуру. Например, в наборе команд платформы также отсутствовали инструкции умножения и деления. Особенностью архитектуры SPARC стало использование регистрового окна, с помощью которого был немного изменен процесс вызова функций в программах. Обычно при вызове программ процессор запоминал свое состояние (то есть запоминал состояние некоторых регистров общего и специального назначения), переходил к выполнению функции, а затем возвращался в свое исходное состояние до вызова функции. А в процессорах SPARC при вызове функции необходимые данные записывались в конец регистрового окна, а само регистровое окно перемещалось по файлу так, чтобы данные оказывались в начале окна. Такой подход в теории обеспечивал более высокую скорость работы.

Процессор SPARC V7, изготовленный компанией Fujitsu

Первая версия архитектуры получила название SPARC V7. Одноименный процессор на ее базе производился вплоть до 1992 года. Затем появилась следующая генерация архитектуры - SPARC V8. Она не претерпела каких-либо кардинальных изменений. Ключевыми отличиями стало добавление операций умножения и деления, а также улучшенное выполнение арифметики чисел с плавающей запятой. Как и SPARC V7, SPARC V8 оставалась 32-битной архитектурой, на базе которой был создан процессор microSPARC. Он принадлежал к Low-End-сегменту и использовался в небольших рабочих станциях и встраиваемых системах. Силами компаний Texas Instruments и Fujitsu также были выпущены улучшенные клоны. Более производительным решением стал процессор SuperSPARC.

Созданием следующего поколения архитектуры с именем SPARC V9 работала уже целая организация SPARC Architecture Committee, в состав которой, кроме самой Sun, входили такие компании, как Texas Instruments, Fujitsu, Philips и многие другие. Платформа была расширена до 64 бит и являлась суперскалярной с 9-стадийным конвейером. SPARC V9 предусматривала использование кэш-памяти первого уровня, разделенного на инструкции и данные объемом 16 Кбайт каждая, а также второго уровня емкостью 512-4096 Кбайт. Реализацией архитектуры стал процессор UltraSPARC с частотой 143-200 МГц.

Процессор UltraSPARC II

UltraSPARC не был единственным процессором с архитектурой SPARC V9. В 1997 году был представлен UltraSPARC II.

Процессоры ARM

История ныне популярных ARM-процессоров, а точнее самой архитектуры ARM, начинается с компании Acorn Computers и ее компьютера BBC Micro. В нем использовался «камень» MOS Technology 6502, однако его производительности было недостаточно, чтобы создать десктоп следующего поколения. По различным причинам другие доступные процессоры также не подходили под требования Acorn, поэтому в компании задумались о создании собственного чипа. После изучения различных архитектур, инженеры Acorn взяли за основу процессоры RISC и все тот же кристалл MOS Technology 6502.

Компьютер BBC Micro

У процессора MOS, например, была позаимствована архитектура доступа к памяти и набор инструкций. Каждая инструкция была дополнена специальным четырехбитным кодом условия. В зависимости от значения кода (true или false) инструкция могла выполняться или не выполняться. Это позволило сократить количество переходов при выполнение операций, которые негативно влияли на производительность конвейерной архитектуры. Также разработчики заложили в первоначальную ревизию архитектуры команды, которые выполняли несколько элементарных операций. Словом, немного отступили от правил RISC. Однако в конечном счете это лишь улучшило производительность процессора.

Разработка архитектуры была завершена в 1985 году созданием процессора ARM. Первые же коммерческие варианты появились в 1986 году и носили название ARM2. По сравнению с CISC-процессорами, ARM2 был очень простым - он содержал всего 30 000 транзисторов. При этом он потреблял очень мало энергии и в то же время был достаточно производительным. Несколько позже появились и ARM-процессоры, в которые были добавлены 4 Кбайт кэш-памяти, что еще больше повысило производительность кристаллов.

Процессор ARM2

К концу 1980-х годов Acorn занималась разработкой архитектуры ARM уже не в одиночку – к ней присоединилась Apple. В связи с этим подразделение, занимавшееся непосредственно ARM-процессорами, было преобразовано в отдельную компанию – Advanced RISC Machines. Первым продуктом новой компании стало процессорное ядро ARM6 и процессор ARM610, который использовался в одном из первых в мире КПК Apple Newton.

Однако ARM-процессоры уже не могли соперничать с CISC-решениями в плане производительности, а в RISC-сегменте господствовали процессоры с архитектурой MIPS. Тогда в ARM пошли иным путем. Компания начала позиционировать ARM6 как встраиваемое ядро, которое любой сторонний производитель мог использовать в своих процессорах за небольшие деньги. Такая политика принесла свои плоды, и ядро ARM стало очень популярным, а сама компания - коммерчески успешной.

Вместе с компанией DEC была разработана архитектура для более производительных ARM-решений под названием StrongARM, которое представляло собой классическую скалярную архитектуру с 5-стадийным конвейером. Архитектура имела блоки управления памятью и поддерживала кэш-память инструкций и данных объемом 16 Кбайт каждая.

Первый процессор на базе StrongARM - SA-110 - был представлен в феврале 1996 года. Он работал на тактовых частотах 100 МГц, 160 МГц или 200 МГц. «Камень» использовался в Apple MessagePad 2000, а также системах Acorn Computer Risc PC и Eidos Optima. На протяжении 1996 года SA-110 оставался самым производительным мобильным процессором.

Apple MessagePad 2000 использовал процессор SA-110

В 1997 году права на архитектуру StrongARM были проданы компании Intel, которая занялась разработкой следующего поколения платформы. В 2000 году оно было представлено, но архитектура (а точнее реализация архитектуры) носила другое название - Xscale. Платформа получила множество изменений. Например, длина конвейера была увеличена до 8 стадий. Объем кэш-памяти как для инструкций, так и для данных увеличился до 32 Кбайт. XScale использовался в таких устройствах, как RIM Blackberry, Dell Axim, мобильном телефоне Motorola A780 и других девайсах.

Процессоры PowerPC

Если быть уж совсем точным, то первой компанией, начавшей разработку RISC-архитектуры, стала IBM. Еще в 1974 году стартовала разработка процессора IBM 801, которая и заложила первые основы для этой платформы. А проект Berkeley RISC окончательно сформировал архитектуру.

В начале 80-х годов некоторые процессоры IBM для встраиваемых систем использовали архитектуру 801. Процессор на его базе также «прописался» в компьютере IBM 9370.

В 1985 году IBM начала разработку RISC-архитектуры следующего поколения. Проект получил название America Project. Разработка процессора и набора инструкций для него закончилась в 1990 году. Сам кристалл получил название POWER1 и использовался в серверах и рабочих станциях IBM. Он обладал достаточно высоким уровнем производительности, но имел многочиповую компоновку и состоял из 11 различных микросхем. В 1992 году IBM представила бюджетный вариант процессора POWER1, который умещался в одном чипе.

Процессор POWER1. Даже, скорее, чипсет

В 1993 году была представлена второе поколение архитектуры POWER2. В него было добавлено по одному дополнительному блоку арифметико-логических операций и вычислений с плавающей запятой. Также был расширен набор команд: например, была добавлена операция вычисления квадратного корня из числа на аппаратном уровне. Тактовая частота процессора варьировалась от 55 МГц до 71 МГц, а кэш-память данных и инструкций - 256 Кбайт и 32 Кбайт соответственно. Как и предшественник, новый процессор имел многочиповую компоновку. Но в мае 1994 года была выпущена и одночиповая версия.

Однако еще до выхода POWER2 IBM вместе с Apple и Motorola образовали альянс AIM и договорились о создании улучшенной архитектуры на основе POWER. В выигрыше остались все три компании, получив один из самых быстрых RISC-процессоров на рынке. Разработанная совместно архитектура получила название PowerPC. Помимо базового набора функций платформы POWER, в нее были добавлены поддержка работы в двух режимах (big-endian и little-endian), новые инструкции для вычислений с плавающей запятой и обратная совместимость с 32-битным режимом работы для 64-разрядной версии архитектуры.

Процессор PowerPC первого поколения

В отличие от других RISC-архитектур, которые занимали узкие ниши рынка, PowerPC позиционировалась как платформа-конкурент x86. Ее основным назначением являлись персональные компьютеры. Так, процессор на базе PowerPC довольно долгое время использовался в компьютерах Apple Macintosh - вплоть до 2006 года.

Архитектура конкурировала наравне с x86 до 2001 года, но после этого угнаться за процессорами Intel и AMD не смогла. Несмотря на это, процессоры на базе PowerPC использовались в игровых консолях Sony PlayStation 3 и Microsoft Xbox 360.

Консоли Sony PlayStation 3 и Microsoft Xbox 360 работают под управлением процессора PowerPC

В 90-е годы IBM успела выпустить третью генерацию процессоров под названием POWER3, которая, по сути, стала реализацией 64-разрядной архитектуры PowerPC. Чип создавался с прицелом на использование в серверах и рабочих станциях, но в итоге его главным применением стали системы IBM RS/6000.

Процессоры DEC Alpha

Архитектура DEC VAX безнадежно устаревала и в начале 90-х в компании задумались о разработке собственной RISC-платформы. Ей стала Alpha, выпущенная в 1994 году. Первым процессором стал Alpha 21064 с кодовым названием EV4. Это 64-разрядный суперскалярный кристалл с конвейерной архитектурой. То есть имел классический RISC-дизайн. Процессор DEC выгодно отличала отлаженная работа всех его блоков. Так, при равной с другими «камнями» частоте EV4 показывал более высокую производительность. Внешняя шина процессора была 128-разрядной. Он имел 16 Кбайт кэш-памяти данных и инструкций и изготавливался с помощью технологии CMOS-4. Тактовая частота EV4 составляла 150 МГц или 200 МГц. Несколько позже появилась модификация под названием 21064A, которая могла работать на скоростях вплоть до 300 МГц, что обеспечило кристаллу звание самого быстрого процессора того времени. Основным применением EV4 стали серверы и рабочие станции.

Процессор Alpha 21064

Alpha 21064A оставался топовой моделью DEC до выхода следующего поколения процессоров - 21164 (EV5). Он обладал двумя целочисленными блоками и двумя модулями вычислений с плавающей запятой. В EV5 было уже три уровня кэш-памяти: два располагались непосредственно в процессоре, а третий был внешним. Кэш-память первого уровня была разделена на две части: кэш данных и кэш инструкций объемом 8 Кбайт каждый. Объем кэш-памяти второго уровня составлял 96 Кбайт. Тактовая частота процессора варьировалась от 266 МГц до 333 МГц. Alpha 21164 перенял пальму первенства у Alpha 21064A и был быстрейшим процессором до выхода Pentium Pro. Тем не менее, ответ DEC не заставил себя долго ждать - компания выпустила более производительный процессор Alpha 21164A, работающий на более высоких тактовых частотах (до 666 МГц). Процессор использовался в рабочих станциях и серверных компьютерах таких компаний, как Digital, Network Appliance и Cray Research.

Процессор Alpha 21264

В 1996 году было представлено следующее поколение процессоров DEC - Alpha 21264 (EV6). Чип получил несколько важных изменений по сравнению с предшествующими моделями. Например, он поддерживал внеочередное исполнение инструкций, что повлекло за собой полную реорганизацию ядра. Целочисленные блоки и блоки загрузки/сохранения были объединены в единый модуль Ebox, а блоки вычислений с плавающей запятой выделены в модуль Fbox. Помимо самих блоков, эти юниты содержали еще и файлы регистров. Структура кэш-памяти опять стала двухуровневой - она пришла на смену трехуровневой организации кэша в Alpha 21164. Кэш первого уровня сохранил разделение на память для инструкций и для данных. Объем каждой части составлял 64 Кбайт. Что касается кэш-памяти второго уровня, то ее объем мог составлять от 1 Мбайт до 16 Мбайт. Плюс процессор получил поддержку предсказания ветвлений. С течением времени выпускались все новые и новые версии процессоров Alpha 21264, в которых, прежде всего, наращивалась тактовая частота. Последней модификацией стал Alpha 21264E, который работал на частоте 1250 МГц.

Увы, но линейка процессоров Alpha 21264 стала последней в истории «независимой» DEC. В начале 1998 года DEC признали банкротом, и она была поглощена компанией Compaq.

Архитектура Intel P5

Процессоры с архитектурой RISC в своем большинстве заняли свою специализированную нишу, однако в настольных системах все равно продолжали использоваться кристаллы с архитектурой x86. Их развитие продолжалось, пусть и с некоторыми изменениями.

Несмотря на то, что Intel вышла на рынок RISC-процессоров со своими решениями i860 и i960, основную ставку в компании все же делали на x86-кристаллы. Следующим поколением «камней» стали всем известные Pentium на базе архитектуры P5, выпущенные в 1993 году.

Была проделана большая работа. Во-первых, P5 стала суперскалярной. Архитектура работала с помощью двух конвейеров, каждый из которых мог выполнять две операции за такт. Во-вторых, шина данных стала 64-битной, что позволило передавать вдвое больший объем данных за цикл. В-третьих, кэш-память данных и инструкций была разделена на два отдельных блока объемом 8 Кбайт каждый. Помимо этого, в процессор был добавлен блок предсказания ветвлений, а модуль вычислений с плавающей запятой стал более производительным.

Первые процессоры линейки Pentium работали на частотах 60 МГц или 66 МГц. При этом для их работы требовалось напряжение 5 В, поэтому они сильно грелись. Также первые «пни» прославились неправильной работой блока вычислений с плавающей запятой, который в некоторых случаях при выполнении деления чисел выдавал неверный результат. Поэтому вскоре Intel запустила в продажу процессоры с исправленной архитектурой P54C.

Процессор Intel Pentium

P54C стала своего рода работой над ошибками. Производство новых процессоров было переведено на 0,6-мкм техпроцесс. Сами кристаллы теперь работали с напряжением 3,3 В, что позволило решить проблему с перегревом. Что касается изменений на уровне архитектуры, то в P54C был добавлен полуторный множитель - отныне процессоры работали на более высокой частоте, чем системная шина. Скорость работы процессоров составляла 75 МГц, 90 МГц или 100 МГц. Также P54C устанавливались в разъемы Socket 5 или Socket 7. В отличие от P5, которые поддерживали только Socket 4. Сама архитектура P54C еще раз получила обновление в 1995 году, когда была переведена на 350-нм техпроцесс. Это позволило вновь снизить энергопотребление кристаллов, а также увеличить их тактовую частоту до 200 МГц.

· Введение

RISC (Reduced Instruction Set Computer) – компьютер с сокращённым набором команд. RISC характеризуется следующими свойствами:

· Фиксированная длина машинных инструкций (например, 32 бита) и простой формат команды.

· Специализированные команды для операций с памятью - чтения или записи. Операции вида «прочитать-изменить-записать» отсутствуют. Любые операции «изменить» выполняются только над содержимым регистров (архитектура load-and-store).

· Большое количество регистров общего назначения (32 и более).

· Отсутствие поддержки операций вида «изменить» над укороченными типами данных - байт, 16-битное слово. Так, например, система команд DEC Alpha содержала только операции над 64-битными словами, и требовала разработки и последующего вызова процедур для выполнения операций над байтами, 16- и 32-битными словами.

· Отсутствие микропрограмм внутри самого процессора. То, что в CISC процессоре исполняется микропрограммами, в RISC процессоре исполняется как обыкновенный (хотя и помещённый в специальное хранилище) машинный код, не отличающийся принципиально от кода ядра ОС и приложений.

Типичные для RISC решения:

· Спекулятивное исполнение . При встрече с командой условного перехода процессор исполняет (или, по крайней мере, читает в кэш инструкций) сразу обе ветви до тех пор, пока не окончится вычисление управляющего выражения перехода. Позволяет отказаться от простоев конвейера при условных переходах.

· Переименование регистров . Каждый регистр процессора на самом деле представляет собой несколько параллельных регистров, хранящих несколько версий значения. Используется для реализации спекулятивного исполнения.

RISC процессор имеет повышенное быстродействие за счёт упрощения инструкций, чтобы их декодирование было более простым, а время выполнения - короче. Первые RISC процессоры даже не имели инструкций умножения и деления. Это также облегчает повышение тактовой частоты и делает более эффективной суперскалярность (распараллеливание инструкций между несколькими исполнительными блоками).

В первых архитектурах, причисляемых к RISC, большинство инструкций для упрощения декодирования имеют одинаковую длину и похожую структуру, арифметические операции работают только с регистрами, а работа с памятью идёт через отдельные инструкции загрузки (load) и сохранения (store). Эти свойства и позволили лучше сбалансировать этапы конвейеризации, сделав конвейеры в RISC значительно более эффективными и позволив поднять тактовую частоту.

Фокусирование на простых инструкциях и ведёт к архитектуре RISC, цель которой - сделать инструкции настолько простыми, чтобы они легко конвейеризировались и тратили не более одного такта на каждом шаге конвейера на высоких частотах.


Позднее было отмечено, что наиболее значимая характеристика RISC в разделении инструкций для обработки данных и обращения к памяти - обращение к памяти идёт только через инструкции load и store, а все прочие инструкции ограничены внутренними регистрами. Это упростило архитектуру процессоров: позволило инструкциям иметь фиксированную длину, упростило конвейеры и изолировало логику, имеющую дело с задержками при доступе к памяти, только в двух инструкциях. В результате RISC-архитектуры стали называть также архитектурами load/store.

«Сокращённый набор команд» неверно понимается как минимизация количества инструкций в системе команд. В действительности, инструкций у многих RISC процессоров больше, чем у CISC процессоров. На самом деле сокращён объём (и время) работы для каждой отдельной инструкции - как максимум один цикл доступа к памяти. Сложные инструкции CISC-процессоров могут требовать сотен циклов доступа к памяти для своего выполнения.

Первая система, которая может быть названа RISC системой, это суперкомпьютер CDC 6600, который был создан в 1964 Сеймуром Крем. Позднее появилась шутка, что термин RISC на самом деле расшифровывается как «Really invented by Seymour Cray» («На самом деле придуман Сеймуром Крэем»).

Первая попытка создать RISC процессор на чипе была предпринята в IBM в 1975. Эта работа привела к созданию семейства процессоров IBM 801, которые был выпущен в форме чипа под именем ROMP в 1981. ROMP расшифровывается как Research OPD (Office Product Division) Micro Processor, то есть «Исследовательский МП». Затем последовало несколько исследовательских проектов, в результате одного из которых появилась система POWER.

После того, как процессоры архитектуры x86 были переведены на суперскалярную RISC архитектуру, можно сказать, что подавляющее большинство существующих ныне процессоров основаны на архитектуре RISC.

RISC-архитектура предполагает реализацию в ЭВМ сокра­щенного набора простейших, но часто употребляемых команд, что позволяет упростить аппаратурные средства процессора и благодаря этому получить возможность повысить его быстро­действие.

При использовании RISC-архитектуры выбор набора команд и структуры процессора (микропроцессора) направлены на то, чтобы команды набора выполнялись за один машинный цикл процессора. Выполнение более сложных, но редко встречающих­ся операций обеспечивают подпрограммы..

В ЭВМ с RISC машинным циклом называют время, в течение которого производится выборка двух операндов из регистров, выполнение операции в АЛУ и запоминание результата в регист­ре. Большинство команд в RISC являются быстрыми командами типа «регистр - регистр» и выполняются без обращений к ОП. Обращения к ОП сохраняются лишь в командах загрузки регистров из памяти и запоминания в ОП. Чтобы это было возможным, про­цессор должен содержать достаточно большое число общих регистров.

Благодаря характерным для RISC-архитектуры особенно­стям - сокращенному набору команд (обычно не более 50-100), небольшому числу (обычно 2-3) простых способов адре­сации (в основном регистровой), небольшому числу простых форматов команд с фиксированными размерами и функциональ­ным назначением их полей - упрощается управляющее устрой­ство процессора, который в этом случае обходится без микро­программного уровня управления и управляющей памяти, и его УУ может быть выполнено на «схемной логике».

Уменьшение количества выполняемых команд и другие отме­ченные выше особенности RISC-архитектуры приводят к столь значительному упрощению структуры процессора, что становит­ся возможной его реализация на одном кристалле вместе с большим регистровым файлом и кэшем.

Большое число регистров, особенно при наличии обеспечива­ющего их эффективное использование «оптимизирующего ком­пилятора», позволяет до предела сократить обращение к ОП пу­тем сохранения нарегистрах промежуточных результатов, передачи через регистры операндов из одних программ в другие программы или подпрограммы, отказа от передач на сохранение в ОП содержимого регистров при прерываниях.

Особенностью RISC-архитектуры является механизм пере­крывающихся регистровых окон, предназначенный для уменьше­ния числа обращений к ОП и межрегистровых передач, что способствует повышению производительности ЭВМ.

Процедурам динамически выделяются небольшие группы регистров фиксированной длины (регистровые окна). Окна по­следовательно выполняемых процедур перекрываются, благода­ря чему возможна передача параметров от одной процедуры к другой При вызове процедуры процессор переключается на работу с другим регистровым окном, при этом не возникает необходимости в передаче содержимого регистров в память.



Окно состоит из трех подгрупп регистров (рис. 9.21). Первая подгруппа содержит параметры, переданные данной процедуре от ее вызвавшей, и результаты для вызывающей процедуры при возврате в нее. Вторая подгруппа содержит локальные перемен­ные процедуры. Третья, являясь буфером для двустороннего обмена между данной и ею вызываемой следующей процедура­ми, передает последней параметры от данной, которая, в свою очередь, получает через этот буфер результаты от ею вызванной процедуры. Таким образом, одна и та же подгруппа для данной процедуры является регистрами временного хранения, а для следующей - регистрами параметров. Отдельное окно, доступ­ное всем процедурам программы, выделяется для ее глобальных переменных.

В настоящее время за рубежом выпущен ряд микропроцессоров с RISC-архитектурой. Примером являются высокопроизводительные станции на базе микропроцессора Alpha 21264, микропроцессор для WindowsCE Intel StrongARM.

Несмотря на начавшееся использование RISC-архитектуры в выпускаемой промышленностью ЭВМ, продолжаются дискус­сии вокруг достоинств и недостатков этой архитектуры. К по­следним, в частности, относят большую длину кода программы после компиляции по сравнению с длиной кода машин обычной архитектуры. Например, при эмуляции команд x86 в среднем на каждую его команду требу­ется пять-шесть команд машины с RISC-архитектурой. Однако, как показали исследования, выигрыш в скорости выполнения команд перекрывает проигрыш от удлинения объектного кода программы.

В 1989 фирме Intel удалось на основе RISC-архитектуры создать однокри­стальный микропроцессор 80860, который практически представ­ляет собой кремниевый эквивалент суперЭВМ Gray-1.

Классификация архитектур микропроцессоров

Развитие архитектуры ЭВМ, направленное на повышение их производительности, во многих случаях идет по пути усложне­ния процессоров путем расширения системы (набора) команд, введения сложных команд, выполняющих процедуры, приближа­ющиеся к примитивам языков высокого уровня, увеличения числа используемых способов адресации и т. д.

Однако расширение и усложнение набора команд порожда­ют и ряд нежелательных побочных эффектов.

Расширение набора команд, увеличение числа способов ад­ресации, введение сложных команд сопровождаются увеличени­ем длины кода команды, в первую очередь, кода операции, что может приводить к использованию «расширяющегося кода опе­рации», увеличению числа форматов команд. Это вызывает ус­ложнение и замедление процесса дешифрации кода операции и других процедур обработки команд. Возрастающая сложность процедур обработки команд заставляет прибегать к микропрог­раммным управляющим устройствам с управляющей памятью вместо более быстродействующих УУ с «жесткой» («схемной») логикой.

Усложнение процессора делает более трудным или даже невыполнимым реализацию его на одном кристалле интеграль­ной микросхемы, что благодаря сокращению длин межсоеди­нений могло бы облегчить достижение высокой производи­тельности.

Анализ кода программ, генерируемого компиляторами языков высокого уровня, показал, что практически используется только ограниченный набор простых команд форматов "регистр, регистр -> регистр" и "регистр <-> па­мять". Компиляторы не в состоянии эффективно использовать сложные ко­манды. Именно это наблюдение способствовало формированию концепции процес­соров с сокращенным набором команд, так называемых RISC-процессоров.

Другим обстоятельством, фактически приведшим к появлению RISC-процессоров, было развитие архитектуры конвейерных процессоров типа Cray. В этих процессорах используются отдельные наборы команд для ра­боты с памятью и отдельные наборы команд для преобразования информа­ции в регистрах процессора. Каждая такая команда единообразно разбива­ется на небольшое количество этапов с одинаковым временем исполнения (выборка команды, дешифрация команды, исполнение, запись результата), что позволяет построить эффективный конвейер процессора, способный каждый такт выдавать результат исполнения очередной команды.

Однако конвейерность исполнения команд породила проблемы, свя­занные с зависимостями по данным и управлению между последовательно запускаемыми в конвейер командами. Например, если очередная команда использует результат предыдущей, то ее исполнение невозможно в тече­ние нескольких тактов, необходимых для получения этого результата. Аналогичные проблемы возникают при исполнении команд перехода по условию, когда данные, по которым производится переход, к моменту де­шифрации команды условного перехода еще не готовы.

Эти проблемы решаются либо компилятором, устанавливающим оче­редность запуска команд в конвейере и вставляющим команды "Нет опе­рации" при невозможности запуска очередной команды, либо специаль­ной аппаратурой процессора, отслеживающей зависимости между коман­дами и устраняющей конфликты.

После обособления RISC-процессоров в отдельный класс, процессоры с традиционными наборами команд стали называться CISC-процессорами с полным набором команд. Как правило, в этих процессорах команды имеют много разных форматов и требуют для своего представления раз­личного числа ячеек памяти. Это обусловливает определение типа коман­ды в ходе ее дешифрации при исполнении, что усложняет устройство управ­ления процессора и препятствует повышению тактовой частоты до уров­ня, достижимого в RISC-процессорах на той же элементной базе.

Очевидно, что RISC-процессоры эффективны в тех областях примене­ния, в которых можно продуктивно использовать структурные способы уменьшения времени доступа к оперативной памяти. Если программа ге­нерирует произвольные последовательности адресов обращения к памяти и каждая единица данных используется только для выполнения одной ко­манды, то фактически производительность процессора определяется вре­менем обращения к основной памяти. В этом случае использование сокра­щенного набора команд только ухудшает эффективность, так как требует пересылки операндов между памятью и регистром вместо выполнения команд "память, память - память". Программист должен учитывать необ­ходимость локального размещения обрабатываемых данных, чтобы при пересылках между уровнями памяти по возможности все данные пересы­лаемых блоков данных принимали участие в обработке. Если программа будет написана так, что данные будут размещены хаотично и из каждого пересылаемого блока данных будет использоваться только небольшая их часть, то скорость обработки замедлится в несколько раз до скорости ра­боты основной памяти. В качестве примера приведем в таблице 1.1 ре­зультаты замеров производительности микропроцессора Alpha 21066 233 Мгц при реализации преобразования Адамара при n = 8 - 20.

Таблица 1.1 Производительность микропроцессора Alpha 2I066 при выполнении преобразования Адамара

Пример показывает, что, пока данные размещаются во внутрикристальной кэш-памяти, производительность высока. Как только объем данных превышает размер кэш-памяти и обращения в память идут в "равномер­но" распределенные по объему адреса, производительность падает более, чем в 7 раз.

Развитие микропроцессоров происходит при постоянном стремлении со­хранения преемственности программного обеспечения (ПО) и повышения производительности за счет совершенствования архитектуры и увеличения тактовой частоты. Сохранение преемственности ПО и повышение произво­дительности, вообще говоря, противоречат друг другу. Процессоры с сис­темой команд х86, относящиеся к классу CISC-процессоров, имеют более низкие тактовые частоты по сравнению с микропроцессорами ведущих ком­паний-изготовителей RISC-процессоров. Существуют приложения, на ко­торых производительность х86 микропроцессоров значительно ниже, чем у RISC-процессоров, реализованных на той же элементной базе. Однако воз­можность использования совместимого ПО для различных поколений х86 процессоров, выпущенных в течение последнего десятилетия, обеспечивает им устойчивое доминирующее положение на рынке.

В настоящее время на основе пионерских разработок компаний NexGen и AMD, подхваченных компанией Intel, предпринята попытка решить пробле­му повышения производительности в рамках архитектуры х86. Эти компа­нии в последних разработках, сохраняя преемственность по системе команд с CISC-микропроцессорами семейства х86, создают новые устройства с исполь­зованием элементов RISC-архитектуры. Примером такого подхода могут слу­жить микропроцессоры Nx586 (NexGen), K5, К6 (AMD), Pentium PRO, Pentium II (Intel), использующие концепцию разделенной (decoupled) архи­тектуры и RISC ядра. В микропроцессор встраивается аппаратный трансля­тор, превращающий команды х86, в команды RISC-процессора. При этом одна команда х86 может порождать до четырех команд RISC-процессора. Исполнение команд происходит как в развитом суперскалярном процессоре. Компания Intel использовала этот подход в своем микропроцессоре Pentium Pro, что весьма укрепило ее позиции на фоне достижений RISC-архитектур.

Суперскалярные процессоры