Как RISC-V переменная длина инструкции работает в деталях? - PullRequest
0 голосов
/ 03 июля 2019

После просмотра документа risc-v isa doc создается впечатление, что riscv поддерживает инструкции длиной 16 бит (RVC), 32 бит (RV32I) и 64 бит (RV64I).

Для RV32I: немедленный подписывается с расширением до 32 бит

  • Длина инструкции: 32 бита
  • Размер регистра: 32 бита
  • Адрес памяти: 32 бита

Для RV64i: немедленный подписывается с расширением до 64 бит

  • Длина инструкции: 32 бита
  • Размер регистра: 64 бита
  • Адрес памяти: 64 бита

Похоже, что и RV32I, и RV64I используют 32-битный размер инструкции, и разница связана с размером расширения знака.

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

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

И вообще, должно ли имя RV64I указывать, что длина инструкции составляет 64 бита?

1 Ответ

3 голосов
/ 03 июля 2019

RISC-V позволяет смешивать 16-битные, 32-битные, 48-битные, 64-битные инструкции и многое другое!

RV32I определяет 32-битную архитектуру компьютера, где регистры имеют ширину 32 бита. Все его инструкции имеют ширину 32 бита. Например, он имеет lw для загрузки 32-разрядного слова в регистр и add для добавления двух регистров и назначения третьего.

RV64I определяет 64-битную архитектуру компьютера, где регистры имеют ширину 64 бита (следовательно, RV64) - его инструкции также имеют ширину 32 бита. Инструкции RV32 все еще работают, и есть несколько дополнительных инструкций для размещения как 32-битных, так и 64-битных операций. Например, lw по-прежнему загружает 32-разрядное слово (хотя теперь знак расширяется для заполнения 64-разрядного регистра), и поэтому для загрузки 64-разрядного слова используется новая инструкция ld. add все еще добавляет два регистра и предназначается для третьего, но тот же самый add теперь делает 64-разрядное добавление вместо 32-разрядного добавления, так как регистры в RV64 64-разрядные. Новая инструкция addw выполняет 32-битное сложение, если это все, что вы хотели.

RVC - это расширение, которое может быть добавлено к RV32I или RV64I. При наличии он допускает 16-битные инструкции, и его конструкция такова, что 16-битная инструкция расширяет 1: 1 до 32-битной инструкции - из-за этого нет изменений в архитектуре регистра (как RV32) или RV64, к которому был добавлен RVC), и, в некотором смысле, нет ничего нового, что они могут сделать, чего еще нет в наборе команд шириной 32 бита. Мы должны думать об этом больше как о технике экономии места, а не о некоторых новых возможностях.

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

Однако набор команд резервирует достаточно места для кода операции, чтобы можно было различать 16-битные, 32-битные, 48-битные и 64-битные инструкции. Инструкции, которые начинаются с двоичного 11 (в самой младшей битовой позиции инструкции), представляют собой инструкции размером 32 бита (но один шаблон зарезервирован: поэтому они не могут начинаться с 11111). Компактные инструкции используют 00, 01 и 10 в той же позиции. 48-битные инструкции используют начальную последовательность 011111, а 64-битные инструкции начинаются с 0111111.

Базовая архитектура также использует для всех ветвление, относящееся к ПК, поэтому вы можете создать исполняемый образ с фрагментом кода размером до 4 ГБ (и при загрузке он может находиться в любом месте 64-битного адресного пространства).

Кажется, что и RV32I, и RV64I используют 32-битный размер инструкции, и разница связана с размером расширения знака.

RV32 против RV64, регистры расширяются с 32-битных на 64-битные, поэтому, да, когда расширение знака происходит на RV64, оно выходит на 64-битные.

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

Набор команд RISC V был разработан после многолетних исследований с MIPS (более ранняя конструкция RISC). По сравнению с x86, который имеет размер инструкций переменной длины, MIPS не оставил достаточно места для кода операции на протяжении более 40 лет развития. Набор команд фиксированного размера - это компромисс между пространством кода и возможностями - чем больше размер команды, тем больше ее можно закодировать за счет плотности кода. Плотность кода оказывает огромное влияние на производительность, поэтому нельзя игнорировать. Итак, RISC V допускает инструкции переменного размера, и, если хотите, вы можете создавать 256-битные инструкции в своей реализации!

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

Код для образа исполняемой программы может иметь размер до 4 ГБ и по-прежнему использовать относительное к ПК ветвление - он будет использовать то, что мы называем дальними ветвями, где последовательность ветвей состоит из двух инструкций (auipc и jal). Чтобы быть понятным, 4 ГБ это очень большой сегмент кода. Большая часть ценности 64-битной архитектуры заключается в возможности работать с более чем 4 ГБ данных, а не с 4 ГБ кода. Чтобы достичь размера кода более 4 ГБ, вы должны использовать указатели (например, хранящиеся в таблицах), поскольку указатели могут быть заполнены до 64-битной ширины. Этот метод уже используется для библиотек DLL (даже если они обычно не приближаются к превышению 4 ГБ кода при добавлении размера каждого из них), поскольку они обычно загружаются независимо (и, таким образом, относительные к ПК ветви будут работать внутри одного раздел кода, он не будет работать между разделами кода).

И вообще, должно ли имя RV64I указывать, что длина инструкции составляет 64 бита?

Поскольку в любой имеющейся у нас архитектуре (например, 16-битной, 32-битной, 64-битной) у нас, как правило, не хватает места для данных, прежде чем нам не хватает места для кода, что является доминирующей особенностью 64-битной системы. архитектура - это поддержка 64-битного адресного пространства, позволяющая хранить большие объемы данных. Эта поддержка большой адресной шины также имеет возможность использовать 64-битные адреса и, конечно, также манипулировать 64-битными значениями. Итак, что важно в RV64, так это 64-битные регистры и возможность использовать 64-битные значения для адресации памяти. (Размер инструкции является ортогональным вопросом.)

...