В чем преимущество наличия инструкций в едином формате?

Многие процессоры имеют инструкции, которые имеют одинаковый формат и ширину, такие как ARM, где все инструкции имеют длину 32 бит. другие процессоры имеют инструкции в разных ширинах, например, 2, 3 или 4 байта, например 8086. 1) В чем преимущество того, что все инструкции имеют ту же ширину и в едином формате? 2) в чем преимущество наличия инструкций в нескольких ширинах?

Ответ 1

Компоны с инструкциями по фиксированной длине

Преимущества инструкций с фиксированной длиной с относительно равномерным форматированием заключается в том, что выборка и анализ инструкций существенно проще.

Для реализации, которая извлекает одну команду за каждый цикл, доступ к фиксированному размеру с одной выравненной памятью (кешем) гарантированно обеспечивает одну (и только одну) команду, поэтому не требуется буферизация или сдвиг. Также нет никакой проблемы с пересечением линии кэша или границы страницы в рамках одной инструкции.

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

Наличие единого формата для каждой команды позволяет тривиальный синтаксический разбор инструкции в ее компонентах (немедленное значение, код операции, имена исходного регистра, имя регистра назначения). Разбор исходных имен регистров является наиболее критичным по времени; при этом в фиксированных положениях можно начинать считывать значения регистра до того, как будет определен тип инструкции. (Это чтение регистра является спекулятивным, поскольку операция может фактически не использовать значения, но эта спекуляция не требует какого-либо специального восстановления в случае ошибочной спекуляции, но требует дополнительной энергии.) В пятиступенчатом конвейере MIPS R2000 classic это позволило считывание значений регистра, которые должны запускаться сразу после получения команды, обеспечивая половину цикла для сравнения значений регистра и разрешения направления ветвления; с (заполненным) интервалом задержки ветвления, это избегало киосков без предсказания ветвления.

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

В дополнение к обеспечению синтаксического анализа раньше, более простое кодирование делает анализ меньшим количеством работы (использование энергии и логика транзистора).

Небольшое преимущество инструкций с фиксированной длиной по сравнению с типичными кодировками переменной длины заключается в том, что адреса инструкций (и смещения ветвей) используют меньшее количество бит. Это было использовано в некоторых ISA для предоставления небольшого количества дополнительного хранилища для информации о режиме. (По иронии судьбы, в таких случаях, как MIPS/MIPS16, для указания режима с инструкциями меньшей или переменной длины.)

Кодирование команд с фиксированной длиной и единообразное форматирование имеют недостатки. Наиболее очевидным недостатком является относительно низкая плотность кода. Длина инструкции не может быть установлена ​​в соответствии с частотой использования или сколько требуется отдельной информации. Строгое единообразное форматирование также имеет тенденцию исключать неявные операнды (хотя даже MIPS использует неявное имя регистра назначения для регистра ссылок) и операнды с переменным размером (большинство кодировок с переменной длиной RISC имеют короткие инструкции, которые могут получить доступ только к подмножеству из общего числа регистры).

(В RISC-ориентированной ISA это имеет дополнительную второстепенную проблему, заключающуюся в том, чтобы не допустить дополнительной работы в команду для выравнивания объема информации, требуемой инструкцией.)

Инструкции по фиксированной длине также упрощают использование больших непосредственных (постоянных операндов, включенных в инструкцию). Классические RISC ограничивают минимальную длину до 16 бит. Если константа больше, она должна быть загружена как данные (что означает дополнительную команду загрузки с ее накладными расходами на расчет адреса, использование регистра, перевод адреса, проверку тега и т.д.), Либо вторая инструкция должна предоставить остальную часть константы, (MIPS обеспечивает высокую оперативную нагрузку с нагрузкой, частично в предположении, что большие константы в основном используются для загрузки адресов, которые впоследствии будут использоваться для доступа к данным в памяти. PowerPC предоставляет несколько операций с использованием высоких непосредственных результатов, что позволяет, например, добавить 32 -bit немедленно в двух инструкциях.) Использование двух инструкций, очевидно, больше накладных расходов, чем использование одной команды (хотя умная реализация может свести две команды в интерфейсе [What Intel называет макрооперацию fusion]).

Инструкции по фиксированной длине также затрудняют расширение набора команд при сохранении двоичной совместимости (и не требующих дополнительных режимов работы). Даже строгое единообразное форматирование может препятствовать расширению набора команд, особенно для увеличения количества доступных регистров.

Fujitsu SPARC64 VIIIfx - интересный пример. Он использует двухбитовый код операции (в своих 32-разрядных инструкциях), чтобы указать загрузку специального регистра с двумя 15-разрядными расширениями инструкций для следующих двух команд. Эти расширения предоставляют дополнительные биты регистров и индикацию операции SIMD (то есть расширение пространства опций команды, к которому применяется расширение). Это означает, что полное имя регистра команды не только не полностью находится в фиксированной позиции, но даже не в той же "инструкции". (Схожие с префиксом x86 REX, которые предоставляют биты для расширения имен регистров, закодированных в основной части инструкции, могут быть отмечены.)

(Один из аспектов кодирования с фиксированной длиной - это тирания степеней, равных двум.Хотя можно использовать длины без полномочий двух команд [Tensilica XTensa теперь имеет фиксированные 24-битные инструкции в качестве базовой ISA - с 16-разрядная поддержка коротких инструкций является расширением, ранее они были частью базовой ISA, у IBM была экспериментальная ISA с 40-разрядными инструкциями.], Такая добавляет немного сложности. Если один размер, например, 32 бит, тоже слишком короткий, следующий доступный размер, например, 64 бита, скорее всего, слишком длинный, приносящий в жертву слишком большую плотность кода.)

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

Компиляция с переменной длиной команды

Для инструкций переменной длины компромиссы существенно меняются.

Большая плотность кода является наиболее очевидным преимуществом. Большая плотность кода может улучшить размер статического кода (объем памяти, необходимый для данной программы). Это особенно важно для некоторых встроенных систем, особенно для микроконтроллеров, поскольку это может быть значительная часть стоимости системы и влиять на физический размер системы (что влияет на пригодность для целей и производственных затрат).

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

(В нереализованной или минимально конвейерной реализации с узким интерфейсом памяти извлечение только части инструкции в цикле в некоторых случаях не ухудшает производительность, как это было бы в более конвейерной конструкции, которая была бы менее ограничена полосой пропускания выборки.)

С инструкциями переменной длины большие константы могут использоваться в инструкциях, не требуя, чтобы все инструкции были большими. Использование немедленной, а не загрузки константы из памяти данных использует пространственную локальность, обеспечивает значение ранее в конвейере, избегает дополнительной инструкции и удаляет доступ к кэшу данных. (Более широкий доступ проще, чем множественный доступ с одинаковым общим размером.)

Расширение набора команд также, как правило, проще, если поддерживать инструкции переменной длины. Дополнительная информация может быть включена с помощью дополнительных длинных инструкций. (В случае некоторых методов кодирования, особенно с использованием префиксов, также можно добавить информацию о намеках к существующим инструкциям, что позволяет обратно совместимость с дополнительной новой информацией. X86 использует это не только для предоставления подсказок отрасли (которые в основном не используются ], но также и расширение Hardware Lock Elision. Для кодирования с фиксированной длиной было бы сложно заранее выбрать, какие операции должны иметь дополнительные коды операций, зарезервированные для возможного будущего добавления информации о подсказках.)

Кодирование переменной длины явно затрудняет поиск начала следующей последовательной инструкции. Это несколько менее проблематично для реализаций что только декодирует одну инструкцию за цикл, но даже в этом случае она добавляет дополнительные работа для оборудования (что может увеличить время цикла или длину трубопровода, а также использовать больше энергии). Для более широкого декодирования доступно несколько трюков, чтобы снизить затраты на разбор отдельных инструкций из блока памяти команд.

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

(Несколько реализаций AMD x86 использовали методы бит маркера.)

В качестве альтернативы биты маркеров могут быть включены в кодировку команд. Это накладывает определенные ограничения на назначение и размещение опкода, поскольку бит маркера фактически становится частью кода операции.

Другая методика, используемая IBM zSeries (S/360 и потомками), заключается в том, чтобы кодировать длину инструкции простым способом в коде операции в первой посылке. ZSeries использует два бита для кодирования трех разных длин команд (16, 32 и 48 бит) с двумя кодировками, используемыми для 16-разрядной длины. Поместив это в фиксированное положение, относительно легко быстро определить, где начинается следующая последовательная инструкция.

(Возможно также более агрессивное предварительное кодирование). В Pentium 4 использовался кеш трассировки, содержащий микрооперации с фиксированной длиной, а последние процессоры Intel используют микро-операционный кэш с [предположительно] фиксированными размерами микроопераций.)

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

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

С инструкциями переменной длины также сложнее иметь унифицированное кодирование. Это означает, что часть кода операции часто должна быть декодирована до того, как начальный синтаксический анализ инструкции может быть запущен. Это приводит к задержке доступности имен регистров и другой, менее важной информации. Значительная однородность все еще может быть достигнута, но для этого требуется более тщательная разработка и взвешивание компромиссов (которые могут измениться в течение срока службы ISA).

Как отмечалось ранее, с более сложными реализациями (более глубокие конвейеры, выполнение вне очереди и т.д.), дополнительная относительная сложность обработки инструкций переменной длины уменьшается. После декодирования команд сложная реализация ISA с инструкциями переменной длины имеет тенденцию выглядеть очень похожей на одну из ISA с инструкциями с фиксированной длиной.

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

Из-за проблем с плотностью кода для многих встроенных систем несколько RISC ISA предоставляют кодировки с переменной длиной (например, microMIPS, Thumb2). Обычно они имеют только две длины команд, поэтому дополнительная сложность ограничена.

Объединение как компромиссная конструкция

Одна (какая-то промежуточная) альтернатива, выбранная для некоторых ISA, заключается в использовании набора фиксированной длины инструкций с инструкциями различной длины. Содержанием инструкций в комплекте, каждый пучок имеет преимущества инструкции с фиксированной длиной, а первая инструкция в каждом комплекте имеет фиксированную выровненную начальную позицию. CDC 6600 использовал 60-битные пакеты с 15-битными и 30-битными операциями. M32R использует 32-битные пакеты с 16-разрядными и 32-разрядными инструкциями.

(Itanium использует фиксированные длины с двумя путями для поддержки неработоспособности двух [41-битных] инструкций и имеет несколько случаев, когда две "инструкции" объединены, чтобы позволить 64-битные операторы. Heidi Pan [академический ] Кодирование Heads and Tails использует пакеты фиксированной длины для кодирования частей базовой части фиксированной длины слева направо и фрагментов переменной длины справа налево.)

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