2010-05-20 9 views
15

¿Por qué hay solo cuatro registros en la CPU más común (x86)? ¿No habría un gran aumento en la velocidad si se agregaran más registros? ¿Cuándo se agregarán más registros?¿Por qué hay solo cuatro registros?

+8

X86 ni siquiera está cerca de ser el procesador más común. ¿Has revisado tu teléfono celular últimamente? –

+3

Es el más común en computación personal si no cuenta dispositivos móviles –

+0

[¿Por qué la cantidad de registros int x86 es 8?] (Https://stackoverflow.com/q/16248337/995714) –

Respuesta

8

Hay son más de 4 hoy en día. Si nos fijamos en el history of the x86 architecture, verá que ha evolucionado a partir del conjunto de instrucciones 8086. Intel siempre ha querido mantener cierto grado de compatibilidad con versiones anteriores en su línea de procesadores, por lo que todos los procesadores posteriores simplemente extendieron los registros A, B, C, D originales a un mayor número de bits. Los registros de segmentos originales se pueden usar para fines generales hoy en día, ya que en realidad ya no hay segmentos (esto es una simplificación excesiva, pero más o menos cierto). La nueva arquitectura x64 proporciona algunos registros extra también.

+3

Además, el coprocesador matemático tiene su propio conjunto de registros. – BoltBait

+5

Hay más de x debido al registro de cambio de nombre. –

+0

y registros SSE, MSR, DRx, CRx ... –

4
  1. Los registros solían ser costosos de implementar.
  2. No necesariamente. El número de registros en una CPU x86 moderna es mucho mayor de lo que revela la CPU: la CPU mantiene registros ocultos que se renombran según sea necesario en función del flujo de instrucciones.
  3. En AMD64/x86_64. Cuando se ejecuta en modo de 64 bits, el número de registros de propósito general se duplica (además de duplicar su tamaño).

Hay muchas arquitecturas con más registros (ARM, PowerPC, etc.). A veces, pueden lograr un mayor rendimiento de la instrucción ya que se trabaja menos en la manipulación de la pila, y las instrucciones pueden ser más cortas (no es necesario hacer referencia a las variables de la pila). El contrapunto es que las llamadas a funciones se vuelven más caras debido a un mayor ahorro de registros.

0

Bueno, hay más, los cuatro son simplemente especial, son 'propósito general' Pienso, las razones de todo esto y por qué no se utiliza el resto que gran parte es:

  • WASN x86 No es exactamente el mejor conjunto de instrucciones para ser estándar de facto, Intell acaba de ver el potencial de la compatibilidad con versiones anteriores, una vez que AMD se unió, era solo cuestión de tiempo.
  • Es el estándar de facto ahora, entonces tenemos que vivir con eso.
  • Agregar más registros ya no sería x86, por lo que quiere decir 'crear un nuevo conjunto de instrucciones basado en x86 con más registros'.
  • La mayoría de los compiladores no los usarían, ya que también pueden compilar a x86 para también apuntar a un superconjunto de x86.
  • Más registros significa hardware más caro.
+1

Creo que sería más exacto decir que "x86 fue lo suficientemente popular como para cambiar a cualquier otra cosa que no resultó rentable". Recuerde, Intel intentó lanzar Itanium, que tenía 128 registros int y era verdadero de 64 bits, pero falló debido a la falta de compatibilidad con versiones anteriores. – Jimmy

0

La memoria que registra el uso es realmente costoso de diseñar en la CPU. Además de las dificultades de diseño al hacerlo, aumentar el número de registros disponibles hace que los chips de la CPU sean más caros.

Además:

  • Hay otros métodos para aumentar el rendimiento de la CPU que es más rentable
  • Incluso si hay más donde introducido, usted todavía tiene que actualizar el conjunto de instrucciones y tienen compiladores modificados para su uso.
  • Ya es más de 4 registros: de Wikipedia (los mundos, eh, la fuente más fiable)
    • AX/EAX/RAX: acumuladores
    • BX/EBX/RBX: índice de base (por ejemplo: los arrays)
    • CX/ECX/RCX: contador
    • DX/EDX/RDX: datos/generales
    • SI/ESI/RSI: "índice de fuente" para las operaciones de cadena.
    • DI/EDI/RDI: "índice de destino" para operaciones de cadena.
    • SP/ESP/RSP: apilar el puntero para la dirección superior de la pila.
    • BP/EBP/RBP: puntero de base de pila para mantener la dirección del marco de pila actual.
    • IP/EIP/RIP: puntero de instrucción. Sostiene el contador del programa, la dirección de instrucción actual.
+0

"Realmente caro" es cierto en 1980. Las CPU modernas tienen cantidades enormes (tamaño L1) de memoria interna, que si bien son caras, no explican la escasez de registros perceptuales. –

+0

Relativamente hablando, es costoso/realmente costoso. La memoria de registro se utiliza de forma diferente a la memoria caché L1. A menos que, por supuesto, los registros hayan comenzado, la caché falla desde la última vez que ingresé ... –

+0

Más registros de arquitectura no serían un problema para el hardware x86 actual (que no sean dificultades de codificación). Los diseños actuales ya tienen más de 100 registros físicos a los que se les cambia el nombre a los registros arquitectónicos. Lo "realmente caro" es la razón histórica por la que el arco tiene tan pocos registros arquitectónicos. Significa menos estado para guardar/restaurar en los conmutadores de contexto. –

0

Um ..... (E/R) AX, (E/R) BX, (E/R) CX, (E/R) DX, (E/R) de la IS, (E/R) DI, (E/R) SP, (E/R) BP, (E/R) IP. Lo considero como más de 4. :)

2

Más registros no necesariamente hacen las cosas más rápido, hacen que la arquitectura de la CPU sea más complicada, ya que los registros deben estar cerca de otros componentes y muchas instrucciones funcionan solo en registros específicos .

Pero las CPU modernas tienen más de cuatro registros, desde arriba de mi cabeza hay AX, BX, CX, DX, SI, DI, BP, ... entonces una CPU tiene registros internos, por ejemplo para PIC (instrucción del procesador contadores)

21

El x86 tiene siempre tenía más de cuatro registros. Originalmente, tiene CS, DS, ES, SS, AX, BX, CX, DX, SI, DI, BP, SP, IP y Flags. De ellos, siete (AX, BX, CX, DX, SI, DI y BP) respaldaron la mayoría de las operaciones generales (suma, resta, etc.) BP y BX también admitieron el uso como registro "Base" (es decir, para contener direcciones para indirección). SI y DI también se pueden usar como registros de índice, que son casi los mismos que los registros base, excepto que una instrucción puede generar una dirección de un registro base y un registro de índice, pero NO de dos registros de índice o dos registros de base. Al menos en el uso típico, SP se dedica a actuar como el puntero de la pila.

Desde entonces, los registros se han vuelto más grandes, se han agregado más y algunos se han vuelto más versátiles, por lo que ahora puede usar cualquier 2 registros de propósito general en modos de direccionamiento de 2 registros. De manera algo extraña, se agregaron dos registros de segmento (FS y GS) en el 386, que también permitieron segmentos de 32 bits, que en su mayoría representaban casi irrelevantes todos los registros de segmentos. A veces se usan para almacenamiento local de subprocesos.

También debo agregar que cuando haces múltiples tareas, multi-threading, etc., muchos registros pueden tener una penalización bastante grave, ya que no sabes qué registros están en uso, cuando haces una Con el cambio de contexto, debe guardar todos los registros en una tarea y cargar todos los registros guardados para la siguiente tarea. En una CPU como Itanium o SPARC con más de 200 registros, esto puede ser bastante lento. Los SPARC recientes dedican una buena cantidad de área de chips para optimizar esto, pero sus conmutadores de tareas son aún relativamente lentos. Es aún peor en el Itanium, una razón por la que es menos que impresionante en las tareas típicas del servidor, a pesar de que se basa en la informática científica con (muy) pocos conmutadores de tareas.

Finalmente, por supuesto, todo esto es realmente bastante diferente de cómo funciona una implementación razonablemente moderna de x86. Comenzando con el Pentium Pro, Intel desacopló los registros arquitectónicos (es decir,, los que se pueden abordar en una instrucción) desde la implementación. Para admitir la ejecución simultánea fuera de servicio, el Pentium Pro tenía (si la memoria sirve) un conjunto de 40 registros internos, y utilizaba "registro de nombres" para que dos (o más) de ellos pudieran corresponder a un registro arquitectónico dado en un momento dado . Por ejemplo, si manipula un registro, luego lo almacena, carga un valor diferente y lo manipula, el procesador puede detectar que la carga rompe la cadena de dependencia entre esos dos conjuntos de instrucciones, por lo que puede ejecutar ambas manipulaciones simultáneamente.

El Pentium Pro es ahora bastante viejo, por supuesto, y por supuesto, AMD también ha existido por un tiempo (aunque sus diseños son razonablemente similares a este respecto). Si bien los detalles cambian con los nuevos procesadores, tener capacidad de cambio de nombre que desacopla los registros arquitectónicos de los registros físicos es ahora más o menos un hecho de la vida.

+1

realmente genial respuesta-- interesante para comprender las implicaciones de # de registrado en multiproceso perf –

+1

¿quiere decir "Itanium" al mencionar "Itanic" –

0

Simplemente depende de las decisiones arquitectónicas. Intel Itanium tiene 128 registros de propósito general y 128 de coma flotante, mientras que Intel x86 solo tiene 8 registros de propósito general y una pila de 8 flotantes.

+0

la era de x87 pilas hace mucho tiempo que hace muchas décadas. Hoy en día, las CPU x86 usan el SSE mucho más rápido o su sucesor, que usan registros xmm/ymm en lugar de la pila –

7

X86 es realmente una máquina de 8 registros (eax/ebx/ecx/edx/esi/edi/ebp/esp). Pierdes 1 de ellos en el puntero de pila/puntero base, así que en el uso práctico obtienes 7, que es un poco bajo, pero incluso algunas máquinas RISC tienen 8 (SuperH y ARM en modo PULGAR, porque tienen instrucciones de 16 bits) tamaño y más registros serían demasiado largos para codificar!). Para el código de 64 bits, actualice de 8 a 16 (utilizaron algunos bits sobrantes en la codificación de instrucciones AFAIK).

Aún así, 8 registros son casi lo suficientemente justo para canalizar la CPU, que es perfecto para 486s y pentiums. Algunas otras arquitecturas, como 6502/65816, desaparecieron en la era inicial de 32 bits porque simplemente no se puede hacer una rápida y ordenada versión en línea (solo tienes 3 registros, y solo 1 para matemáticas generales, ¡así que todo causa un bloqueo!) Una vez que llegas a la generación en la que se renombran todos tus registros y todo está fuera de servicio (pentium 2, etc.), en realidad ya no importa y no tendrás puestos si vuelves a usar el mismo registro una y otra vez. entonces 8 registros es bastante correcto.

El otro uso para más registros es mantener las constantes de bucle en los registros, y no es necesario en x86 porque cada instrucción puede hacer una carga de memoria, por lo que puede mantener todas sus constantes en la memoria. Esta es la única característica que falta en los RISC (por definición), y aunque lo compensan por ser más fácil de canalizar (su latencia más larga es de 2 ciclos en lugar de 3) y ser ligeramente más superescalar, el tamaño del código aún aumenta un poco. ..

Hay algunos costos no evidentes para agregar más registros. Sus instrucciones son más largas porque necesita más bits, lo que aumenta el tamaño del programa, lo que ralentiza el programa si la velocidad del código está limitada por el ancho de banda de la memoria de las instrucciones de lectura.

También existe el hecho de que cuanto más grande es su archivo de registro, más niveles de multiplexor/circuitos generales debe leer para leer un valor, lo que aumenta la latencia, lo que puede reducir la velocidad del reloj.

Por esta razón, la sabiduría convencional es que más de 32 registros no es realmente una buena idea (no es útil, especialmente en una CPU fuera de servicio), y 8 es demasiado baja (las lecturas de memoria están todavía ¡caro!), y por qué se considera que la arquitectura ideal es algo así como 75% RISC 25% CISC, y por qué ARM es popular (¡casi equilibrado!), casi todas las arquitecturas RISC todavía tienen algunas partes CISC (cálculo de direcciones en cada memoria OP, códigos de operación de 32 bits, pero no más!), ¿Por qué Itanium falló (códigos de operación de 128 bits, registros de 64? ¿No hay cálculo de dirección en operaciones de memoria?). Por todas estas razones, x86 no se ha superado: asegúrese de que la codificación de la instrucción sea una locura, pero aparte de eso, todo el loco reordenamiento y cambio de nombre y la locura de almacenamiento de carga especulativa que hace para mantenerse eficiente es en realidad todo características realmente útiles y son exactamente lo que le da su ventaja sobre varios diseños más simples en orden, como el POWER6. Una vez que reordena y cambia el nombre de todo, todos los conjuntos de instrucciones son más o menos iguales, de todos modos, por lo que es muy difícil hacer un diseño que sea más rápido de cualquier forma, excepto en casos específicos (GPU esencialmente). Una vez que los cpus de ARM sean tan rápidos como los x86, serán tan locos y complicados como los que Intel saca.

+1

x86_64 usa el [prefijo REX] (http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix) para codificar el nuevo se registra porque la antigua codificación x86 no tiene bits sobrantes para el nuevo tamaño de registro –

+1

Las implementaciones x86 de Intel/AMD son rápidas a pesar de la complejidad establecida en el sistema, no por eso. Obtienen la flexibilidad de elegir una representación interna personalizada para uops descodificados, pero podrían traducir una codificación de instrucciones más sensata a uops si se obtuviera una ganancia. La codificación insn de tamaño variable tiene algunas ventajas en algunos casos: es algo así como la compresión, para empaquetar más instrucciones por línea de caché cuando son simples y promedian menos de 4B. Aún así, la decodificación puede ser un cuello de botella importante, excepto cuando se está agotando el caché uop en Sandybridge y más tarde. –

Cuestiones relacionadas