Почему там только четыре регистра? - PullRequest
17 голосов
/ 21 мая 2010

Почему в наиболее распространенном процессоре (x86) всего четыре регистра? Разве не было бы огромное увеличение скорости, если бы было добавлено больше регистров? Когда будет добавлено больше регистров?

Ответы [ 9 ]

25 голосов
/ 21 мая 2010

В x86 всегда было более четырех регистров. Первоначально он имеет CS, DS, ES, SS, AX, BX, CX, DX, SI, DI, BP, SP, IP и флаги. Из них семь (AX, BX, CX, DX, SI, DI и BP) поддерживали большинство общих операций (сложение, вычитание и т. Д.). BP и BX также поддерживали использование в качестве «базового» регистра (т. Е. Для хранения адресов для Косвенная). SI и DI также могут использоваться в качестве регистров индекса, которые примерно совпадают с базовыми регистрами, за исключением того, что инструкция может генерировать адрес из одного базового регистра и одного регистра индекса, но НЕ из двух регистров индекса или двух базовых регистров. По крайней мере, при обычном использовании SP предназначен для работы в качестве указателя стека.

С тех пор регистры стали больше, были добавлены новые, и некоторые из них стали более универсальными, поэтому (например) теперь вы можете использовать любые 2 регистра общего назначения в режимах адресации с двумя регистрами. Несколько странно, что в 386 были добавлены два регистров сегмента (FS и GS), которые также допускали 32-битные сегменты, что в основном делало все регистры сегментов почти неактуальными. Иногда они используются для локального хранения потока.

Я должен также добавить, что когда вы выполняете многозадачность, многопоточность и т. Д., Многие регистры могут иметь довольно серьезное наказание - поскольку вы не знаете, какие регистры используются, когда вы делаете контекст Для переключения необходимо сохранить все регистры в одной задаче и загрузить все сохраненные регистры для следующей задачи. В процессорах типа Itanium или SPARC с 200+ регистрами это может быть довольно медленным. Недавние SPARC отводят достаточное количество микросхем для оптимизации этого, но их переключатели задач все еще относительно медленны. Это еще хуже на Itanium - одна из причин, по которой он менее впечатляет в типичных серверных задачах, даже несмотря на то, что он работает на научных вычислениях с (очень) несколькими переключателями задач.

Наконец, конечно, все это действительно сильно отличается от того, как работает достаточно современная реализация x86. Начиная с Pentium Pro, Intel отделила архитектурные регистры (то есть те, которые можно адресовать в инструкции) от реализации. Для поддержки одновременного, не по порядку выполнения, Pentium Pro имел (если память обслуживает) набор из 40 внутренних регистров и использовал «переименование регистров», поэтому два (или более) из них могут соответствовать данному архитектурному регистру в данный момент времени. , Например, если вы управляете регистром, затем сохраняете его, загружаете другое значение и манипулируете им, процессор может обнаружить, что загрузка разрывает цепочку зависимостей между этими двумя наборами инструкций, поэтому он может выполнять обе эти манипуляции одновременно.

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

9 голосов
/ 21 мая 2010

Там в настоящее время больше, чем 4.Если вы посмотрите на историю архитектуры x86 , вы увидите, что она эволюционировала из набора инструкций 8086.Intel всегда хотела сохранить некоторую степень обратной совместимости в своей линейке процессоров, поэтому все последующие процессоры просто расширяли исходные регистры A, B, C, D до большего числа битов.Оригинальные регистры сегментов могут использоваться сегодня в общих целях, поскольку сегментов больше нет (это упрощение, но в целом верно).Новая архитектура x64 также предоставляет некоторые дополнительные регистры.

7 голосов
/ 16 августа 2013

X86 на самом деле является машиной с 8 регистрами (eax / ebx / ecx / edx / esi / edi / ebp / esp). Вы теряете 1 из них на указатель стека / базовый указатель, поэтому при практическом использовании вы получаете 7, что немного ниже, но даже на некоторых RISC-машинах есть 8 (SuperH и ARM в режиме THUMB, потому что они имеют 16-битную инструкцию размер и другие регистры будут слишком длинными для кодирования!). Для 64-битного кода вы обновляете с 8 до 16 (в кодировке команд AFAIK использовались оставшиеся биты).

Тем не менее, 8 регистров - это как раз то, что достаточно для конвейерной обработки процессора, который идеально подходит для 486-х и пенсий. Некоторые другие архитектуры, такие как 6502/65816, умерли в начале 32-битной эры, потому что вы просто не можете сделать быструю конвейерную версию по порядку (у вас есть только 3 регистра и только 1 для общей математики, так что все вызывает остановку! ). Как только вы доберетесь до поколения, в котором все ваши регистры переименованы и все вышло из строя (pentium 2 и т. Д.), Это уже не имеет значения, и вы не получите срывов, если будете использовать один и тот же регистр снова и снова, и тогда 8 регистров вполне в порядке.

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

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

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

Вот почему традиционное мнение заключается в том, что более 32 регистров не очень хорошая идея (бесполезно, особенно на неработающем процессоре), а 8 слишком мало (чтение памяти все еще стоит дорого). !) и почему идеальная архитектура считается чем-то вроде 75% RISC 25% CISC, и почему ARM популярен (сбалансировано почти правильно!), почти все архитектуры RISC все еще имеют некоторые части CISC (вычисление адреса в каждой памяти OP) , 32-битные операционные коды, но не более!), Почему Itanium не удалось (128-битные операционные коды? 64 регистра? Нет вычисления адреса в оперативной памяти ???).

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

4 голосов
/ 21 мая 2010
  1. Реестры раньше были дорогостоящими для реализации.
  2. Не обязательно. Количество регистров на современном процессоре x86 намного превышает то, что показывает процессор - процессор поддерживает теневые регистры, которые по мере необходимости переименовываются на основе потока команд.
  3. В AMD64 / x86_64. При работе в 64-битном режиме количество регистров общего назначения удваивается (вдобавок к удвоению их размера).

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

2 голосов
/ 21 мая 2010

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

Но современные процессоры имеют более четырех регистров, сверху вниз расположены AX, BX, CX, DX, SI, DI, BP, ... тогда у CPU есть внутренние регистры, например для PIC (счетчики команд процессора )

0 голосов

Это просто зависит от архитектурных решений. Intel Itanium имеет 128 регистров общего назначения и 128 регистров с плавающей запятой, в то время как Intel x86 имеет только 8 регистров общего назначения и стек из 8 поплавков.

0 голосов
/ 21 мая 2010

Um ..... (E / R) AX, (E / R) BX, (E / R) CX, (E / R) DX, (E / R) SI, (E / R) DI , (E / R) SP, (E / R) BP, (E / R) IP. Я считаю это больше, чем 4. :) 1001 *

0 голосов
/ 21 мая 2010

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

Дополнительно:

  • Существуют и другие способы повышения производительности процессора, которые более экономичны
  • Даже если более подробно описано, вам все равно нужно обновить набор инструкций и изменить используемые компиляторы.
  • Уже есть более 4 регистров: из википедии (миры, да самый надежный источник)
    • AX / EAX / RAX: аккумулятор
    • BX / EBX / RBX: базовый индекс (например, массивы)
    • CX / ECX / RCX: счетчик
    • DX / EDX / RDX: данные / общие
    • SI / ESI / RSI: «индекс источника» для строковых операций.
    • DI / EDI / RDI: «индекс назначения» для строковых операций.
    • SP / ESP / RSP: указатель стека для верхнего адреса стека.
    • BP / EBP / RBP: базовый указатель стека для хранения адреса текущего кадра стека.
    • IP / EIP / RIP: указатель инструкций. Содержит счетчик программы, текущий адрес инструкции.
0 голосов
/ 21 мая 2010

Ну, есть еще четыре, они просто особенные, они «общего назначения», я думаю, причины всего этого и почему остальное не используется так много:

  • x86 был не совсем лучшим набором инструкций, чтобы быть де-факто стандартом, Intell просто увидел потенциал обратной совместимости, когда AMD присоединилась к нему, это был только вопрос времени.
  • Сейчас это стандарт де-факто, поэтому мы должны жить с ним.
  • Добавление большего количества регистров больше не будет x86, так что вы имеете в виду «создание нового набора команд на основе x86 с большим количеством регистров».
  • Большинство компиляторов не будут использовать их, так как они могут также скомпилировать в x86 и также нацелить на расширенный набор x86.
  • Чем больше регистров, тем дороже оборудование.
...