В информатике архитектура набора инструкций ( ISA ) — это абстрактная модель , которая в целом определяет, как программное обеспечение управляет центральным процессором в компьютере или семействе компьютеров. [1] Устройство или программа, которые выполняют инструкции, описанные этой ISA, например центральный процессор (ЦП), называется реализацией этой ISA.
В общем случае ISA определяет поддерживаемые инструкции , типы данных , регистры , аппаратную поддержку для управления основной памятью , [ необходимо разъяснение ] основные характеристики (такие как согласованность памяти , режимы адресации , виртуальная память ) и модель ввода-вывода реализаций ISA.
ISA определяет поведение машинного кода, работающего на реализациях этой ISA, таким образом, который не зависит от характеристик этой реализации, обеспечивая двоичную совместимость между реализациями. Это позволяет использовать несколько реализаций ISA, которые отличаются по таким характеристикам, как производительность , физический размер и денежная стоимость (среди прочего), но которые способны выполнять один и тот же машинный код, так что менее производительная, менее дорогая машина может быть заменена более дорогой, более производительной машиной без необходимости замены программного обеспечения. Это также позволяет развивать микроархитектуру реализаций этой ISA, так что более новая, более производительная реализация ISA может запускать программное обеспечение, работающее на предыдущих поколениях реализаций.
Если операционная система поддерживает стандартный и совместимый прикладной двоичный интерфейс (ABI) для конкретного ISA, машинный код будет работать в будущих реализациях этого ISA и операционной системы. Однако, если ISA поддерживает работу нескольких операционных систем, это не гарантирует, что машинный код для одной операционной системы будет работать в другой операционной системе, если только первая операционная система не поддерживает запуск машинного кода, созданного для другой операционной системы.
ISA может быть расширена путем добавления инструкций или других возможностей, или добавления поддержки для более крупных адресов и значений данных; реализация расширенной ISA все еще сможет выполнять машинный код для версий ISA без этих расширений. Машинный код, использующий эти расширения, будет работать только в реализациях, которые поддерживают эти расширения.
Обеспечиваемая ими двоичная совместимость делает ISA одной из самых фундаментальных абстракций в вычислительной технике .
Архитектура набора инструкций отличается от микроархитектуры , которая представляет собой набор методов проектирования процессора , используемых в конкретном процессоре для реализации набора инструкций. Процессоры с разными микроархитектурами могут совместно использовать общий набор инструкций. Например, Intel Pentium и AMD Athlon реализуют почти идентичные версии набора инструкций x86 , но у них радикально разные внутренние конструкции.
Концепция архитектуры , отличная от конструкции конкретной машины, была разработана Фредом Бруксом в IBM на этапе проектирования System/360 .
До NPL [System/360] разработчики компьютеров компании могли свободно соблюдать цели стоимости не только путем выбора технологий, но и путем разработки функциональных и архитектурных усовершенствований. Цель совместимости SPREAD, напротив, постулировала единую архитектуру для серии из пяти процессоров, охватывающих широкий диапазон стоимости и производительности. Ни одна из пяти групп инженеров-проектировщиков не могла рассчитывать на возможность внесения корректировок в архитектурные спецификации как способ облегчения трудностей в достижении целей стоимости и производительности. [2] : стр.137
Некоторые виртуальные машины , поддерживающие байт-код в качестве своего ISA, такие как Smalltalk , виртуальная машина Java и Microsoft Common Language Runtime , реализуют это путем трансляции байт-кода для часто используемых путей кода в машинный код. Кроме того, эти виртуальные машины выполняют менее часто используемые пути кода путем интерпретации (см.: Компиляция Just-in-time ). Transmeta реализовала набор инструкций x86 поверх процессоров VLIW таким образом.
ISA можно классифицировать несколькими способами. Распространенная классификация — по архитектурной сложности . Компьютер со сложным набором инструкций (CISC) имеет много специализированных инструкций, некоторые из которых могут использоваться в практических программах лишь изредка. Компьютер с сокращенным набором инструкций (RISC) упрощает процессор, эффективно реализуя только те инструкции, которые часто используются в программах, в то время как менее распространенные операции реализуются как подпрограммы, что компенсирует дополнительное время выполнения процессора за счет редкого использования. [3]
Другие типы включают архитектуры с очень длинными командными словами (VLIW) и тесно связанные с ними архитектуры с длинными командными словами (LIW) [ требуется ссылка ] и явно параллельными командными вычислениями (EPIC). Эти архитектуры стремятся использовать параллелизм на уровне команд с меньшим количеством оборудования, чем RISC и CISC, возлагая ответственность за выдачу команд и планирование на компилятор . [4]
Были изучены архитектуры с еще меньшей сложностью, такие как компьютер с минимальным набором инструкций (MISC) и компьютер с одним набором инструкций (OISC). Это теоретически важные типы, но они не были коммерциализированы. [5] [6]
Машинный язык состоит из дискретных утверждений или инструкций . В архитектуре обработки данная инструкция может определять:
Более сложные операции создаются путем объединения этих простых инструкций, которые выполняются последовательно или иным образом, как предписано инструкциями потока управления .
Примеры операций, общих для многих наборов инструкций, включают в себя:
Процессоры могут включать в свой набор инструкций "сложные" инструкции. Одна "сложная" инструкция делает что-то, что может потребовать много инструкций на других компьютерах. Такие инструкции типичны для инструкций, которые выполняют несколько шагов, управляют несколькими функциональными блоками или иным образом появляются в большем масштабе, чем основная масса простых инструкций, реализованных данным процессором. Вот некоторые примеры "сложных" инструкций:
Сложные инструкции чаще встречаются в наборах инструкций CISC, чем в наборах инструкций RISC, но наборы инструкций RISC также могут их включать. Наборы инструкций RISC обычно не включают операции ALU с операндами памяти или инструкции для перемещения больших блоков памяти, но большинство наборов инструкций RISC включают SIMD или векторные инструкции, которые выполняют одну и ту же арифметическую операцию над несколькими фрагментами данных одновременно. Инструкции SIMD обладают способностью манипулировать большими векторами и матрицами за минимальное время. Инструкции SIMD позволяют легко распараллеливать алгоритмы, обычно используемые при обработке звука, изображений и видео. Различные реализации SIMD были выведены на рынок под такими торговыми наименованиями, как MMX , 3DNow! и AltiVec .
В традиционных архитектурах инструкция включает в себя код операции , который определяет операцию для выполнения, например, добавление содержимого памяти в регистр , и ноль или более спецификаторов операндов , которые могут указывать регистры , ячейки памяти или литеральные данные. Спецификаторы операндов могут иметь режимы адресации, определяющие их значение, или могут находиться в фиксированных полях. В архитектурах с очень длинными командными словами (VLIW), которые включают в себя множество архитектур микрокодов , несколько одновременных кодов операций и операндов указываются в одной инструкции.
В некоторых экзотических наборах инструкций нет поля кода операции, например в архитектурах с транспортным запуском (TTA), а есть только операнд(ы).
Большинство стековых машин имеют наборы инструкций « 0-операнд », в которых арифметические и логические операции не имеют полей спецификаторов операндов; спецификаторы операндов есть только у инструкций, которые помещают операнды в стек вычислений или выталкивают операнды из стека в переменные. Набор инструкций выполняет большинство действий ALU с помощью постфиксных ( обратная польская запись ) операций, которые работают только со стеком выражений , а не с регистрами данных или произвольными ячейками основной памяти. Это может быть очень удобно для компиляции языков высокого уровня, поскольку большинство арифметических выражений можно легко перевести в постфиксную запись. [8]
Условные инструкции часто имеют поле предиката — несколько битов, которые кодируют определенное условие, чтобы вызвать выполнение операции, а не невыполнение. Например, инструкция условного перехода передаст управление, если условие истинно, так что выполнение перейдет в другую часть программы, и не передаст управление, если условие ложно, так что выполнение продолжится последовательно. Некоторые наборы инструкций также имеют условные перемещения, так что перемещение будет выполнено, и данные будут сохранены в целевом местоположении, если условие истинно, и не будут выполнены, и целевое местоположение не будет изменено, если условие ложно. Аналогично, IBM z/Architecture имеет инструкцию условного хранения. Несколько наборов инструкций включают поле предиката в каждую инструкцию; это называется предикатом ветвления .
Наборы инструкций можно классифицировать по максимальному количеству операндов, явно указанных в инструкциях.
(В следующих примерах a , b и c являются (прямыми или вычисленными) адресами, ссылающимися на ячейки памяти, тогда как reg1 и т. д. ссылаются на машинные регистры.)
С = А+Б
push a
, push b
, add
, pop c
.C = A+B
требуется четыре инструкции . [10] Для стековых машин термины «0-операнд» и «нулевой адрес» применяются к арифметическим инструкциям, но не ко всем инструкциям, поскольку для доступа к памяти используются инструкции push и pop с 1 операндом.load a
, add b
, store c
.C = A+B
нужно три инструкции . [10]move A
в C ; затем add B
в C .C = A+B
требует двух инструкций . Это эффективно «сохраняет» результат без явной инструкции сохранения .load a,reg1
; add b,reg1
; store reg1,c
; Это требует пары загрузки/сохранения для любого перемещения памяти независимо от того, add
является ли результат расширением, сохраненным в другом месте, как в C = A+B
, или в том же месте памяти: A = A+B
.C = A+B
нужно три инструкции .load a,reg1
; load b,reg2
; add reg1,reg2
; store reg2,c
.C = A+B
необходимо четыре инструкции .add a,b,c
C = A+B
нужна одна инструкция .move a,reg1
; add reg1,b,c
;C = A+B
нужны две инструкции .load a,reg1
; load b,reg2
; add reg1+reg2->reg3
; store reg3,c
;C = A+B
необходимо четыре инструкции .Из-за большого количества бит, необходимых для кодирования трех регистров инструкции с 3 операндами, архитектуры RISC с 16-битными инструкциями неизменно являются конструкциями с 2 операндами, например, Atmel AVR, TI MSP430 и некоторые версии ARM Thumb . Архитектуры RISC с 32-битными инструкциями обычно являются конструкциями с 3 операндами, например, архитектуры ARM , AVR32 , MIPS , Power ISA и SPARC .
Каждая инструкция явно указывает некоторое количество операндов (регистров, ячеек памяти или непосредственных значений) . Некоторые инструкции задают один или оба операнда неявно, например, сохраняя их наверху стека или в неявном регистре. Если некоторые операнды заданы неявно, в инструкции нужно указать меньше операндов. Когда «операнд назначения» явно указывает назначение, необходимо указать дополнительный операнд. Следовательно, количество операндов, закодированных в инструкции, может отличаться от математически необходимого количества аргументов для логической или арифметической операции (арность ) . Операнды либо закодированы в представлении «кода операции» инструкции, либо заданы как значения или адреса, следующие за кодом операции.
Давление регистров измеряет доступность свободных регистров в любой момент времени выполнения программы. Давление регистров велико, когда используется большое количество доступных регистров; таким образом, чем выше давление регистров, тем чаще содержимое регистров должно быть выгружено в память. Увеличение количества регистров в архитектуре снижает давление регистров, но увеличивает стоимость. [12]
В то время как встроенные наборы инструкций, такие как Thumb, страдают от чрезвычайно высокого давления регистров, поскольку имеют небольшие наборы регистров, универсальные RISC ISA, такие как MIPS и Alpha, имеют низкое давление регистров. CISC ISA, такие как x86-64, предлагают низкое давление регистров, несмотря на меньшие наборы регистров. Это связано со многими режимами адресации и оптимизациями (такими как адресация подрегистров, операнды памяти в инструкциях ALU, абсолютная адресация, адресация относительно ПК и сбросы регистров в регистры), которые предлагают CISC ISA. [13]
Размер или длина инструкции сильно варьируется: от четырех бит в некоторых микроконтроллерах до многих сотен бит в некоторых системах VLIW . Процессоры, используемые в персональных компьютерах , мэйнфреймах и суперкомпьютерах, имеют минимальный размер инструкции от 8 до 64 бит. Самая длинная возможная инструкция на x86 составляет 15 байт (120 бит). [14] В пределах набора инструкций разные инструкции могут иметь разную длину. В некоторых архитектурах, особенно в большинстве компьютеров с сокращенным набором инструкций (RISC),Инструкции имеют фиксированную длину , обычно соответствующую размеру слова этой архитектуры. В других архитектурах инструкции имеют переменную длину , обычно кратную байту или полуслову . Некоторые, такие как ARM с расширением Thumb, имеют смешанную переменную кодировку, то есть две фиксированные, обычно 32-битную и 16-битную кодировки, где инструкции не могут свободно смешиваться, а должны переключаться между ними на ветви (или границе исключения в ARMv8).
Инструкции фиксированной длины проще в обработке, чем инструкции переменной длины, по нескольким причинам (например, нет необходимости проверять, выходит ли инструкция за пределы строки кэша или границы страницы виртуальной памяти [11] ), и поэтому их несколько легче оптимизировать для скорости.
В компьютерах начала 1960-х годов основная память была дорогой и очень ограниченной, даже на мэйнфреймах. Минимизация размера программы, чтобы убедиться, что она поместится в ограниченной памяти, часто была центральной. Таким образом, размер инструкций, необходимых для выполнения определенной задачи, плотность кода , был важной характеристикой любого набора инструкций. Она оставалась важной на изначально крошечных запоминающих устройствах мини-компьютеров, а затем и микропроцессоров. Плотность остается важной и сегодня для приложений для смартфонов, приложений, загружаемых в браузеры через медленные интернет-соединения, и в ПЗУ для встроенных приложений. Более общим преимуществом повышенной плотности является повышение эффективности кэшей и предварительной выборки инструкций.
Компьютеры с высокой плотностью кода часто имеют сложные инструкции для входа в процедуру, параметризованные возвраты, циклы и т. д. (поэтому ретроспективно названные компьютерами со сложным набором инструкций , CISC ). Однако более типичные или частые инструкции «CISC» просто объединяют базовую операцию ALU, такую как «сложение», с доступом к одному или нескольким операндам в памяти (используя такие режимы адресации , как прямой, косвенный, индексированный и т. д.). Определенные архитектуры могут допускать два или три операнда (включая результат) непосредственно в памяти или могут выполнять такие функции, как автоматическое увеличение указателя и т. д. Программно-реализованные наборы инструкций могут иметь еще более сложные и мощные инструкции.
Компьютеры с сокращенным набором инструкций (RISC ) впервые были широко внедрены в период быстро растущих подсистем памяти. Они жертвуют плотностью кода, чтобы упростить схему реализации, и пытаются увеличить производительность за счет более высоких тактовых частот и большего количества регистров. Одна инструкция RISC обычно выполняет только одну операцию, такую как «добавление» регистров или «загрузка» из ячейки памяти в регистр. Набор инструкций RISC обычно имеет фиксированную длину инструкций, тогда как типичный набор инструкций CISC имеет инструкции широко варьирующейся длины. Однако, поскольку компьютеры RISC обычно требуют больше и часто более длинных инструкций для реализации заданной задачи, они по своей сути менее оптимально используют пропускную способность шины и кэш-память.
Некоторые встроенные RISC ISA, такие как Thumb и AVR32, обычно демонстрируют очень высокую плотность благодаря технике, называемой сжатием кода. Эта техника упаковывает две 16-битные инструкции в одно 32-битное слово, которое затем распаковывается на этапе декодирования и выполняется как две инструкции. [15]
Компьютеры с минимальным набором инструкций (MISC) обычно являются формой стековой машины , где есть несколько отдельных инструкций (8–32), так что несколько инструкций могут быть помещены в одно машинное слово. Эти типы ядер часто требуют немного кремния для реализации, поэтому их можно легко реализовать в FPGA или в многоядерной форме. Плотность кода MISC аналогична плотности кода RISC; повышенная плотность инструкций компенсируется тем, что для выполнения задачи требуется больше примитивных инструкций. [16] [ неудачная проверка ]
Были проведены исследования по сжатию исполняемых файлов как механизму повышения плотности кода. Математика сложности Колмогорова описывает проблемы и ограничения этого.
На практике плотность кода также зависит от компилятора . Большинство оптимизирующих компиляторов имеют опции, которые контролируют, следует ли оптимизировать генерацию кода для скорости выполнения или для плотности кода. Например, GCC имеет опцию -Os для оптимизации для небольшого размера машинного кода и -O3 для оптимизации для скорости выполнения за счет большего машинного кода.
Инструкции, составляющие программу, редко указываются с использованием их внутренней числовой формы ( машинного кода ); они могут быть указаны программистами с использованием языка ассемблера или, что более распространено, могут быть сгенерированы из языков программирования высокого уровня компиляторами . [17]
Разработка наборов инструкций — сложный вопрос. В истории микропроцессора было два этапа. Первым был CISC (Complex Instruction Set Computer), в котором было много разных инструкций. Однако в 1970-х годах такие компании, как IBM, провели исследования и обнаружили, что многие инструкции в наборе можно исключить. Результатом стал RISC (Reduced Instruction Set Computer), архитектура, использующая меньший набор инструкций. Более простой набор инструкций может предложить потенциал для более высоких скоростей, уменьшения размера процессора и снижения энергопотребления. Однако более сложный набор может оптимизировать общие операции, улучшить эффективность памяти и кэша или упростить программирование.
Некоторые разработчики наборов инструкций резервируют один или несколько кодов операций для некоторого вида системного вызова или программного прерывания . Например, MOS Technology 6502 использует 00 H , Zilog Z80 использует восемь кодов C7,CF,D7,DF,E7,EF,F7,FF H [18] , а Motorola 68000 использует коды в диапазоне A000..AFFF H .
Быстрые виртуальные машины гораздо проще реализовать, если набор инструкций соответствует требованиям виртуализации Попека и Голдберга . [ необходимо разъяснение ]
Слайд NOP , используемый в программировании с учетом иммунитета, гораздо проще реализовать, если «незапрограммированное» состояние памяти интерпретировать как NOP . [ сомнительно – обсудить ]
В системах с несколькими процессорами неблокирующие алгоритмы синхронизации гораздо проще реализовать [ требуется ссылка ] , если набор инструкций включает поддержку таких операций, как « выборка и добавление », « условная загрузка-ссылка/сохранение » (LL/SC) или «атомарное сравнение и обмен ».
Данный набор инструкций может быть реализован различными способами. Все способы реализации конкретного набора инструкций обеспечивают одну и ту же модель программирования , и все реализации этого набора инструкций способны запускать одни и те же исполняемые файлы. Различные способы реализации набора инструкций дают различные компромиссы между стоимостью, производительностью, энергопотреблением, размером и т. д.
При проектировании микроархитектуры процессора инженеры используют блоки "жестко смонтированных" электронных схем (часто проектируемых отдельно), таких как сумматоры, мультиплексоры, счетчики, регистры, АЛУ и т. д. Затем часто используется какой-то язык передачи регистров для описания декодирования и упорядочивания каждой инструкции ISA с использованием этой физической микроархитектуры. Существует два основных способа построения блока управления для реализации этого описания (хотя многие конструкции используют промежуточные пути или компромиссы):
Некоторые микрокодированные конструкции ЦП с записываемым хранилищем управления используют его для изменения набора инструкций (например, процессор Rekursiv и Imsys Cjip). [19]
Процессоры, предназначенные для реконфигурируемых вычислений , могут использовать программируемые логические матрицы (ПЛИС).
ISA также может быть эмулирована в программном обеспечении с помощью интерпретатора . Естественно, из-за накладных расходов на интерпретацию это медленнее, чем прямой запуск программ на эмулируемом оборудовании, если только оборудование, на котором работает эмулятор, не на порядок быстрее. Сегодня это обычная практика для поставщиков новых ISA или микроархитектур, чтобы сделать программные эмуляторы доступными для разработчиков программного обеспечения до того, как будет готова аппаратная реализация.
Часто детали реализации оказывают сильное влияние на конкретные инструкции, выбранные для набора инструкций. Например, многие реализации конвейера инструкций допускают только одну загрузку памяти или сохранение памяти на инструкцию, что приводит к архитектуре загрузки-сохранения (RISC). В качестве другого примера, некоторые ранние способы реализации конвейера инструкций привели к слоту задержки .
Требования высокоскоростной цифровой обработки сигналов подтолкнули в противоположном направлении — заставив инструкции быть реализованными определенным образом. Например, чтобы выполнять цифровые фильтры достаточно быстро, инструкция MAC в типичном цифровом сигнальном процессоре (DSP) должна использовать своего рода архитектуру Гарварда , которая может извлекать инструкцию и два слова данных одновременно, и для этого требуется одноцикловый умножитель с накоплением .