¿Por qué no tenemos más registros en microprocesadores?


18

Teóricamente no se requieren registros; Todos los microprocesadores seguirían funcionando sin registros. Pero esta adición aparentemente trivial ha ayudado a que los microprocesadores sean más eficientes.

¿Por qué no podemos tener más registros para extraer más beneficios de ellos? Son solo memoria en chip y uno puede imaginar que no es muy difícil de agregar. ¿Qué factor influyó en el número de registros para ser lo que son ahora y no, digamos 10 veces más?


8
@ Alper91 Muchas arquitecturas, hipotéticas y reales, no tienen registros, y no es necesario en absoluto. Es simplemente una optimización útil.
tubería

44
Hmm Nadie ha mencionado el Sparc. La implementación más grande podría tener 520 registros (32 ventanas por 16 registros, + 8 globales). Estoy seguro de que los recuerdo.
jonk

13
Creo que el número de bits en la instrucción que necesita para especificar el registro es un gran problema. Si tiene 1024 registros, entonces necesita al menos 30 bits para cada instrucción aritmética, a menos que agregue otras restricciones como "los 3 registros deben ser del mismo grupo de 32 (en cuyo caso necesita 20 bits).
user253751

8
@pipe: en realidad, casi cualquier diseño práctico requiere "registros" en el sentido esquemático, ya que incluso si construye una máquina de pila o algo así, debe tener un lugar para guardar los argumentos en la ALU, o de lo contrario las salidas - La mayoría de los recuerdos no tienen tres puertos de acceso. Y una máquina de pila necesita un puntero de pila que es ... ¡un registro! Y no mencionemos los registros de tuberías. Puede ocultar el uso de tales "registros" del programador, pero aún necesita algunos, y probablemente casi tantos como una máquina de registro primitiva.
Chris Stratton

44
@ChrisStratton Claro, pero siempre que no estén expuestos a través de la ISA, es simplemente un detalle de implementación. Sin embargo, es un argumento algo inútil, ya que no sabemos qué significa OP por registro .
tubería

Respuestas:


33

Hay varios factores:

  • Las microarquitecturas de alto rendimiento utilizan el cambio de nombre de registro. Es decir, el número de registros físicos es mayor que el número de registros arquitectónicamente visibles y pueden rastrear usos independientes de ellos.

  • duplicar el número de registros no duplica el rendimiento. ISTR (de Computer Architecture, A Quantitative Approach ) que pasar de 16 a 32 registros trae algo así como una mejora del 10%, suponiendo que el aumento no tiene ningún efecto adverso (que es una suposición muy optimista).

  • los registros arquitectónicamente visibles tienen costos. Por ejemplo:

    • Aumentar su número aumenta el número de bits tomados en el formato de instrucción para indicar en qué registro se está actuando (duplicar el número de registro implica tener un bit más por registro en el formato, evitando así usar esos bits para otros usos o forzar un tamaño de instrucción más largo).
    • Aumentar el número de registros arquitectónicos aumenta el costo de cambio de contexto (ya que deben guardarse y restaurarse en el cambio de contexto).

1
Apostaría a que la mejora del rendimiento de 16 a 32 registros depende totalmente del potencial de optimización del compilador en cuestión. En ensamblador, tener acceso para duplicar el número de registros (en la arquitectura x64) puede mejorar enormemente el rendimiento, pero solo para roles de nicho y solo si realmente se usan.
rdtsc

66
@rdtsc: pasar de 8 a 16 registros arquitectónicos ofrece grandes mejoras en la cantidad de derrames / recargas para el código típico, según los datos de las simulaciones en un documento vinculado a esta respuesta . Afecta el tamaño del código, el recuento de instrucciones y la importancia del reenvío de almacenamiento de baja latencia. 16-> 32 es un efecto mucho más pequeño. AFAICT, 16 registros arquitectónicos es una buena opción para hardware con cambio de nombre de registro para eliminar los peligros WAR y WAW.
Peter Cordes

2
Sin embargo, el AVX512 de Intel agrega 16 registros de vectores más, para un total de 32. (Además de duplicar su ancho a 64 bytes, una línea de caché completa). Ocultar las latencias de las operaciones de FP de alta latencia y alto rendimiento puede requerir muchos registros. por ejemplo, Intel Haswell tiene 5c lat, uno por cada 0.5c de FMA de rendimiento, por lo que necesita 10 acumuladores de vectores para saturar las unidades de ejecución de FMA para una reducción (por ejemplo, producto de punto o sumando una matriz, donde el FMA es parte de una dependencia transportada por bucle ) x86-64 solo tiene 16 registros vectoriales. Pero recuerde, operaciones enteras, esp. en los registros de GP, rara vez tienen más de 1c de latencia.
Peter Cordes

1
La compensación es diferente para los registros de enteros, FP y vectores. Por ejemplo, el guardado / restauración diferido de registros enteros no tiene sentido, hacerlo para el vector uno es una apuesta mucho mejor. Y el vector ISA a menudo tiene más registros que uno entero (AltiVec tiene al menos hasta 128, ISTR ha leído sobre un 256 para Sparc pero no puede encontrar una referencia ahora).
Programador

1
en.wikipedia.org/wiki/AltiVec tiene treinta y dos registros vectoriales de 128b. Sentí curiosidad por SPARC y busqué cómo funcionaba la ventana de registro para los cambios de contexto. Tiene 32 registros visibles a la vez, pero utiliza una ventana deslizante en un archivo de registro más grande. Parece que a partir de esta versión simplificada, el sistema operativo necesita saber el tamaño de todo el archivo de registro de ventana deslizante para guardarlo / restaurarlo, porque aunque las instrucciones de deslizamiento de ventana proporcionan memoria para guardar / restaurar registros si es necesario, se realiza atrapando al sistema operativo.
Peter Cordes

16

Si bien los registros y la RAM son memoria, se accede a ellos de diferentes maneras, para reflejar el costo (en el área del chip o de los ciclos de reloj ocultos) de acceder a ellos.

Los registros están estrechamente vinculados a la ALU, y pueden asumir muchos roles de fuentes de datos, sumideros, modificadores, etc. Por lo tanto, necesitan una gran cantidad de conexiones multiplexadas. En algunas arquitecturas podemos escribir R1 <= R2 + R3, y eso es exactamente lo que sucede en un solo ciclo de reloj. Cada registro se direcciona directamente en el código operativo, este direccionamiento es un recurso muy limitado.

Como los registros son caros de implementar, el número generalmente se limita al orden de 10/20 en la mayoría de las arquitecturas.

La RAM está unida a la CPU, generalmente canalizada a través de una única conexión compartida. Esto hace que sea mucho más barato implementar una gran cantidad de RAM. Las direcciones RAM generalmente provienen de una dirección almacenada en el registro, por lo que no consuma un ancho de instrucción significativo.

SPARC es una arquitectura interesante, con 72 a 640 registros de 64 bits, con un contexto de 32 registros que se puede cambiar con superposiciones para llamadas rápidas de subrutinas con paso de parámetros. Tiende a no encontrarlos en PC y servidores donde el costo es importante, como en el 99.999% de las aplicaciones.


44
Otro aspecto es que debe guardar / restaurar registros durante un cambio de contexto. Más registros, más tiempo.
Michel Billaud

Me gustaría señalar que el antiguo TMS9900 mantuvo todos sus registros de trabajo en la memoria externa en.wikipedia.org/wiki/Texas_Instruments_TMS9900
Peter Smith

1
Me había calificado 'invariablemente' con (excepto algunos ajustes) pero lo saqué para simplificarlo. Tal vez lo cambie a 'en general'. Básicamente, si puede encontrar y comprender las excepciones, no necesita que las señale. Si eres lo suficientemente ingenioso como para ser engañado, entonces no importa, porque no te meterá en problemas. TMS9900, eso era extraño, ¡tenía un 99/4 por mis pecados en una vida anterior, bestia extraña!
Neil_UK

Itanium también tiene ventanas de registro.
Simon Richter

1
@ChrisStratton: Si bien existe algún precedente para que "no se pueden usar los registros X e Y" se consideren parte de un "ABI" (por ejemplo, registros k0 y k1 en mips), es un uso inusual. Ciertamente, hay canales de mensajería encubierta no deseados / inseguros entre procesos si no se realiza el guardado / restauración de estos "registros prohibidos por ABI" en el cambio de contexto. Es decir, los procesos que no deberían poder comunicarse pueden hacerlo almacenando información en los registros prohibidos y esperando cambios de contexto.
R ..

12

Los registros deben ser direccionados dentro de las instrucciones. Si hay muchos registros, la instrucción es más larga. Guardar y restaurar el contenido del registro para un servicio de interrupción necesita más tiempo si hay muchos registros.


5

Como la mayoría de las cosas, el número de registros es un compromiso entre costo, complejidad y utilidad.

Los registros se implementan como RAM estática multipuerto, lo que los hace más costosos (área de chip) que otras opciones de almacenamiento.

Luego se combinan con el conjunto de instrucciones del procesador, al aumentar el número de registros aumenta la complejidad del conjunto de instrucciones. Entonces, si desea seguir siendo compatible con el conjunto de instrucciones, no puede simplemente aumentar la cantidad de registros disponibles en la próxima generación de procesadores para aumentar la eficiencia, los programas no los usarían.

Luego, ¿cuántos registros necesitas realmente? Hay un límite a su utilidad. Considere que escribe un algoritmo que realiza algunas operaciones matemáticas en 1024 bytes, digamos que multiplique por 5. Con el conteo de registros actual, termina con algo como:

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:

Ahora, si tuviera 1024 registros y todos los datos almacenados allí, su programa se vería así:

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

Debido a que cada uno de ellos es una instrucción diferente, cada uno de ellos tiene que ser escrito. Entonces, la memoria de su programa necesario está explotando Tras darse cuenta de esto, es posible que desee introducir algunas instrucciones como, multiply register1 with register(2 to 256). Pero, ¿cuándo se detendría? ¿Proporciona una instrucción para todas las combinaciones?

Entonces, tal vez los números que tenemos disponibles en la actualidad son un buen equilibrio entre costo, complejidad y utilidad.


1
Creo que el programa multiply Register1 with Register2 multiply Register1 with Register3es muy poco realista, ya que los datos deben haber venido directa o indirectamente desde fuera de la computadora, por lo que los registros deben cargarse y los resultados deben usarse en algún lugar, directa o indirectamente, por lo que los registros deben almacenarse. En realidad, un compilador decente de optimización para un lenguaje de alto nivel 'desenrollará' el bucle del primer programa para crear algo como el segundo programa, optimizando el uso del registro, la latencia de la memoria, tal vez la ocupación del caché y la velocidad de ejecución.
gbulmer

1
No hay necesidad de muchas multiply register1 with register(2 to 256)instrucciones de propósito especial . La canalización mejora significativamente el rendimiento de la CPU, especialmente para decodificar y ejecutar instrucciones de forma más sencilla. Por lo tanto, el efecto de las instrucciones de variedad complejas y masivas se puede lograr mediante el uso de varias instrucciones más simples con una tasa de ejecución más alta. Tener un mayor número de registros ayuda al permitir que el compilador genere muchas instrucciones independientes (que no comparten un registro), que se pueden completar de forma independiente, mejorando el rendimiento. Su ejemplo = más registros son mejores.
Gbulmer

4

Los registros son muy caros. Muy caro. No se trata tanto de los registros en sí, sino de todas las conexiones desde y hacia los registros. Digamos que tiene una instrucción reg1 = reg2 + reg3. Para implementar esto rápidamente , debe leer los datos de dos registros en un ciclo y escribir en otro registro en el segundo ciclo. Ahora, si tiene un procesador que puede ejecutar múltiples instrucciones por ciclo, digamos tres instrucciones, necesitaría poder leer datos de seis registros cada ciclo y escribir datos en 3 registros. Esa es una gran cantidad de conexiones muy rápidas.

Por supuesto, puedes usar más transistores. El problema es: la velocidad baja. Necesita más hardware para elegir entre más registros. El espacio para el archivo de registro se hace más grande. Todo eso hace las cosas más lentas. Entonces, con la misma tecnología, es posible que pueda tener 16 registros y ejecutar a 2,600 MHz o tener 32 registros y ejecutar a 2,400 MHz. Ahora los registros adicionales deben compensar una caída significativa en la velocidad del reloj.


2

¿Qué factor influyó en el número de registros?

- Jerarquía de la memoria

Los registros, la caché y la RAM se implementan con diferentes tecnologías de almacenamiento.

Diferentes tecnologías difieren en

  1. Tiempos de acceso
  2. Costo
  3. Densidad

Un ejemplo: los registros internos que se encuentran en una CPU son la memoria estática de acceso aleatorio , mientras que la memoria principal de la computadora es la memoria dinámica de acceso aleatorio

Una celda binaria RAM estática se implementa usando un circuito de 6 transistores, mientras que una celda binaria RAM dinámica se implementa usando un condensador y un transistor. Comparando SRAM y DRAM

  • La memoria SRAM es mucho más rápida que la memoria DRAM [Pocos ciclos para acceder a SRAM en comparación con DRAM]
  • El circuito SRAM consume menos energía que la DRAM
  • DRAM requiere actualizar cada bit en la memoria periódicamente a diferencia de SRAM
  • SRAM cuesta más que DRAM
  • SRAM tiene una densidad más baja en comparación con la DRAM

Por lo tanto, no es práctico aumentar la cantidad de memoria rápida, costosa y de menor densidad. De hecho, podríamos usar algunos de ellos y un programa bien escrito almacenará los datos usados ​​más frecuentes dentro de estos registros rápidos, mientras que los datos usados ​​menos frecuentes se almacenan en la memoria más lenta.

- longitud de la instrucción

La dirección de los registros se incluye dentro de una instrucción, que limita el número de registros accesibles en función de los números de bits que pueden representar la dirección. Por ejemplo, en la arquitectura MIPS, la instrucción de longitud de 32 bits contiene solo 5 bits para representar la dirección de los registros accesibles, lo que limita el número de registros a 2 5 = 32 registros. Incrementar el número de registros requeriría aumentar la longitud de la instrucción para incluir bits suficientes que puedan acceder a todos los registros.


2

Si observa el conjunto de instrucciones de un procesador, hay varias formas de agruparlos. Por ejemplo, todas las ADDinstrucciones pueden agruparse y todas las XORinstrucciones.

Dentro de cada grupo de la misma instrucción, puede haber versiones que operan en la memoria o en los registros. Es este subgrupo lo que define efectivamente el número de registros que tiene el procesador.

Como ejemplo hipotético de 8 bits, digamos que las $Axinstrucciones podrían ser las ADDinstrucciones y $Cxpodrían ser las XORinstrucciones. ¡Con este diseño, solo quedan cuatro bits para definir los operandos!

  • Uno podría tener solo cuatro registros de propósito general, y usar dos bits para definir uno, y dos bits para definir el otro.
  • O bien, uno podría usar el primer bit para distinguir variantes "especiales", y los otros 3 bits para definir cuál de los ocho registros para operar con el acumulador ( $x0podría ser el acumulador mismo).
  • O bien, uno podría tener más que este número de registros, pero luego limitar qué registros son accesibles para qué instrucciones.

Por supuesto, hemos pasado conjuntos de instrucciones de 8 bits. Pero aún así, esta lógica ayudó a definir conjuntos de registros en el pasado; continuará haciéndolo en el futuro.

EDITAR (según lo solicitado)

Decir la parte superior cuatro bits son para la instrucción: ADD, SUB, XOR, MOV, CMPetc Hay 16 posibilidades aquí. Luego, para aquellas instrucciones en las que tiene sentido registrarse para registrarse (por ejemplo ADD Rx,Ry), debe especificar Rxy Ry. Digamos que los siguientes dos bits son para x, y los dos últimos son para y. Así:

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

¡Con solo dos bits para definir un registro como este, solo tiene espacio para un total de cuatro registros!

Como comentario adicional, notará que algunas combinaciones de registros no tienen sentido. Por ejemplo, MOV Rx, Rx(no hace nada) y SUB Rx, Rx(siempre produce 0). Estas podrían convertirse en instrucciones de casos especiales:

  1. SUB Rx, Rxpodría convertirse en NOT Rxuna instrucción de un solo operando.
  2. MOV Rx, Rxpodría convertirse en una MOVinstrucción que toma un segundo byte como valor inmediato, interpretado como MOV Rx, #$yy.

De esta manera, puede "jugar" con el mapa de instrucciones, completando los huecos para obtener instrucciones de otro modo inútiles o sin sentido para proporcionar un conjunto de instrucciones más amplio para el programador. Pero en última instancia, el conjunto de instrucciones define el conjunto de registros.


Todavía estoy confundido, ¿puedes explicar cómo solo quedan 4 bits para los operandos?
Darshan Chaudhary

Comprueba mi respuesta actualizada
John Burger

1
En mi humilde opinión, esta respuesta se mejoraría significativamente moviendo el " ejemplo hipotético asumido un conjunto de instrucciones de 8 bits " al comienzo de la pregunta. Perdí el tiempo tratando de darle sentido, concluí que solo tenía sentido para una instrucción de longitud fija de 8 bits, luego seguí leyendo para descubrir que ese era el caso. En mi humilde opinión, ese tipo de conjunto de instrucciones no es muy irrelevante en el contexto de la pregunta; todo su espacio de direcciones podría ser RAM estática estrechamente acoplada. También creo que la parte que comienza " Algunas combinaciones de registros no tienen sentido ... " no es relevante para la pregunta y podría eliminarse. Mi $ 0.02
gbulmer

-2

Intel está utilizando miles de registros hoy en día, cientos por núcleo de CPU. Pero la mayor cantidad de datos almacenados en una CPU está en caché, lo que indirectamente responde a la pregunta. La caché está organizada en capas, con una pequeña caché L1 rápida y cachés L2 y L3 más lentas más lejos. El archivo de registro en cierto sentido es L0, incluso más rápido que L1 pero también más pequeño. Por lo tanto, podría aumentar el número de registros, pero eso probablemente los ralentizaría.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.