В чем преимущество наличия инструкций в едином формате?
Многие процессоры имеют инструкции одинакового формата и ширины, такие как ARM, где все инструкции имеют 32-битную длину. другие процессоры имеют инструкции шириной, скажем, 2, 3 или 4 байта, например, 8086.
- В чем преимущество того, что все инструкции имеют одинаковую ширину и одинаковый формат?
- В чем преимущество наличия инструкций в нескольких размерах?
1 ответ
Компромиссы с инструкциями по фиксированной длине
Преимущества команд фиксированной длины с относительно равномерным форматированием заключается в том, что извлечение и анализ команд существенно проще.
Для реализации, которая извлекает одну инструкцию за цикл, единый доступ к памяти (кэш-памяти) фиксированного размера гарантированно обеспечивает одну (и только одну) инструкцию, поэтому буферизация или сдвиг не требуются. Также не нужно пересекать строку кэша или границу страницы в одной инструкции.
Указатель команд увеличивается на фиксированную величину (за исключением случаев выполнения команд потока управления - переходов и переходов) независимо от типа инструкции, поэтому местоположение следующей последовательной инструкции может быть доступно заранее с минимальной дополнительной работой (по сравнению с необходимостью хотя бы частично расшифровать инструкцию). Это также делает выборку и анализ более одной инструкции за цикл относительно простой.
Наличие единого формата для каждой инструкции позволяет выполнять простой анализ команды в ее компонентах (непосредственное значение, код операции, имена регистров источника, имя регистра назначения). Разбор имен регистров источника является наиболее критичным по времени; с этими фиксированными позициями можно начать считывать значения регистра до того, как будет определен тип инструкции. (Это чтение регистра является умозрительным, поскольку операция может фактически не использовать значения, но это предположение не требует какого-либо специального восстановления в случае ошибочного предположения, но требует дополнительной энергии.) В классическом 5-ступенчатом конвейере MIPS R2000 это позволило считывание значений регистров, которые должны быть начаты сразу после выборки инструкций, обеспечивая половину цикла для сравнения значений регистров и определения направления ветви; с (заполненным) интервалом задержки ветвления это позволило избежать остановок без прогнозирования ветвления.
(Разбор кода операции, как правило, менее критичен по времени, чем имена регистров источника, но чем раньше извлечен код операции, тем быстрее может начаться выполнение. Простой анализ имени регистра назначения упрощает обнаружение зависимостей между инструкциями; это, возможно, в основном полезно при попытке выполнить более одной инструкции за цикл.)
Помимо более быстрого анализа, более простое кодирование делает анализ менее трудоемким (использование энергии и транзисторная логика).
Незначительное преимущество команд фиксированной длины по сравнению с типичными кодировками переменной длины состоит в том, что адреса команд (и смещения ветвей) используют меньше битов. Это использовалось в некоторых ISA для предоставления небольшого дополнительного хранилища для информации о режиме. (Как ни странно, в таких случаях, как MIPS/MIPS16, указывать режим с инструкциями меньшей или переменной длины.)
Кодирование с фиксированной длиной и равномерное форматирование имеют недостатки. Наиболее очевидным недостатком является относительно низкая плотность кода. Длина инструкции не может быть установлена в соответствии с частотой использования или объемом необходимой информации. Строгое равномерное форматирование также может исключать неявные операнды (хотя даже MIPS использует неявное имя регистра назначения для регистра ссылки) и операнды переменного размера (большинство кодировок переменной длины RISC имеют короткие инструкции, которые могут получить доступ только к подмножеству общего числа регистры).
(В RISC-ориентированном ISA это имеет дополнительную незначительную проблему, заключающуюся в том, что в инструкцию не нужно включать больше работы, чтобы выровнять объем информации, требуемой инструкцией.)
Инструкции фиксированной длины также усложняют использование больших немедленных значений (постоянные операнды, включенные в инструкцию). Классические RISC ограничены непосредственными длинами до 16 бит. Если константа больше, она должна быть либо загружена в виде данных (что означает дополнительную инструкцию загрузки с ее накладными расходами на вычисление адреса, использование регистра, преобразование адреса, проверку тега и т. Д.), Либо вторая инструкция должна предоставить остальную часть константы, (MIPS предоставляет немедленную команду с высокой загрузкой, частично исходя из предположения, что большие константы в основном используются для загрузки адресов, которые впоследствии будут использоваться для доступа к данным в памяти. PowerPC обеспечивает несколько операций с использованием непосредственных высоких значений, что позволяет, например, добавить 32-bit сразу в двух инструкциях.) Использование двух инструкций, очевидно, более затратно, чем использование одной инструкции (хотя умная реализация могла бы объединить две инструкции во внешнем интерфейсе [то, что Intel называет макрооперацией слияния]).
Инструкции фиксированной длины также затрудняют расширение набора команд, сохраняя двоичную совместимость (и не требуя дополнительных режимов работы). Даже строго равномерное форматирование может препятствовать расширению набора команд, особенно для увеличения числа доступных регистров.
SPARC64 VIIIfx от Fujitsu - интересный пример. Он использует двухбитный код операции (в своих 32-битных инструкциях), чтобы указать загрузку специального регистра с двумя 15-битными расширениями инструкций для следующих двух инструкций. Эти расширения предоставляют дополнительные регистровые биты и индикацию работы SIMD (т. Е. Расширяют пространство кода операции инструкции, к которой применяется расширение). Это означает, что полное имя регистра инструкции не только не полностью находится в фиксированной позиции, но даже не в одной и той же "инструкции". (Можно отметить сходство с префиксом REX в x86, который предоставляет биты для расширения имен регистров, закодированных в основной части инструкции.)
(Одним из аспектов кодировок фиксированной длины является тирания двух степеней. Хотя можно использовать длины команд, отличные от двух степеней [XTensa Tensilica теперь имеет фиксированные 24-битные инструкции в качестве своей базовой ISA- с 16-битной поддержка коротких инструкций была расширением, ранее они были частью базовой ISA; у IBM был экспериментальный ISA с 40-битными инструкциями.], это добавляет небольшую сложность. Если один размер, например, 32 бита, слишком мал, следующий доступный размер, например, 64 бита, вероятно, будет слишком длинным, жертвуя слишком большой плотностью кода.)
Для реализаций с глубокими конвейерами дополнительное время, необходимое для анализа инструкций, является менее значительным. Дополнительная динамическая работа, выполняемая аппаратными средствами, и дополнительная сложность проектирования уменьшаются в значении для высокопроизводительных реализаций, которые добавляют сложное предсказание ветвлений, выполнение вне порядка и другие функции.
Компромиссы инструкции переменной длины
Для инструкций переменной длины компромиссы, по существу, меняются местами.
Большая плотность кода является наиболее очевидным преимуществом. Большая плотность кода может улучшить статический размер кода (объем памяти, необходимый для данной программы). Это особенно важно для некоторых встраиваемых систем, особенно микроконтроллеров, поскольку это может составлять значительную долю стоимости системы и влиять на физический размер системы (что влияет на соответствие назначению и стоимости производства).
Улучшение динамического размера кода уменьшает количество полосы пропускания, используемой для извлечения инструкций (как из памяти, так и из кэша). Это может снизить затраты и потребление энергии и может улучшить производительность. Меньший размер динамического кода также уменьшает размер кэшей, необходимых для данной частоты обращений; меньшие кеши могут потреблять меньше энергии и меньше места на кристалле и могут иметь меньшую задержку доступа.
(В не конвейерной или минимально конвейерной реализации с узким интерфейсом памяти выборка только части инструкции в цикле в некоторых случаях не снижает производительность так, как это было бы в более конвейерной конструкции, менее ограниченной пропускной способностью выборки.)
С инструкциями переменной длины можно использовать большие константы в инструкциях, не требуя, чтобы все инструкции были большими. Использование немедленной, а не загрузки константы из памяти данных использует пространственную локальность, предоставляет значение ранее в конвейере, избегает лишних инструкций и удаляет доступ к кэшу данных. (Более широкий доступ проще, чем множественный доступ одного и того же общего размера.)
Расширение набора команд также обычно проще, учитывая поддержку команд переменной длины. Дополнительная информация может быть включена с помощью очень длинных инструкций. (В случае некоторых методов кодирования - особенно с использованием префиксов), также можно добавить информацию о подсказке к существующим инструкциям, обеспечивая обратную совместимость с дополнительной новой информацией. X86 использует это не только для предоставления подсказок ветвления [которые в основном не используются ], но также и расширение аппаратной блокировки Elision. Для кодирования с фиксированной длиной было бы трудно заранее выбрать, какие операции должны иметь дополнительные коды операций, зарезервированные для возможного добавления в будущем информации подсказок.)
Кодирование с переменной длиной явно затрудняет поиск начала следующей последовательной инструкции. Это несколько меньше проблем для реализаций, которые декодируют только одну инструкцию за цикл, но даже в этом случае это добавляет дополнительную работу для оборудования (что может увеличить время цикла или длину конвейера, а также использовать больше энергии). Для более широкого декодирования доступно несколько приемов, позволяющих снизить затраты на разбор отдельных инструкций из блока памяти команд.
Один метод, который в основном использовался микроархитектурно (т. Е. Не включался в интерфейс, доступный для программного обеспечения, а только использовался метод реализации), состоит в том, чтобы использовать биты маркера для указания начала или конца команды. Такие биты маркера будут установлены для каждой посылки кодирования команд и сохранены в кеше команд. Это задерживает доступность такой информации при пропадании кэша команд, но эта задержка обычно мала по сравнению с обычной задержкой при заполнении пропуска кеша. Дополнительная (предварительная) работа по декодированию необходима только при пропадании кэша, поэтому время и энергия экономятся в обычном случае попадания в кэш (за счет некоторого дополнительного хранилища и пропускной способности, которая имеет некоторые энергетические затраты).
(Несколько реализаций AMD x86 использовали методы битовых маркеров.)
Альтернативно, биты маркера могут быть включены в кодирование команд. Это накладывает некоторые ограничения на назначение и размещение кода операции, поскольку биты маркера фактически становятся частью кода операции.
Другой метод, используемый IBM zSeries (S/360 и потомками), заключается в простом кодировании длины инструкции в код операции в первой посылке. ZSeries использует два бита для кодирования трех разных длин команд (16, 32 и 48 бит) с двумя кодировками, используемыми для 16-битной длины. Поместив это в фиксированное положение, относительно легко быстро определить, где начинается следующая последовательная инструкция.
(Также возможно более агрессивное предварительное кодирование. Pentium 4 использовал кэш трассировки, содержащий микрооперации фиксированной длины, а последние процессоры Intel используют микрооперационный кэш с [предположительно] микрооперациями фиксированной длины.)
Очевидно, что кодирование переменной длины требует адресации на уровне детализации посылки, которая обычно меньше, чем инструкция для ISA фиксированной длины. Это означает, что смещения ответвлений либо теряют некоторый диапазон, либо должны использовать больше битов. Это может быть компенсировано поддержкой более разных непосредственных размеров.
Аналогично, выборка одной инструкции может быть более сложной, поскольку начало инструкции, вероятно, не будет выровнено с большей степенью двойки. Выборка инструкций буферизации уменьшает влияние этого, но добавляет (тривиальную) задержку и сложность.
С инструкциями переменной длины также сложнее иметь одинаковое кодирование. Это означает, что часть кода операции часто должна быть декодирована до того, как может быть начат основной анализ инструкции. Это приводит к задержке доступности имен регистров и другой, менее важной информации. Значительная однородность все еще может быть достигнута, но это требует более тщательного проектирования и взвешивания компромиссов (которые могут измениться в течение срока службы ISA).
Как отмечалось ранее, в случае более сложных реализаций (более глубокие конвейеры, выполнение не по порядку и т. Д.) Дополнительная относительная сложность обработки команд переменной длины уменьшается. После декодирования инструкций сложная реализация ISA с инструкциями переменной длины имеет тенденцию выглядеть очень похожей на одну из ISA с инструкциями фиксированной длины.
Можно также отметить, что большая часть сложности конструкции для команд переменной длины является единовременной стоимостью; как только организация освоила методы (включая разработку программного обеспечения для валидации), чтобы справиться с причудами, стоимость этой сложности будет ниже для последующих реализаций.
Из-за проблем с плотностью кода для многих встроенных систем несколько ISA RISC предоставляют кодировки переменной длины (например, microMIPS, Thumb2). Обычно они имеют только две длины команд, поэтому дополнительная сложность ограничена.
Комплектация как компромиссный дизайн
Одна (своего рода промежуточная) альтернатива, выбранная для некоторых ISA, заключается в использовании пакета инструкций фиксированной длины с инструкциями различной длины. Содержа инструкции в пакете, каждый пакет имеет преимущества инструкции фиксированной длины, а первая команда в каждом пакете имеет фиксированную, выровненную начальную позицию. CDC 6600 использовал 60-битные пакеты с 15-битными и 30-битными операциями. M32R использует 32-битные пакеты с 16-битными и 32-битными инструкциями.
(Itanium использует пакеты двух степеней с фиксированной длиной для поддержки не мощных двух [41-битных] инструкций и имеет несколько случаев, когда две "инструкции" объединяются, чтобы разрешить 64-битные немедленные действия. [Академические] главы Хайди Пана и Хвостовое кодирование использует пакеты фиксированной длины для кодирования частей базовой инструкции фиксированной длины слева направо и фрагментов переменной длины справа налево.)
Некоторые наборы команд VLIW используют командное слово фиксированного размера, но отдельные рабочие интервалы в слове могут иметь различную (но фиксированную для конкретного временного интервала) длину. Поскольку разные типы операций (соответствующие слотам) предъявляют разные информационные требования, целесообразно использовать разные размеры для разных слотов. Это обеспечивает преимущества инструкций фиксированного размера с некоторым преимуществом плотности кода. (Кроме того, слот может быть выделен для необязательного предоставления немедленной одной из операций в командном слове.)