WikiDer > Ортогональный набор инструкций
В компьютерная инженерия, ортогональный набор команд является архитектура набора команд где все типы инструкций могут использовать все режимы адресации. Это "ортогональный"в том смысле, что тип инструкции и режим адресации меняются независимо. Ортогональный набор инструкций не налагает ограничений, требующих, чтобы определенная инструкция использовала определенный регистр.[1] поэтому есть небольшое дублирование функциональности инструкций.[2]
Ортогональность считалась основной целью разработчиков процессоров в 1970-х годах, и VAX-11 часто используется в качестве эталона для этой концепции. Однако введение RISC философия дизайна 80-х годов значительно изменила тенденцию к большей ортогональности. Современные процессоры часто моделируют ортогональность на этапе предварительной обработки перед выполнением реальных задач в RISC-подобном ядре.
Базовые концепты
По своей сути, все компьютеры общего назначения работают одинаково; данные, хранящиеся в основная память читается центральное процессорное устройство (CPU) в быструю временную память (например, Регистры процессора), действует, а затем записывается обратно в основную память. Память состоит из набора значений данных, закодированных в виде чисел.[а] и упоминается их адреса, также числовое значение. Это означает, что те же операции, применяемые к данным, могут быть применены к самим адресам.[b] Во время работы данные могут временно храниться в регистры процессора, значения блокнота, к которым можно получить очень быстрый доступ. Регистры используются, например, при суммировании строк чисел в итог.[3]
Одна инструкция, один операнд
В ранних компьютерах архитектура набора команд (ISA) часто использовал один регистр, и в этом случае он был известен как аккумулятор. Инструкции включали адрес для операнда. Например, ДОБАВИТЬ адрес
Инструкция заставит ЦП извлечь число в памяти, найденное по этому адресу, а затем добавить его к значению, уже находящемуся в аккумуляторе. Этот очень простой пример ISA имеет "одноадресный формат", потому что каждая инструкция включает адрес данных.[4]
Недостаток одноадресных машин состоит в том, что даже простые действия, такие как сложение, требуют нескольких инструкций, каждая из которых занимает ограниченную память.[c] и требует времени для чтения. Рассмотрим простую задачу сложения двух чисел, 5 + 4. В этом случае программе придется загрузить значение 5 в аккумулятор с помощью ЗАГРУЗИТЬ адрес
инструкция, используйте ДОБАВИТЬ адрес
инструкция, указывающая на адрес для 4, и, наконец, СПАСТИ адрес
чтобы сохранить результат 9 обратно в другую ячейку памяти.[4]
Одна инструкция, несколько операндов
Дальнейшие улучшения можно найти, указав адрес обоих операндов в одной инструкции, например, ДОБАВИТЬ адрес 1, Адрес 2
. Такие ISA в "двухадресном формате" очень распространены. Можно дополнительно расширить концепцию до «трехадресного формата», где СПАСТИ
также складывается в развернутый ДОБАВИТЬ адрес 1, Адрес 2, адрес результата
.[4]
Часто бывает, что основные компьютерное слово намного больше, чем необходимо для хранения только инструкции и адреса, и в большинстве систем есть оставшиеся биты, которые можно использовать для хранения константы вместо адреса. Команды можно улучшить, если они позволяют заменять любой из операндов константой. Например, ДОБАВИТЬ адрес 1, константа 1
устраняет один цикл памяти, и ДОБАВИТЬ константа 1, константа 2
еще один.[4]
Множественные данные
Дальнейшая сложность возникает при рассмотрении общих шаблонов доступа к памяти. Один очень распространенный паттерн заключается в том, что одна операция может применяться к большому количеству похожих данных. Например, можно сложить 1000 чисел. В простом двухадресном формате инструкций,[d] нет возможности изменить адрес, поэтому нужно вписать 1000 дополнений в машинный язык. ISA решают эту проблему с помощью концепции косвенная адресация, в котором адрес следующей точки данных не является константой, а хранится в памяти. Это означает, что программист может изменить адрес, выполнив сложение в этой ячейке памяти. ISA также часто включают возможность смещения адреса от исходного местоположения путем добавления значения, хранящегося в одном из его регистров, в некоторых случаях специального индексный регистр. Другие выполняют это добавление автоматически, как часть инструкций по его использованию.[4]
Разнообразие режимы адресации приводит к обилию немного разных инструкций. Учитывая одноадресный ISA, даже для одной инструкции, ДОБАВИТЬ
, теперь у нас есть много возможных "режимов адресации":
- Немедленное (постоянное):
ADD.C константа 1
- добавляет постоянное значение к результату в аккумуляторе - Прямой адрес:
ДОБАВИТЬ адрес 1
- добавить значение, хранящееся по адресу 1 - Непрямая память:
ADD.M адрес 1
- прочитать значение в адресе 1, использовать это значение в качестве другого адреса и добавить это значение
Многие ISA также имеют регистры, которые можно использовать как для решения, так и для математических задач. Его можно использовать в одноадресном формате, если используется один адресный регистр. В этом случае становится доступен ряд новых режимов:
- Зарегистрируйтесь напрямую:
ADD.R регистр 1
- сложить значение, хранящееся в адресе, хранящемся в регистре один - Смещение:
ДОБАВИТЬ.D константа 1
- добавить константу в адресный регистр, а затем добавить значение, найденное в памяти в полученном месте - Показатель:
ADD.I регистр 1
- добавить значение регистра 1 в регистр адреса, чтобы создать новый адрес, а затем добавить значение в этом месте в аккумулятор - Автоиндекс:
ADD.AI регистр 1
- как в случае индекса, но автоматически увеличивает адрес
Ортогональность
Ортогональность - это принцип, согласно которому каждая инструкция должна иметь возможность использовать любой поддерживаемый режим адресации. В этом примере, если версия с прямой адресацией ДОБАВИТЬ
доступен, все остальные тоже должны быть. Причина такого дизайна не эстетическая, цель состоит в том, чтобы уменьшить общий размер программы. объектный код. Предоставляя различные режимы адресации, ISA позволяет программисту выбрать тот, который точно соответствует потребностям его программы в этот момент, и тем самым снижает необходимость использования нескольких инструкций для достижения одной и той же цели. Это означает, что общее количество инструкций сокращается, что позволяет сэкономить память и повысить производительность. Ортогональность часто описывалась как «очень эффективная».[5]
Поскольку конечная цель ортогонального дизайна - просто позволить любой инструкции использовать любой тип адреса, реализация ортогональности часто является просто случаем добавления дополнительных проводов между частями процессора. Однако это также усложняет декодер команд - схему, которая считывает инструкцию из памяти в месте, указанном счетчик команд а затем решает, как его обработать.[5]
В приведенном выше примере ISA ADD.C
инструкция, использующая прямое кодирование, уже имеет данные, необходимые для выполнения инструкции, и дальнейшая обработка не требуется, декодер просто отправляет значение в арифметико-логическое устройство (АЛУ). Однако если ДОБАВИТЬ
используется команда, адрес должен быть прочитан, значение в этой ячейке памяти прочитано, и затем ALU может продолжить. Эта серия событий займет гораздо больше времени и требует дополнительных внутренних шагов.[5]
В результате время, необходимое для выполнения различных вариантов инструкции, может сильно различаться, что усложняет общую конструкцию ЦП. Следовательно, ортогональность представляет собой компромисс в дизайне; разработчик компьютеров может предложить программисту больше режимов адресации, чтобы повысить плотность кода за счет усложнения самого процессора.[5]
Когда память была маленькой и дорогой, особенно в эпоху барабанная память или основная память, ортогональность была очень желательной. Однако сложность часто превышала то, что можно было бы достичь с помощью современных технологий. По этой причине большинство машин 1960-х годов предлагали только частичную ортогональность, насколько это было возможно для конструкторов. Это было в 1970-х, когда введение крупномасштабная интеграция значительно упростили компьютерные конструкции, и стали появляться полностью ортогональные конструкции. К 1980-м годам такие конструкции можно было реализовать на однокристальном процессоре.[5]
В конце 1970-х, когда появились первые мощные полностью ортогональные конструкции, цель расширилась и стала архитектура компьютера на языке высокого уровня, или сокращенно HLLCA. Так же, как ортогональность была желательна для улучшения битовой плотности машинного языка, целью HLLCA было улучшение битовой плотности языки высокого уровня любить АЛГОЛ 68. Эти языки обычно использовали запись активации, тип комплекса стек в котором хранятся временные значения, которые ISA обычно напрямую не поддерживают и должны быть реализованы с использованием множества отдельных инструкций из базового ISA. Добавление поддержки этих структур позволит более непосредственно транслировать программу в ISA.[5]
Ортогональность на практике
PDP-11
PDP-11 был по существу ортогональным (в первую очередь за исключением инструкций с плавающей запятой).[6] Большинство целочисленных инструкций могут работать как с 1-байтовыми, так и с 2-байтовыми значениями и могут обращаться к данным, хранящимся в регистрах, сохраненным как часть инструкции, хранящимся в памяти или хранящимся в памяти и указанным адресами в регистрах. Даже ПК и стек указатель на него могут повлиять обычные инструкции, использующие все обычные режимы данных. «Немедленный» режим (жестко запрограммированные числа в инструкции, такие как ADD # 4, R1 (R1 = R1 + 4), был реализован как режим «регистр косвенного, автоинкремент» и указание программного счетчика (R7) в качестве регистра для использования ссылки для косвенного и автоинкремента.[7]
PDP-11 использовал 3-битные поля для режимов адресации (0-7) и регистров (R0 – R5, SP, PC), поэтому было (электронно) 8 режимов адресации. Операнды немедленного и абсолютного адреса, применяющие два режима автоинкремента к Программному счетчику (R7), обеспечивают в общей сложности 10 концептуальных режимов адресации.[7]
VAX-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 был ортогонален до такой степени, что адреса можно было использовать только в этих регистрах, но не было ограничений на который регистров могут использоваться разными инструкциями. Точно так же регистры данных также были ортогональны по всем инструкциям.[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). Например, однобайтовые кодировки остаются для некоторых частых операций, таких как толкать и хлопать регистров и констант; и первичный аккумулятор, Регистр EAX, использует более короткие кодировки, чем другие регистры для определенных типов операций. Подобные наблюдения иногда используются для оптимизация кода как в компиляторах, так и в написанном вручную коде.
RISC
Ряд исследований 1970-х годов показал, что гибкость, обеспечиваемая ортогональными модами, редко или никогда не использовалась в реальных задачах. В частности, усилия по IBM изучили следы кода, запущенного на Система / 370 и продемонстрировал, что в реальных программах используется только часть доступных режимов. Подобные исследования, часто посвященные VAX, продемонстрировали ту же картину. В некоторых случаях было показано, что сложность инструкций означала, что они занимали больше времени для выполнения, чем последовательность более мелких инструкций, с каноническим примером этого является VAX ПОКАЗАТЕЛЬ
инструкция.[12]
В тот же период полупроводниковые запоминающие устройства быстро увеличивались в размерах и падали в цене. Однако их скорость не улучшалась с той же скоростью. Это означало, что время, необходимое для доступа к данным из памяти, росло в родственник сроки по сравнению со скоростью процессоров. Это приводило к включению большего количества регистров, что давало ЦП больше временных значений для работы. Большее количество регистров означало, что для кодирования номера регистра потребуется больше битов в машинном слове, что предполагало уменьшение количества самих инструкций, чтобы освободить место.
Наконец, статья Эндрю Таненбаум продемонстрировали, что 97% всех констант в программе находятся в диапазоне от 0 до 10, причем 0 представляет от 20 до 30% от общего числа. Кроме того, от 30 до 40% всех значений в программе являются константами, с простыми переменными (в отличие от массивов и т.п.) еще от 35 до 40%.[13] Если процессор использует большее командное слово, например 32-битное, две константы и номер регистра могут быть закодированы в одной команде, если сама инструкция не использует слишком много битов.
Эти наблюдения привели к отказу от ортогонального дизайна как основной цели дизайна процессора и к росту популярности RISC философия 1980-х гг. Процессоры RISC обычно имеют только два режима адресации: прямой (постоянный) и регистровый. Все остальные режимы, присутствующие в старых процессорах, обрабатываются явно с помощью инструкций загрузки и сохранения, перемещающих данные в регистры и из них. Только несколько режимы адресации могут быть доступны, и эти режимы могут различаться в зависимости от того, относится ли инструкция к данным или включает передача контроля.
Заметки
использованная литература
- ^ Null, Линда; Лобур, Юлия (2010). Основы компьютерной организации и архитектуры. Издательство "Джонс и Бартлетт". С. 287–288. ISBN 978-1449600068.
- ^ Тарик, Джамиль (1995), «RISC против CISC: почему меньше значит больше», Возможности IEEE (Август сентябрь), получено 7 мая 2019
- ^ "Основы компьютерной организации и дизайна" (PDF). Лаборатория вычислительных сенсомоторных систем.
- ^ а б c d е Таллсен, декан. "Архитектура набора команд" (PDF). UCSD.
- ^ а б c d е ж г Хеннесси, Джон; Паттерсон, Дэвид (2002-05-29). Компьютерная архитектура: количественный подход. п. 151. ISBN 9780080502526.
- ^ «Знакомство с PDP-11». Сиднейский университет.
- ^ а б «Справочник по инструкции PDP-11» (PDF). Университет Торонто.
- ^ а б c «Другой подход к архитектуре набора команд - VAX» (PDF). Бременский университет.
- ^ Веронис, Эндрю (2012-12-06). Микропроцессор 68000. п. 54. ISBN 9781468466478.
- ^ Тилсон, Майкл (октябрь 1983 г.). «Перенос Unix на новые машины». БАЙТ. п. 266. Получено 31 января 2015.
- ^ "NS32532". Datormuseum.
- ^ Паттерсон, Д.А.; Дитзель, Д. (1980). «Кейс для компьютера с сокращенным набором команд». Новости компьютерной архитектуры ACM SIGARCH. 8 (6): 25–33. CiteSeerX 10.1.1.68.9623. Дои:10.1145/641914.641917. S2CID 12034303.
- ^ Таненбаум, Эндрю (1978). «Последствия структурного программирования для машинной архитектуры». Коммуникации ACM. 21 (3): 237–246. Дои:10.1145/359361.359454. HDL:1871/2610. S2CID 3261560.