Почему у нас нет больше регистров в микропроцессорах?

18

Регистры теоретически не требуются; все микропроцессоры будут работать без регистров. Но это, казалось бы, тривиальное дополнение помогло сделать микропроцессоры более эффективными.

Почему мы не можем иметь больше регистров для дальнейшего извлечения выгоды из них? Они просто память на чипе и можно представить не очень сложно добавить? Какой фактор повлиял на количество регистров, каковы они сейчас, а не, скажем, в 10 раз больше?

Даршан Чаудхари
источник
8
@ Alper91 Многие архитектуры, гипотетические и реальные, не имеют регистров, и это вовсе не обязательно. Это просто полезная оптимизация.
труба
4
Хм. Никто не упомянул Sparc. В самой большой реализации может быть 520 регистров (32 окна, 16 регистров, + 8 глобальных). Я их точно помню.
Джон
13
Я думаю, что количество бит в инструкции, которое вам нужно указать в регистре, является большой проблемой. Если у вас есть 1024 регистрами, то вам нужно по крайней мере 30 бит для каждой арифметической команды - если не добавить другие ограничения , как «все 3 регистры должны быть из одной и той же группы 32 (в этом случае вам нужно 20 бит).
user253751
8
@pipe - на самом деле практически любой практический проект требует «регистров» в схематическом смысле, так как даже если вы создаете стековую машину или что-то в этом роде, у вас должно быть место для хранения аргументов ALU или выходных данных. - большинство воспоминаний не имеют трех портов доступа. И стековая машина нуждается в указателе стека, который ... регистр! И давайте не будем упоминать конвейерные регистры. Вы можете скрыть использование таких «регистров» от программиста, но вам все еще нужны некоторые, и, вероятно, почти столько же, сколько у примитивного регистратора.
Крис Страттон
4
@ChrisStratton Конечно, но пока они не раскрываются через ISA, это просто детали реализации. Хотя это несколько бессмысленный аргумент, поскольку мы не знаем, что OP означает под регистром .
труба

Ответы:

33

Есть несколько факторов:

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

  • удвоение количества регистров не удваивает производительность. ISTR (от « Компьютерная архитектура», «Количественный подход» ), в котором от 16 до 32 регистров дает улучшение примерно на 10%, если предположить, что увеличение не оказывает отрицательного воздействия (что является весьма оптимистичным предположением).

  • архитектурно видимые регистры имеют затраты. Например:

    • Увеличение их числа увеличивает количество битов, взятых в формате команды, чтобы указать, какой регистр используется (удвоение количества регистров означает, что в формате имеется еще один бит на регистр, что предотвращает использование этих битов для другого использования или форсирования более длинный размер инструкции).
    • Увеличение количества архитектурных регистров увеличивает стоимость переключения контекста (так как они должны быть сохранены и восстановлены при переключении контекста).
AProgrammer
источник
1
Держу пари, что повышение производительности от 16 до 32 регистров полностью зависит от потенциала оптимизации рассматриваемого компилятора. В ассемблере доступ к удвоенному количеству регистров (в архитектуре x64) может значительно повысить производительность - но только для нишевых ролей, и только если они фактически используются.
rdtsc 9.09.16
6
@rdtsc: переход от 8 до 16 архитектурных регистров дает большие улучшения в количестве разливов / повторных загрузок для типичного кода, согласно данным моделирования в статье, связанной с этим ответом . Это влияет на размер кода, количество команд и насколько важна пересылка хранилища с малой задержкой. 16-> 32 - гораздо меньший эффект. AFAICT, 16 архитектурных регистров - хороший выбор для аппаратного обеспечения с переименованием регистров для устранения опасностей WAR и WAW.
Питер Кордес
2
Тем не менее, Intel AVX512 добавляет еще 16 векторных регистров, в общей сложности 32. (а также удвоение их ширины до 64 байт, полная строка кэша). Скрытие задержки от операций FP с высокой пропускной способностью и высокой задержкой может занять много регистров. Например, Intel Haswell имеет 5c lat, по одному на 0,5c FMA пропускной способности, поэтому вам нужно 10 векторных аккумуляторов для насыщения исполнительных блоков FMA для уменьшения (например, точечного произведения или суммирования массива, где FMA является частью зависимости, переносимой в цикле). ). x86-64 имеет только 16 векторных рег. Но помните, целочисленные операции, особенно на GP reg редко имеют задержку более 1с.
Питер Кордес
1
Компромисс отличается для целочисленных, FP и векторных регистров. Например, ленивое сохранение / восстановление целочисленных регистров не имеет смысла, делать это для вектора один - гораздо лучшая ставка. И векторный ISA часто имеет больше регистров, чем целочисленный (AltiVec имеет по крайней мере до 128, ISTR прочитал около 256 для Sparc, но не может найти ссылку сейчас).
AProgrammer
1
en.wikipedia.org/wiki/AltiVec имеет тридцать два 128-битных векторных регистра. Мне стало любопытно, что такое SPARC, и я посмотрел, как работает его окно регистров для переключения контекста. Он имеет 32 видимых регистра одновременно, но использует скользящее окно в больший регистровый файл. Из этой упрощенной версии звучит так, будто ОС требуется знать размер всего файла регистра скользящего окна, чтобы сохранить / восстановить его, потому что, хотя инструкции по перемещению окна предоставляют память для сохранения / восстановления регистров, если это необходимо, это делается путем перехвата в ОС.
Питер Кордес
16

Хотя регистры и ОЗУ являются памятью, к ним обращаются по-разному, чтобы отразить стоимость (в области микросхемы или скрытых тактовых циклов) доступа к ним.

Регистры тесно связаны с ALU и могут выполнять множество функций источников данных, приемников, модификаторов и т. Д. Поэтому им требуется множество широких мультиплексных соединений. В некоторых архитектурах мы можем написать R1 <= R2 + R3, и это именно то, что происходит за один такт. Каждый регистр адресован непосредственно в код операции, эта адресация является очень ограниченным ресурсом.

Поскольку регистры являются дорогостоящими для реализации, в большинстве архитектур их число обычно ограничено порядка 10/20.

Оперативная память слабо связана с процессором, как правило, направляется через одно общее соединение. Это значительно удешевляет реализацию большого объема оперативной памяти. Адреса ОЗУ обычно берутся из адреса, хранящегося в регистре, поэтому не используйте значительную ширину команд.

SPARC представляет собой интересную архитектуру с 72–640 64-битными регистрами, с контекстом из 32 регистров, который может быть сдвинут с перекрытиями для быстрых вызовов подпрограмм с передачей параметров. Вы не можете найти их на ПК и серверах, где стоимость имеет значение, например, в 99,999% приложений.

Neil_UK
источник
4
Другой аспект заключается в том, что вы должны сохранять / восстанавливать регистры во время переключения контекста. Больше регистров, больше времени.
Мишель Бийо
Я хотел бы отметить, что старый TMS9900 хранил все свои рабочие регистры во внешней памяти. En.wikipedia.org/wiki/Texas_Instruments_TMS9900
Питер Смит
1
Я квалифицировался «неизменно» с (за исключением нескольких настроек), но вынул его, чтобы упростить. Возможно, я просто поменяю его на «вообще». По сути, если вы можете найти и понять исключения, вам не нужно, чтобы я указывал на них. Если вы достаточно наивны, чтобы быть введенными в заблуждение, тогда это не имеет значения, потому что это не доставит вам неприятностей. TMS9900, это было странно, у меня было 99/4 за мои грехи в прошлой жизни, странный зверь!
Neil_UK
Itanium также имеет окна регистрации.
Саймон Рихтер
1
@ChrisStratton: Хотя есть некоторый прецедент для «нельзя использовать регистры X и Y», считающиеся частью «ABI» (например, регистры k0 и k1 для mips), это необычное использование. Конечно, существуют нежелательные / небезопасные каналы скрытого обмена сообщениями между процессами, если сохранение / восстановление этих «ABI-запрещенных регистров» не выполняется при переключении контекста. То есть процессы, которые не должны иметь возможность обмениваться данными, могут делать это, сохраняя информацию в запрещенных регистрах и ожидая переключения контекста.
R ..
12

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

Uwe
источник
5

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

Регистры реализованы в виде многопортового статического ОЗУ, что делает их более дорогостоящими (область микросхемы), чем другие варианты хранения.

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

Далее, сколько регистров вам действительно нужно? Есть предел их полезности. Предположим, вы пишете алгоритм, который выполняет некоторую математическую операцию с 1024 байтами, скажем, умножьте на 5. При текущем количестве регистров вы получите что-то вроде:

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Теперь, если у вас будет 1024 регистра и все данные, хранящиеся там, ваша программа будет выглядеть так:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Поскольку каждая из них является отдельной инструкцией, каждый из них должен быть записан. Таким образом, ваша необходимая память программы взрывается. Понимая это, вы можете ввести некоторые инструкции, такие как multiply register1 with register(2 to 256). Но когда вы остановитесь, даете ли вы инструкцию для всех комбинаций?

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

Арсенал
источник
1
Я думаю, что программа multiply Register1 with Register2 multiply Register1 with Register3очень нереалистична, поскольку данные должны приходить прямо или косвенно извне компьютера, поэтому необходимо загружать регистры, а результаты нужно где-то использовать, прямо или косвенно, поэтому регистры необходимо хранить. В действительности, приличный оптимизирующий компилятор для языка высокого уровня «развернет» цикл первой программы, чтобы создать что-то вроде второй программы, оптимизируя использование регистров, задержку памяти, возможно, занятость кэша и скорость выполнения.
gbulmer
1
Нет необходимости во многих специальных multiply register1 with register(2 to 256)инструкциях. Конвейерная обработка значительно повышает пропускную способность процессора, особенно для упрощения декодирования и выполнения команд. Таким образом, эффект сложных, массивных разнообразных инструкций может быть достигнут с помощью нескольких более простых инструкций с более высокой скоростью выполнения. Наличие большего количества регистров помогает, позволяя компилятору генерировать много независимых инструкций (те, которые не разделяют регистр), которые могут быть выполнены независимо, улучшая пропускную способность. Ваш пример = больше регистров лучше.
gbulmer
4

Регистры очень дорогие. Очень дорого. Это не столько сами регистры, сколько все связи с регистрами. Скажем, у вас есть инструкция reg1 = reg2 + reg3. Чтобы реализовать это быстро , вам нужно прочитать данные из двух регистров в одном цикле и записать в другой регистр во втором цикле. Теперь, если у вас есть процессор, который может выполнять несколько инструкций за цикл, скажем, три инструкции, вам нужно будет иметь возможность считывать данные из шести регистров в каждом цикле и записывать данные в 3 регистра. Это ужасно, очень много очень быстрых соединений.

Конечно, вы можете просто использовать больше транзисторов. Проблема в том, что скорость снижается. Вам нужно больше оборудования, чтобы выбрать из большего количества регистров. Пространство для файла регистра становится больше. Все это делает вещи медленнее. Таким образом, с той же технологией вы можете иметь 16 регистров и работать на частоте 2600 МГц или иметь 32 регистра и работать на частоте 2400 МГц. Теперь дополнительные регистры должны компенсировать значительное снижение тактовой частоты.

gnasher729
источник
2

Какой фактор повлиял на количество регистров

- иерархия памяти

Регистры, Кэш, ОЗУ реализованы с использованием различных технологий хранения.

Разные технологии отличаются

  1. Время доступа
  2. Стоимость
  3. плотность

Пример: внутренние регистры, найденные в ЦП, являются статической оперативной памятью , в то время как основной памятью компьютера является динамическая оперативная память.

Двоичная ячейка Static RAM реализована с использованием 6-транзисторной схемы, в то время как двоичная ячейка Dynamic RAM реализована с использованием конденсатора и транзистора. Сравнение SRAM и DRAM

  • Память SRAM намного быстрее, чем память DRAM [Несколько циклов для доступа к SRAM по сравнению с DRAM]
  • Схема SRAM потребляет меньше энергии, чем DRAM
  • DRAM требует периодического обновления каждого бита в памяти, в отличие от SRAM
  • SRAM стоит больше, чем DRAM
  • SRAM имеет более низкую плотность по сравнению с DRAM

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

- Длина инструкции

Адрес регистров включен в инструкцию, которая ограничивает количество доступных регистров на основе количества битов, которые могут представлять адрес. Например, в архитектуре MIPS инструкция 32-битной длины содержит только 5 битов для представления адреса доступных регистров, который ограничивает количество регистров до 2 5 = 32 регистра. Увеличение количества регистров потребовало бы увеличения длины команды, чтобы включить достаточное количество битов, которые могли бы получить доступ ко всем регистрам.

Elbehery
источник
2

Если вы посмотрите на набор инструкций процессора, существует несколько способов их группировки. Например, все ADDинструкции могут быть сгруппированы вместе, и все XORинструкции.

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

В качестве 8-разрядного гипотетического примера, скажем, $Axинструкции могут быть ADDинструкциями, а $Cxмогут быть XORинструкциями. При таком дизайне осталось всего четыре бита для определения операндов!

  • Можно иметь только четыре регистра общего назначения и использовать два бита для определения одного и два бита для определения другого.
  • Или можно использовать первый бит, чтобы различать «особые» варианты, а остальные 3 бита, чтобы определить, какой из восьми регистров будет работать с аккумулятором (это $x0может быть сам аккумулятор).
  • Или можно иметь больше, чем это количество регистров, но затем ограничить, какие регистры доступны для каких инструкций.

Конечно, мы прошли 8-битные наборы инструкций. Но, тем не менее, эта логика помогла определить наборы регистров в прошлом - это будет продолжаться и в будущем.

РЕДАКТИРОВАТЬ (по запросу)

Скажем , в верхней четыре бита для команды: ADD, SUB, XOR, MOV, и CMPт.д. Есть 16 возможностей здесь. Затем, для тех инструкций, где регистрация в регистр имеет смысл (например ADD Rx,Ry), вам нужно указать Rxи Ry. Скажем, следующие два бита предназначены для x, а последние два - для y. Таким образом:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Имея всего два бита для определения такого регистра, у вас есть место только для четырех регистров!

Кроме того, вы заметите, что некоторые комбинации регистров не имеют смысла. Например, MOV Rx, Rx(ничего не делает) и SUB Rx, Rx(всегда производит 0). Они могут стать специальными инструкциями:

  1. SUB Rx, Rxможет стать NOT Rx- инструкция с одним операндом.
  2. MOV Rx, Rxможет стать MOVинструкцией, которая принимает второй байт как непосредственное значение, интерпретируемое как MOV Rx, #$yy.

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

Джон Бургер
источник
Я все еще в замешательстве, вы можете объяснить, как осталось только 4 бита для операндов?
Даршан Чаудхари
Проверьте мой обновленный ответ
Джон Бургер
1
ИМХО, этот ответ был бы значительно улучшен, если переместить « гипотетический пример с 8-битным набором команд » в начало вопроса. Я потратил впустую время, пытаясь разобраться в этом, пришел к выводу, что это имеет смысл только для 8-битной инструкции фиксированной длины, а затем продолжил читать, чтобы найти, что это так. ИМХО, такой набор инструкций не очень неуместен в контексте вопроса; все его адресное пространство может быть тесно связано со статическим ОЗУ. Я также думаю, что часть, начинающаяся с « Некоторые комбинации регистров не имеет смысла ... », не имеет отношения к вопросу и может быть удалена. Мои 0,02 доллара
gbulmer
-2

В настоящее время Intel использует тысячи регистров - сотни на ядро ​​процессора. Но наибольшее количество данных, хранящихся на процессоре, находится в кеше, что косвенно отвечает на вопрос. Кэш организован по слоям, с небольшим быстрым кешем L1 и более медленными кешами L2 и L3 еще дальше. Файл регистра в некотором смысле - L0, даже быстрее, чем L1, но также и меньше. Таким образом, вы можете увеличить количество регистров, но это, вероятно, замедлит их.

MSalters
источник