Регистры теоретически не требуются; все микропроцессоры будут работать без регистров. Но это, казалось бы, тривиальное дополнение помогло сделать микропроцессоры более эффективными.
Почему мы не можем иметь больше регистров для дальнейшего извлечения выгоды из них? Они просто память на чипе и можно представить не очень сложно добавить? Какой фактор повлиял на количество регистров, каковы они сейчас, а не, скажем, в 10 раз больше?
microprocessor
Даршан Чаудхари
источник
источник
Ответы:
Есть несколько факторов:
Высокопроизводительные микроархитектуры используют переименование регистров. То есть количество физических регистров больше, чем количество архитектурно видимых регистров, и они могут отслеживать их независимое использование.
удвоение количества регистров не удваивает производительность. ISTR (от « Компьютерная архитектура», «Количественный подход» ), в котором от 16 до 32 регистров дает улучшение примерно на 10%, если предположить, что увеличение не оказывает отрицательного воздействия (что является весьма оптимистичным предположением).
архитектурно видимые регистры имеют затраты. Например:
источник
Хотя регистры и ОЗУ являются памятью, к ним обращаются по-разному, чтобы отразить стоимость (в области микросхемы или скрытых тактовых циклов) доступа к ним.
Регистры тесно связаны с ALU и могут выполнять множество функций источников данных, приемников, модификаторов и т. Д. Поэтому им требуется множество широких мультиплексных соединений. В некоторых архитектурах мы можем написать R1 <= R2 + R3, и это именно то, что происходит за один такт. Каждый регистр адресован непосредственно в код операции, эта адресация является очень ограниченным ресурсом.
Поскольку регистры являются дорогостоящими для реализации, в большинстве архитектур их число обычно ограничено порядка 10/20.
Оперативная память слабо связана с процессором, как правило, направляется через одно общее соединение. Это значительно удешевляет реализацию большого объема оперативной памяти. Адреса ОЗУ обычно берутся из адреса, хранящегося в регистре, поэтому не используйте значительную ширину команд.
SPARC представляет собой интересную архитектуру с 72–640 64-битными регистрами, с контекстом из 32 регистров, который может быть сдвинут с перекрытиями для быстрых вызовов подпрограмм с передачей параметров. Вы не можете найти их на ПК и серверах, где стоимость имеет значение, например, в 99,999% приложений.
источник
Регистры должны быть указаны в инструкции. Если регистров много, инструкция длиннее. Сохранение и восстановление содержимого регистра для службы прерывания требует больше времени, если регистров много.
источник
Как и большинство вещей, количество регистров является компромиссом между стоимостью, сложностью и полезностью.
Регистры реализованы в виде многопортового статического ОЗУ, что делает их более дорогостоящими (область микросхемы), чем другие варианты хранения.
Затем они соединяются с набором команд процессора, увеличение количества регистров увеличивает сложность набора команд. Поэтому, если вы хотите оставаться совместимым с набором команд, вы не можете просто увеличить количество регистров, доступных в процессорах следующего поколения, чтобы повысить эффективность, программы не будут их использовать.
Далее, сколько регистров вам действительно нужно? Есть предел их полезности. Предположим, вы пишете алгоритм, который выполняет некоторую математическую операцию с 1024 байтами, скажем, умножьте на 5. При текущем количестве регистров вы получите что-то вроде:
Теперь, если у вас будет 1024 регистра и все данные, хранящиеся там, ваша программа будет выглядеть так:
Поскольку каждая из них является отдельной инструкцией, каждый из них должен быть записан. Таким образом, ваша необходимая память программы взрывается. Понимая это, вы можете ввести некоторые инструкции, такие как
multiply register1 with register(2 to 256)
. Но когда вы остановитесь, даете ли вы инструкцию для всех комбинаций?Так что, возможно, числа, которые у нас есть на данный момент, являются хорошим компромиссом между стоимостью, сложностью и полезностью.
источник
multiply Register1 with Register2 multiply Register1 with Register3
очень нереалистична, поскольку данные должны приходить прямо или косвенно извне компьютера, поэтому необходимо загружать регистры, а результаты нужно где-то использовать, прямо или косвенно, поэтому регистры необходимо хранить. В действительности, приличный оптимизирующий компилятор для языка высокого уровня «развернет» цикл первой программы, чтобы создать что-то вроде второй программы, оптимизируя использование регистров, задержку памяти, возможно, занятость кэша и скорость выполнения.multiply register1 with register(2 to 256)
инструкциях. Конвейерная обработка значительно повышает пропускную способность процессора, особенно для упрощения декодирования и выполнения команд. Таким образом, эффект сложных, массивных разнообразных инструкций может быть достигнут с помощью нескольких более простых инструкций с более высокой скоростью выполнения. Наличие большего количества регистров помогает, позволяя компилятору генерировать много независимых инструкций (те, которые не разделяют регистр), которые могут быть выполнены независимо, улучшая пропускную способность. Ваш пример = больше регистров лучше.Регистры очень дорогие. Очень дорого. Это не столько сами регистры, сколько все связи с регистрами. Скажем, у вас есть инструкция reg1 = reg2 + reg3. Чтобы реализовать это быстро , вам нужно прочитать данные из двух регистров в одном цикле и записать в другой регистр во втором цикле. Теперь, если у вас есть процессор, который может выполнять несколько инструкций за цикл, скажем, три инструкции, вам нужно будет иметь возможность считывать данные из шести регистров в каждом цикле и записывать данные в 3 регистра. Это ужасно, очень много очень быстрых соединений.
Конечно, вы можете просто использовать больше транзисторов. Проблема в том, что скорость снижается. Вам нужно больше оборудования, чтобы выбрать из большего количества регистров. Пространство для файла регистра становится больше. Все это делает вещи медленнее. Таким образом, с той же технологией вы можете иметь 16 регистров и работать на частоте 2600 МГц или иметь 32 регистра и работать на частоте 2400 МГц. Теперь дополнительные регистры должны компенсировать значительное снижение тактовой частоты.
источник
- иерархия памяти
Регистры, Кэш, ОЗУ реализованы с использованием различных технологий хранения.
Разные технологии отличаются
Пример: внутренние регистры, найденные в ЦП, являются статической оперативной памятью , в то время как основной памятью компьютера является динамическая оперативная память.
Двоичная ячейка Static RAM реализована с использованием 6-транзисторной схемы, в то время как двоичная ячейка Dynamic RAM реализована с использованием конденсатора и транзистора. Сравнение SRAM и DRAM
Поэтому нецелесообразно увеличивать количество быстрой, дорогой и менее плотной памяти. Фактически мы могли бы использовать несколько из них, и хорошо написанная программа будет хранить наиболее часто используемые данные в этих быстрых регистрах, в то время как менее часто используемые данные хранятся в более медленной памяти.
- Длина инструкции
Адрес регистров включен в инструкцию, которая ограничивает количество доступных регистров на основе количества битов, которые могут представлять адрес. Например, в архитектуре MIPS инструкция 32-битной длины содержит только 5 битов для представления адреса доступных регистров, который ограничивает количество регистров до 2 5 = 32 регистра. Увеличение количества регистров потребовало бы увеличения длины команды, чтобы включить достаточное количество битов, которые могли бы получить доступ ко всем регистрам.
источник
Если вы посмотрите на набор инструкций процессора, существует несколько способов их группировки. Например, все
ADD
инструкции могут быть сгруппированы вместе, и всеXOR
инструкции.В каждой группе одной и той же инструкции могут быть версии, которые работают с памятью или с регистрами. Именно эта подгруппа эффективно определяет количество регистров, которые имеет процессор.
В качестве 8-разрядного гипотетического примера, скажем,
$Ax
инструкции могут бытьADD
инструкциями, а$Cx
могут бытьXOR
инструкциями. При таком дизайне осталось всего четыре бита для определения операндов!$x0
может быть сам аккумулятор).Конечно, мы прошли 8-битные наборы инструкций. Но, тем не менее, эта логика помогла определить наборы регистров в прошлом - это будет продолжаться и в будущем.
РЕДАКТИРОВАТЬ (по запросу)
Скажем , в верхней четыре бита для команды:
ADD
,SUB
,XOR
,MOV
, иCMP
т.д. Есть 16 возможностей здесь. Затем, для тех инструкций, где регистрация в регистр имеет смысл (напримерADD Rx,Ry
), вам нужно указатьRx
иRy
. Скажем, следующие два бита предназначены дляx
, а последние два - дляy
. Таким образом:Имея всего два бита для определения такого регистра, у вас есть место только для четырех регистров!
Кроме того, вы заметите, что некоторые комбинации регистров не имеют смысла. Например,
MOV Rx, Rx
(ничего не делает) иSUB Rx, Rx
(всегда производит0
). Они могут стать специальными инструкциями:SUB Rx, Rx
может статьNOT Rx
- инструкция с одним операндом.MOV Rx, Rx
может статьMOV
инструкцией, которая принимает второй байт как непосредственное значение, интерпретируемое какMOV Rx, #$yy
.Таким образом, вы можете «играть» с картой инструкций, заполняя отверстия для бесполезных или бессмысленных инструкций, чтобы обеспечить больший набор инструкций для программиста. Но в конечном итоге набор команд определяет набор регистров.
источник
В настоящее время Intel использует тысячи регистров - сотни на ядро процессора. Но наибольшее количество данных, хранящихся на процессоре, находится в кеше, что косвенно отвечает на вопрос. Кэш организован по слоям, с небольшим быстрым кешем L1 и более медленными кешами L2 и L3 еще дальше. Файл регистра в некотором смысле - L0, даже быстрее, чем L1, но также и меньше. Таким образом, вы можете увеличить количество регистров, но это, вероятно, замедлит их.
источник