Как нулевой регистр улучшает производительность?

В MIPS ISA есть нулевой регистр ($r0), который всегда дает нулевое значение. Это позволяет процессору:

  1. Любая инструкция, которая дает результат, который нужно отбросить, может направить свою цель в этот регистр.
  2. Быть источником 0

В этом источнике говорится, что это улучшило скорость процессора. Как это улучшает производительность? И каковы причины, по которым не все ISA используют этот нулевой регистр?

$ r0 не является универсальным. Он жестко запрограммирован на 0. Независимо от того, что вы делаете с этим регистром, он всегда имеет значение 0. Вы можете задаться вопросом, зачем нужен такой регистр в MIPS.

Разработчики MIPS использовали тесты (программы, используемые для определения производительности ЦП), которые убедили их в том, что наличие регистра, жестко привязанного к 0, улучшит производительность (скорость) ЦП, а не его отсутствие. Не все согласны, что регистр, привязанный к 0, необходим, поэтому не все ISA имеют нулевой регистр.


person dayuloli    schedule 09.07.2014    source источник
comment
Возможно, нулевой регистр ускоряет работу ЦП в том смысле, что позволяет писать многие программы с меньшим количеством инструкций.   -  person Konrad Lindenbach    schedule 09.07.2014


Ответы (4)


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

  1. Это позволяет избежать ложных срывов трубопровода. Без явного нулевого регистра необходимо взять регистр, обнулить его и использовать его значение. Это означает, что операция обнуления зависит от операции обнуления и (в зависимости от того, насколько мощна конвейерная система пересылки), возможно, от предыдущего значения обнуленного регистра. Такие архитектуры, как x86, которые имеют довольно маленькие файлы регистров и в основном виртуализируют свои регистры, чтобы это не создавало проблем, имеют чрезвычайно мощные инструменты анализа опасностей. В большинстве случаев это не относится к RISC-процессорам.
  2. Определенные операции могут быть более конвейерными, если они могут избежать чтения регистра. Если используется явный нулевой регистр, тот факт, что операнд будет нулевым, известен на этапе декодирования команд, а не позже на этапе выборки регистра. Таким образом, этап чтения регистра можно пропустить.
  3. Точно так же возможность явного отбрасывания результатов устраняет необходимость в стадии записи в регистр.
  4. Определенные операции могут генерировать более простой микрокод, когда известно, что один из их операндов равен нулю или когда известно, что результат отвергнут.
  5. Явный нулевой регистр снимает некоторую нагрузку с оптимизатора компилятора, поскольку ему не нужно быть столь осторожным с назначением регистров (нет необходимости идентифицировать регистр, который не приведет к остановке чтения или записи).
person Sneftel    schedule 11.07.2014
comment
На более простых процессорах декодирование дает преимущества, если ISA требуется меньше кодов операций. Наличие нулевого регистра означает, что команда mov-непосредственной регистрации может быть псевдонимом для ori dst, $zero, 1234 вместо того, чтобы нуждаться в собственном коде операции. На ISA с FLAGS (в отличие от MIPS) cmp может быть sub с $zero в качестве пункта назначения. - person Peter Cordes; 14.05.2019

Вот ответ по каждому из ваших пунктов.

  1. Рассмотрим инструкции, которые обязательно принимают регистр для вывода, в котором вы хотите отбросить этот вывод. Обычно вам нужно убедиться, что у вас есть свободный регистр, а если нет, поместить некоторые из ваших текущих регистров в стек, что является дорогостоящей операцией. Очевидно, что часто происходит сбрасывание результатов операций, и самый простой способ справиться с этим - иметь доступный «неиспользуемый» регистр.
  2. Теперь, когда у нас есть такой неиспользуемый регистр, почему бы не использовать его? Часто бывает, что вы хотите что-то обнулить или сравнить что-то с нулем. Долгий путь - сначала записать ноль в этот регистр (что требует дополнительной инструкции и литерала для нуля в вашем машинном коде, который может иметь форму 0x00000000, что является довольно длинным), а затем использовать его. . Таким образом, уменьшилась одна инструкция и небольшая часть размера вашей программы.

Эти оптимизации могут показаться немного тривиальными и могут вызвать вопрос: «Насколько это действительно что-то улучшает?» Ответ заключается в том, что описанные выше операции, по-видимому, часто используются на вашем процессоре MIPS.

person Sanchises    schedule 11.07.2014
comment
Отказ от вывода инструкции полезен на x86, где инструкции имеют побочные эффекты, такие как установка кодов условий. Инструкции MIPS имеют только один вывод, так как это архитектура RISC, и редко требуется отбрасывать вывод инструкции. - person markgz; 15.07.2014

Концепция нулевого регистра не нова. Впервые я столкнулся с этим на мэйнфрейме CDC 6600, который датируется серединой-концом 1960-х годов. В некотором смысле это был один из первых процессоров RISC и самый быстрый компьютер в мире в течение 5 лет. В этой архитектуре регистр «B0» всегда был нулевым. http://en.wikipedia.org/wiki/CDC_6600

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

person Burt_Harris    schedule 16.07.2014

Нулевой регистр позволяет сохранить некоторые коды операций при разработке новой архитектуры набора команд (ISA).

Например, основная спецификация RISC-V имеет 32 псевдо-инструкции, зависящие от нулевого регистра (см. таблицы 26.2 и 26.3). Псевдокоманда - это инструкция, которая отображается ассемблером в другую реальную инструкцию (например, ветвь, если равно нулю, отображается в ветвь, если равно). Для сравнения: основная спецификация RISV-V перечисляет 164 реальных кода операций инструкций (т. Е. Считая RV (32 | 64) [IMAFD] base / extension, a.k.a. RV64G). Это означает, что без нулевого регистра RISC-V RV64G занимал бы на 32 кода операций больше для этих инструкций (т.е. на 20% больше). Для конкретной реализации ЦП RISC-V это соотношение реальных и псевдокоманд может сдвигаться в любом направлении в зависимости от того, какие расширения выбраны.

Использование меньшего количества кодов операций упрощает декодер команд.

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

Существующие, постепенно развивающиеся ISA должны иметь дело с обратной совместимостью. Таким образом, если ваш исходный проект ISA не включает нулевой регистр, вы не можете просто добавить его в более позднюю ревизию без нарушения совместимости. Кроме того, если ваш существующий ISA уже требует очень сложного декодера, добавление нулевого регистра не окупается.

Помимо современной RISC-V ISA (разработанной с 2010 г., первая ратификация в 2019 г.), ARMv8 AArch64 (64-разрядная ISA, выпущенная в 2011 г.), в отличие от предыдущих 32-разрядных ISA ARM, также имеет нулевой регистр. Из-за этого и других изменений AArch64 ISA имеет гораздо меньше общего с предыдущими 32-разрядными ISA для ARM, чем, скажем, ISA для x86 и x86-64.

В отличие от AArch64, x86-64 не имеет нулевого регистра. Хотя x86-64 более современный, чем предыдущий 32-битный x86 ISA, его ISA изменялся только постепенно. Таким образом, он включает все существующие коды операций x86 плюс 64-битные варианты, и, таким образом, декодер уже очень сложен.

person maxschlepzig    schedule 28.12.2019