Набор ортогональных инструкций - Orthogonal instruction set

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

Ортогональность считалась основной целью разработчиков процессоров в 1970-х годах, и VAX-11 часто используется в качестве эталона для этой концепции. Однако внедрение философии дизайна RISC в 1980-х годах значительно изменило тенденцию к большей ортогональности. Современные процессоры часто моделируют ортогональность на этапе предварительной обработки перед выполнением реальных задач в RISC-подобном ядре.

Базовые концепты

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

Одна инструкция, один операнд

В ранних компьютерах архитектура набора команд (ISA) часто использовала один регистр, и в этом случае он был известен как аккумулятор . Инструкции включали адрес для операнда. Например, инструкция заставит ЦП извлечь число в памяти, найденное по этому адресу, а затем добавить его к значению, уже находящемуся в аккумуляторе. Этот очень простой пример ISA имеет "одноадресный формат", потому что каждая инструкция включает адрес данных. ADD address

Недостатком одноадресных машин является то, что даже простые действия, такие как сложение, требуют нескольких инструкций, каждая из которых занимает ограниченную память и требует времени для чтения. Рассмотрим простую задачу сложения двух чисел, 5 + 4. В этом случае программа должна будет загрузить значение 5 в аккумулятор с помощью инструкции, использовать инструкцию, указывающую на адрес для 4, и, наконец, сохранить результат. , 9, обратно в другую ячейку памяти. LOAD addressADD addressSAVE address

Одна инструкция, несколько операндов

Дальнейшие усовершенствования могут быть найдены путем обеспечения адреса обоих операндов в одной команде, например, . Такие ISA в "двухадресном формате" очень распространены. Можно дополнительно расширить эту концепцию до «трехадресного формата», где также сворачивается в расширенный . ADD address 1, address 2SAVEADD address 1, address 2, address of result

Часто бывает, что базовое компьютерное слово намного больше, чем необходимо для хранения только инструкции и адреса, и в большинстве систем есть оставшиеся биты, которые можно использовать для хранения константы вместо адреса. Команды можно улучшить, если они позволяют заменять любой из операндов константой. Например, устраняет один цикл памяти и другой. ADD address 1, constant 1ADD constant 1, constant 2

Множественные данные

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

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

  • Немедленно (константа): - добавляет постоянное значение к результату в аккумуляторе ADD.C constant 1
  • Прямой адрес: - добавить значение, хранящееся по адресу 1 ADD.A address 1
  • Косвенная память: - прочтите значение в адресе 1, используйте это значение в качестве другого адреса и добавьте это значение ADD.M address 1

Многие ISA также имеют регистры, которые можно использовать как для решения, так и для математических задач. Его можно использовать в одноадресном формате, если используется один адресный регистр. В этом случае становится доступен ряд новых режимов:

  • Прямой регистр: - добавить значение, хранящееся в адресе, хранящемся в первом регистре ADD.R register 1
  • Смещение: - добавьте константу в адресный регистр, затем добавьте значение, найденное в памяти в этом результирующем месте ADD.D constant 1
  • Индекс: - добавить значение регистра 1 в регистр адреса, чтобы создать новый адрес, а затем добавить значение в этом месте в аккумулятор. ADD.I register 1
  • Автоиндекс: - как в случае индекса, но автоматически увеличивает адрес ADD.AI register 1

Ортогональность

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

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

В приведенном выше примере ISA ADD.C инструкция, использующая прямое кодирование, уже имеет данные, необходимые для выполнения инструкции, и никакой дальнейшей обработки не требуется, декодер просто отправляет значение в арифметико-логический блок (ALU). Однако, если используется ADD.A инструкция, необходимо прочитать адрес, прочитать значение в этой ячейке памяти, и затем ALU может продолжить. Эта серия событий займет гораздо больше времени и требует дополнительных внутренних шагов.

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

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

В конце 1970-х, когда появились первые мощные полностью ортогональные конструкции, цель расширилась и стала компьютерной архитектурой на языке высокого уровня , или сокращенно HLLCA. Так же, как ортогональность была желательна для улучшения битовой плотности машинного языка, целью HLLCA было улучшение битовой плотности языков высокого уровня, таких как ALGOL 68 . Эти языки обычно использовали запись активации , тип сложного стека, в котором хранятся временные значения, которые ISA обычно не поддерживают напрямую и должны быть реализованы с использованием множества отдельных инструкций из базового ISA. Добавление поддержки этих структур позволит более непосредственно транслировать программу в ISA.

Ортогональность на практике

PDP-11

PDP-11 был по существу ортогональным (в первую очередь за исключением инструкций с плавающей запятой). Большинство целочисленных инструкций могут работать как с 1-байтовыми, так и с 2-байтовыми значениями и могут обращаться к данным, хранящимся в регистрах, сохраненным как часть инструкции, хранящимся в памяти или хранящимся в памяти и указанным адресами в регистрах. Даже ПК и указатель стека могут быть затронуты обычными инструкциями, использующими все обычные режимы данных. «Немедленный» режим (жестко запрограммированные числа в инструкции, такие как ADD # 4, R1 (R1 = R1 + 4), был реализован как режим «косвенный регистр, автоинкремент» и указание программного счетчика (R7) в качестве регистра для использования ссылки для косвенного и автоинкремента.

PDP-11 использовал 3-битные поля для режимов адресации (0-7) и регистров (R0 – R5, SP, PC), поэтому было (электронно) 8 режимов адресации. Операнды немедленного и абсолютного адреса, применяющие два режима автоинкремента к Программному счетчику (R7), обеспечивают в общей сложности 10 концептуальных режимов адресации.

VAX-11

VAX-11 продлен на PDP-11 по ортогональности для всех типов данных, включая числа с плавающей точкой. Инструкции, такие как ADD, были разделены на варианты, зависящие от размера данных, такие как ADDB, ADDW, ADDL, ADDP, ADDF для добавления байта, слова, длинного слова, упакованного BCD и с плавающей запятой одинарной точности соответственно. Как и PDP-11, указатель стека и счетчик программ находились в общем регистровом файле (R14 и R15).

Общая форма инструкции VAX-11 будет следующей:

opcode [ operand ] [ operand ]  ...

Каждый компонент представляет собой один байт , код операции имеет значение в диапазоне 0–255, а каждый операнд состоит из двух полубайтов , верхние 4 бита определяют режим адресации, а нижние 4 бита (обычно) определяют номер регистра (R0 – R15 ).

В отличие от 3-битных полей PDP-11, 4-битные суббайты VAX-11 привели к 16 режимам логической адресации (0–15). Однако режимы адресации 0–3 были «короткими и немедленными» для непосредственных данных размером 6 или менее бит (2 младших бита режима адресации были 2 старшими битами непосредственных данных, когда они добавлялись к оставшимся 4 битам. в этом байте адресации данных). Поскольку режимы адресации 0-3 были идентичны, это привело к 13 (электронным) режимам адресации, но, как и в PDP-11, использование указателя стека (R14) и программного счетчика (R15) позволило создать в общей сложности более 15 концептуальных режимов адресации. (программа на ассемблере переводит исходный код в реальный режим адресации на основе указателя стека или программного счетчика).

MC68000 и аналогичные

Разработчики Motorola пытались сделать ассемблер ортогональным, в то время как основной машинный язык был несколько менее ортогональным. В отличие от PDP-11, MC68000 (68k) использовал отдельные регистры для хранения данных и адресов данных в памяти. ISA был ортогонален до такой степени, что адреса можно было использовать только в этих регистрах, но не было никаких ограничений на то, какой из регистров может использоваться разными инструкциями. Точно так же регистры данных также были ортогональны по всем инструкциям.

Напротив, серия NS320xx была первоначально разработана как однокристальная реализация VAX-11 ISA. Хотя это пришлось изменить из-за юридических проблем, полученная система сохранила большую часть общей философии дизайна VAX-11 и осталась полностью ортогональной. Это включало устранение отдельных регистров данных и адресов, обнаруженных в 68k.

8080 и последующие разработки

8-разрядный микропроцессор Intel 8080 (а также 8085 и 8051) представлял собой слегка расширенную конструкцию на основе аккумулятора и, следовательно, не ортогонален. Программисту на ассемблере или составителю компилятора нужно было помнить о том, какие операции были возможны с каждым регистром: большинство 8-битных операций могло выполняться только с 8-битным аккумулятором (A-регистром), в то время как 16-битные операции могли выполняться. выполняется только для 16-битного указателя / накопителя (пара HL-регистров), тогда как простые операции, такие как инкремент, были возможны для всех семи 8-битных регистров. Во многом это было связано с желанием сохранить длину всех кодов операций в один байт.

В двоично-совместимой Z80 позже добавили префикс-коду , чтобы избежать от этого предела 1 байт и позволяет более мощный набор инструкций. Та же основная идея была использована для Intel 8086 , хотя для обеспечения более радикальных расширений бинарная совместимость с 8080 здесь не предпринималась. В то время он сохранял некоторую степень неортогональности ради высокой плотности кода. 32-битное расширение этой архитектуры, представленное с 80386 , было несколько более ортогональным, несмотря на сохранение всех инструкций 8086 и их расширенных аналогов. Тем не менее, используемая стратегия кодирования по- прежнему показывает много следов от 8008 и 8080 (и Z80). Например, однобайтовые кодировки сохраняются для некоторых частых операций, таких как отправка и извлечение регистров и констант; а первичный аккумулятор, регистр EAX , использует более короткие кодировки, чем другие регистры, для определенных типов операций. Подобные наблюдения иногда используются для оптимизации кода как в компиляторах, так и в коде, написанном вручную.

RISC

Ряд исследований 1970-х годов продемонстрировали, что гибкость, обеспечиваемая ортогональными модами, редко или никогда не использовалась в реальных задачах. В частности, сотрудники IBM изучали следы кода, выполняемого в System / 370, и продемонстрировали, что только часть доступных режимов используется в реальных программах. Подобные исследования, часто посвященные VAX, продемонстрировали ту же картину. В некоторых случаях было показано, что сложность инструкций означала, что они занимали больше времени для выполнения, чем последовательность более мелких инструкций, с каноническим примером этого является INDEX инструкция VAX .

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

Наконец, статья Эндрю Таненбаума продемонстрировала, что 97% всех констант в программе находятся в диапазоне от 0 до 10, причем 0 представляет от 20 до 30% от общего числа. Кроме того, от 30 до 40% всех значений в программе являются константами, с простыми переменными (в отличие от массивов и т.п.) еще от 35 до 40%. Если процессор использует большее командное слово, например 32-битное, две константы и номер регистра могут быть закодированы в одной команде, если сама инструкция не использует слишком много битов.

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

Примечания

Рекомендации

  1. ^ Ноль, Линда; Лобур, Юлия (2010). Основы компьютерной организации и архитектуры . Издательство "Джонс и Бартлетт". С. 287–288. ISBN   978-1449600068 .
  2. ^ Тарик, Джамиль (1995), «RISC против CISC: почему меньше значит больше» , IEEE Potentials (август / сентябрь) , получено 7 мая 2019 г.
  3. ^ "Основы компьютерной организации и дизайна" (PDF) . Лаборатория вычислительных сенсомоторных систем.
  4. ^ a b c d e Таллсен, декан. "Архитектура набора команд" (PDF) . UCSD.
  5. ^ a b c d e f g Хеннесси, Джон; Паттерсон, Дэвид (29 мая 2002 г.). Компьютерная архитектура: количественный подход . п. 151. ISBN.   9780080502526 .
  6. ^ «Введение в PDP-11» . Сиднейский университет .
  7. ^ a b «Справочник по инструкции PDP-11» (PDF) . Университет Торонто .
  8. ^ a b c «Другой подход к архитектуре набора команд - VAX» (PDF) . Бременский университет .
  9. ^ Веронис, Эндрю (2012-12-06). Микропроцессор 68000 . п. 54. ISBN   9781468466478 .
  10. ^ Тилсон, Майкл (октябрь 1983). «Перенос Unix на новые машины» . БАЙТ . п. 266 . Проверено 31 января 2015 года .
  11. ^ "NS32532" . Datormuseum .
  12. ^ Паттерсон, DA ; Дицель, Д.Р. (1980). «Кейс для компьютера с сокращенным набором команд». Новости компьютерной архитектуры ACM SIGARCH . 8 (6): 25–33. CiteSeerX   10.1.1.68.9623 . DOI : 10.1145 / 641914.641917 . S2CID   12034303 .
  13. ^ Таненбаум, Эндрю (1978). «Последствия структурного программирования для машинной архитектуры» . Коммуникации ACM . 21 (3): 237–246. DOI : 10.1145 / 359361.359454 . ЛВП : 1871/2610 . S2CID   3261560 .