stringtranslate.com

Ортогональный набор инструкций

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

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

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

Основные понятия

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПДП-11

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

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

ВАКС-11

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

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

код операции [ операнд ] [ операнд ] ...

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

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

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

Разработчики Motorola попытались сделать язык ассемблера ортогональным, в то время как базовый машинный язык был несколько менее ортогональным. В отличие от PDP-11, MC68000 (68k) использовал отдельные регистры для хранения данных и адресов данных в памяти. ISA был ортогонален в той степени, что адреса могли использоваться только в этих регистрах, но не было никаких ограничений на то, какой из регистров мог использоваться различными инструкциями. Аналогично, регистры данных также были ортогональны между инструкциями. В отличие от PDP-11, 68000 поддерживал только один общий режим адресации для двухпараметрических инструкций. Другим параметром всегда был регистр, за исключением MOV. Инструкции MOV поддерживали все режимы адресации для обоих параметров. [9]

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

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

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

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

РИСК

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

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

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

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

Примечания

  1. ^ См . оцифровку .
  2. ^ адрес — это простые двоичные числа, которые можно рассматривать как данные
  3. ^ Даже в современных компьютерах производительность максимизируется за счет хранения данных в кэше — ограниченном ресурсе.
  4. ^ предполагая, что адрес не может быть использован

Ссылки

  1. ^ Null, Линда; Lobur, Джулия (2010). Основы организации и архитектуры компьютеров . Jones & Bartlett Publishers. стр. 287–288. ISBN 978-1449600068.
  2. ^ Тарик, Джамиль (1995), «RISC против CISC: почему меньше значит больше», IEEE Potentials (август/сентябрь) , получено 7 мая 2019 г.
  3. ^ "Основы организации и проектирования компьютеров" (PDF) . Лаборатория вычислительных сенсорно-моторных систем.
  4. ^ abcde Туллсен, Дин. «Архитектура набора инструкций» (PDF) . UCSD.
  5. ^ abcdefg Хеннесси, Джон; Паттерсон, Дэвид (2002-05-29). Архитектура компьютера: количественный подход. Elsevier. стр. 151. ISBN 9780080502526.
  6. ^ «Введение в PDP-11». Сиднейский университет .
  7. ^ ab "Справочник инструкций PDP-11" (PDF) . Университет Торонто .
  8. ^ abc «Другой подход к архитектуре набора команд — VAX» (PDF) .
  9. ^ Веронис, Эндрю (2012-12-06). Микропроцессор 68000. Springer. стр. 54. ISBN 9781468466478.
  10. ^ Тилсон, Майкл (октябрь 1983 г.). «Перенос Unix на новые машины». BYTE . стр. 266. Получено 31 января 2015 г.
  11. ^ "NS32532". Datormuseum .
  12. ^ Паттерсон, ДА ; Дитцель, Д.Р. (1980). «Дело в пользу компьютера с сокращенным набором команд». ACM SIGARCH Computer Architecture News . 8 (6): 25–33. CiteSeerX 10.1.1.68.9623 . doi :10.1145/641914.641917. S2CID  12034303. 
  13. ^ Таненбаум, Эндрю (1978). «Влияние структурного программирования на архитектуру машины». Communications of the ACM . 21 (3): 237–246. doi : 10.1145/359361.359454 . hdl :1871/2610. S2CID  3261560.