Почему существует только четыре регистра?
Почему в большинстве распространенных процессоров (x86) существует только четыре регистра? Разве не было бы огромного увеличения скорости, если бы было добавлено больше регистров? Когда будет добавлено больше регистров?
Ответы
Ответ 1
В настоящее время более 4. Если вы посмотрите на историю архитектуры x86 вы увидите, что она эволюционировала из набора инструкций 8086. Intel всегда стремилась сохранить некоторую степень обратной совместимости в своей процессорной линейке, поэтому все последующие процессоры просто расширили исходные регистры A, B, C, D до более широкого числа бит. Первоначальные регистры сегментов могут использоваться для общих целей сегодня, поскольку на самом деле сегментов больше нет (это упрощение, но грубо говоря). Новая архитектура x64 также предоставляет некоторые дополнительные регистры.
Ответ 2
В 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 универсальных регистра в режимах адресации с двумя регистрами. Несколько странно, два сегментаных регистра (FS и GS) были добавлены в 386, что также позволило 32-битные сегменты, которые в основном делали все регистры сегментов почти несущественными. Они иногда используются для локального хранилища потоков.
Я также должен добавить, что при многозадачности, многопоточности и т.д. множество регистров может иметь довольно серьезное наказание - поскольку вы не знаете, какие регистры используются, когда вы выполняете контекст вы должны сохранить все регистры в одной задаче и загрузить все сохраненные регистры для следующей задачи. В процессоре, таком как Itanium или SPARC с 200+ регистрами, это может быть довольно медленным. Последние SPARC посвящают большое количество области чипов, чтобы оптимизировать это, но их переключатели задач по-прежнему относительно медленны. Это еще хуже на Itanium - одна из причин, по которой он менее впечатляющ в типичных серверных задачах, даже несмотря на то, что он анализирует научные вычисления с помощью (очень) нескольких переключателей задач.
Наконец, конечно, все это действительно сильно отличается от того, как работает разумно современная реализация x86. Начиная с Pentium Pro, Intel отменила архитектурные регистры (то есть те, которые могут быть рассмотрены в инструкции) из реализации. Для поддержки одновременного, нестандартного исполнения Pentium Pro имел (если память обслуживал) набор из 40 внутренних регистров и использовал "переименование регистра", поэтому два (или более) из них могут соответствовать данному архитектурному регистру в данный момент времени, Например, если вы управляете регистром, затем сохраняете его, загружаете другое значение и обрабатываете его, процессор может обнаружить, что нагрузка нарушает цепочку зависимостей между этими двумя наборами инструкций, поэтому она может одновременно выполнять обе эти манипуляции.
Pentium Pro, конечно же, довольно старый, и, конечно же, AMD тоже существует некоторое время (хотя их проекты достаточно похожи в этом отношении). Хотя изменения деталей с новыми процессорами, возможность переименования, которая отделяет архитектурные регистры от физических регистров, теперь более или менее является фактом жизни.
Ответ 3
X86 - это действительно 8-ти регистратор (eax/ebx/ecx/edx/esi/edi/ebp/esp). Вы теряете 1 из них указателю на указатель стека/базового указателя, поэтому при практическом использовании вы получаете 7, что немного на нижней стороне, но даже некоторые RISC-машины имеют 8 (SuperH и ARM в режиме THUMB, потому что они имеют 16-битную инструкцию размер и больше регистров будет слишком длинным для кодирования!). Для 64-битного кода вы обновляетесь с 8 до 16 (они использовали некоторые оставшиеся биты в кодировке команд AFAIK).
Тем не менее, 8 регистров достаточно ровно достаточно, чтобы конвейерный процессор, который идеально подходит для 486s и pentiums. Некоторые другие архитектуры, такие как 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 cpus будет работать так же быстро, как x86s, они будут такими же сумасшедшими и сложными, как у Intel.
Ответ 4
- Регистры были дороги для реализации.
- Не обязательно. Количество регистров на современном процессоре x86 намного превосходит то, что показывает процессор - процессор поддерживает теневые регистры, которые переименовываются по мере необходимости на основе потока команд.
- В AMD64/x86_64. При работе в 64-битном режиме количество регистров общего назначения удваивается (в дополнение к удвоению их размера).
Существует много архитектур с большим количеством регистров (ARM, PowerPC и т.д.). Время от времени они могут достичь более высокой пропускной способности, поскольку при манипулировании стеком выполняется меньше работы, а инструкции могут быть короче (нет необходимости ссылаться на переменные стека). Контр-точка - это вызовы функций, которые становятся более дорогими из-за большего сохранения регистров.
Ответ 5
Больше регистров не обязательно ускоряет работу, они усложняют архитектуру процессора, поскольку регистры должны быть близки к другим компонентам, и многие инструкции работают только с определенными регистрами.
Но современные процессоры имеют более четырех регистров, с вершины моей головы есть AX, BX, CX, DX, SI, DI, BP,... тогда у CPU есть внутренние регистры, например, для PIC (счетчики команд процессора )
Ответ 6
Ну, их больше, четыре - просто специальные, они "общие цели", я думаю, причины для всего этого и почему остальные не используются так много:
- x86 был не совсем лучшим набором инструкций, который был стандартом де-факто, Intell только видел потенциал обратной совместимости, как только AMD присоединилась к нему, это был всего лишь вопрос времени.
- Это фактический стандарт, поэтому мы должны жить с ним.
- Добавление большего количества регистров больше не будет x86, поэтому вы имеете в виду "создание нового набора команд на основе x86 с большим количеством регистров".
- Большинство компиляторов не будут использовать их, поскольку они могут так же легко компилироваться в x86, чтобы также нацеливаться на супермножество x86.
- Больше регистров означает более дорогое оборудование.
Ответ 7
Память, которая регистрирует использование, очень дорого обрабатывается в CPU. Помимо трудностей проектирования при этом, увеличение количества доступных регистров делает процессоры более дорогими.
Кроме того:
- Существуют и другие методы повышения производительности ЦП, которые являются более экономичными
- Даже если вы добавили больше информации, вам все равно нужно обновить набор команд и модифицировать компиляторы для использования.
- Уже существует более 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: указатель инструкции. Удерживает счетчик программ, текущий адрес инструкции.
Ответ 8
(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.:)
Ответ 9
Это просто зависит от архитектурных решений. Intel Itanium имеет 128 регистров общего назначения и 128 регистров с плавающей точкой, в то время как Intel x86 имеет только 8 регистров общего назначения и стек из 8 поплавков.