22 votos

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

En teoría, los registros no son necesarios; todos los microprocesadores seguirían funcionando sin registros. Pero esta adición aparentemente trivial ha ayudado a hacer que los microprocesadores sean más eficientes.

¿Por qué no podemos tener más registros para aprovechar aún más de ellos? Simplemente son memoria en el chip y se puede imaginar que no es muy difícil de añadir, ¿verdad? ¿Qué factor influyó en que el número de registros sea el que es ahora y no, por ejemplo, 10 veces más?

0 votos

Legado. Mucho de él.

0 votos

No entendí lo que quieres decir. Los registros son totalmente necesarios para que funcione un mP. De hecho, son la condición #1 para comenzar.

8 votos

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

37voto

Jason Puntos 261

Hay varios factores:

  • Las microarquitecturas de alto rendimiento utilizan renombramiento de registros. Es decir, el número de registros físicos es mayor que el número de registros arquitectónicamente visibles y son capaces de rastrear usos independientes de los mismos.

  • Duplicar el número de registros no duplica el rendimiento. Recuerdo (de Arquitectura de computadoras, un enfoque cuantitativo) que pasar de 16 a 32 registros trae algo así como una mejora del 10% asumiendo que el aumento no tenga efectos adversos (lo cual es una suposición muy optimista).

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

    • Aumentar su número aumenta la cantidad de bits utilizados en el formato de instrucción para indicar en qué registro se está actuando (doblar el número de registros implica tener un bit más por registro en el formato, lo que impide utilizar 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 ser guardados y restaurados en el cambio de contexto).

2 votos

Yo apostaría a que la mejora de rendimiento de 16 a 32 registros depende totalmente del potencial de optimización del compilador en cuestión. En ensamblador, tener acceso al doble de registros (en arquitectura x64) puede mejorar enormemente el rendimiento - pero solo para roles específicos, y solo si realmente se utilizan.

7 votos

@rdtsc: pasar de 8 a 16 registros arquitectónicos brinda grandes mejoras en la cantidad de spills/recargas para código típico, según datos de simulaciones en un artículo vinculado desde esta respuesta. Afecta al tamaño del código, la cantidad de instrucciones y a la importancia de la reenviós de almacenamiento de baja latencia. 16->32 tiene un efecto mucho menor. Según mi entendimiento, 16 registros arquitectónicos es una buena elección para hardware con renombramiento de registros para eliminar los peligros WAR y WAW.

2 votos

Sin embargo, la AVX512 de Intel añade 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 la latencia de operaciones FP de alta latencia y alto rendimiento puede requerir muchos registros. Por ejemplo, Intel Haswell tiene una latencia de 5c, uno por cada FMA de 0.5c de rendimiento, por lo que necesitas 10 acumuladores de vectores para saturar las unidades de ejecución de FMA para una reducción (por ejemplo, producto punto, o sumando una matriz, donde el FMA es parte de una dependencia llevada en bucle). x86-64 sólo tiene 16 registros de vectores. Pero recuerda, las operaciones enteras, especialmente en los registros GP, raramente tienen más de 1c de latencia.

16voto

user44635 Puntos 4308

Mientras que los registros y la RAM son ambos tipos de memoria, se acceden de diferentes maneras, reflejando el costo (en área de chip o ciclos de reloj ocultos) de acceder a ellos.

Los registros están estrechamente vinculados a la ALU y pueden desempeñar muchos roles, como 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 es direccionado directamente en el código de operación, y esta dirección es un recurso bastante limitado.

Dado que los registros son costosos de implementar, generalmente su número está limitado al orden de 10/20 en la mayoría de las arquitecturas.

La RAM está menos vinculada a la CPU, generalmente canalizándose a través de una única conexión compartida. Esto hace que sea mucho más económico implementar una gran cantidad de RAM. Las direcciones de RAM generalmente provienen de una dirección almacenada en un registro, por lo que no consumen un ancho de instrucción significativo.

SPARC es una arquitectura interesante, con entre 72 y 640 registros de 64 bits, con un contexto de 32 registros que se pueden desplazar con solapamientos para llamadas rápidas a subrutinas con paso de parámetros. No es común encontrarlos en PCs y servidores donde el costo es importante, como ocurre en el 99.999% de las aplicaciones.

4 votos

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

0 votos

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

1 votos

Tuve clasificado 'invariablemente' con (excepto algunos ajustes) pero lo saqué para simplificarlo. Quizás simplemente lo cambie a 'generalmente'. Básicamente, si puedes encontrar y entender las excepciones, no necesitas que te las señale. Si eres lo suficientemente ingenuo como para ser engañado, entonces no importa, porque no te meterás en problemas. TMS9900, eso fue raro, tuve un 99/4 por mis pecados en una vida anterior, ¡extraña bestia!

13voto

Uwe Puntos 43

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

5voto

Stefan Arentz Puntos 151

Como la mayoría de las cosas, la cantidad de registros es un compromiso entre costo, complejidad y utilidad.

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

Luego se acoplan con el conjunto de instrucciones del procesador, aumentar la cantidad de registros aumenta la complejidad del conjunto de instrucciones. Por lo tanto, si desea mantener la compatibilidad 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.

¿Cuántos registros realmente necesita? Existe un límite para su utilidad. Considere que escribe un algoritmo que realiza alguna operación matemática en 1024 bytes, digamos multiplicar por 5. Con los conteos de registros actuales, terminaría con algo como:

cargar operando1=5
cargar dirección
bucle: cargar operando2=byte1@dirección
multiplicar Registro1 con Registro2
almacenar resultado
incrementar dirección
si dirección = fin ir a finBucle
saltar bucle
endLoop:

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

multiplicar Registro1 con Registro2
multiplicar Registro1 con Registro3
multiplicar Registro1 con Registro4
multiplicar Registro1 con Registro5
multiplicar Registro1 con Registro6
...

Debido a que cada uno es una instrucción diferente, cada uno de ellos debe escribirse. Así que su memoria de programa necesaria está creciendo exponencialmente. Después de darse cuenta de esto, es posible que desee introducir algunas instrucciones como multiplicar registro1 con registro(2 a 256). Pero, ¿cuándo parar, proporciona una instrucción para todas las combinaciones?

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

1 votos

Creo que el programa multiplicar Registro1 con Registro2 multiplicar Registro1 con Registro3 es muy irrealista ya que los datos deben haber llegado 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 buen compilador optimizador para un lenguaje de alto nivel 'desenrollará' el bucle del primer programa para crear algo similar al segundo programa, optimizando el uso de registros, la latencia de memoria, tal vez la ocupación de caché y la velocidad de ejecución.

1 votos

No hay necesidad de muchas instrucciones de propósito especial multiplicar registro1 con registro(2 a 256). El proceso de tuberías mejora significativamente el rendimiento de la CPU, especialmente para instrucciones más simples de decodificar y ejecutar. Por lo tanto, el efecto de diversas instrucciones complejas y masivas se puede lograr mediante el uso de varias instrucciones más simples con una tasa de ejecución más alta. Contar con un mayor número de registros ayuda al permitir que el compilador genere muchas instrucciones independientes (aquellas que no comparten un registro), que pueden completarse de manera independiente, mejorando el rendimiento. Tu ejemplo = más registros son mejores.

2voto

John Burger Puntos 648

Si echas un vistazo al conjunto de instrucciones de un procesador, hay varias formas de agruparlas. Por ejemplo, todas las instrucciones ADD podrían estar agrupadas juntas, al igual que todas las instrucciones XOR.

Dentro de cada grupo de instrucciones iguales, puede haber versiones que operan en la memoria o en registros. Es esta sub-agrupación la que define efectivamente el número de registros que tiene el procesador.

Como ejemplo hipotético de 8 bits, digamos que las instrucciones $Ax podrían ser las instrucciones ADD, y $Cx podrían ser las instrucciones XOR. ¡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, uno podría usar el primer bit para distinguir variantes "especiales", y los otros 3 bits para definir con qué uno de los ocho registros operar con el acumulador ($x0 podría ser el acumulador en sí mismo).
  • O, uno podría tener más registros que este número, pero luego limitar qué registros son accesibles para qué instrucciones.

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

EDICIÓN (según solicitud)

Digamos que los cuatro bits superiores son para la instrucción: ADD, SUB, XOR, MOV, CMP etc. Hay 16 posibilidades aquí. Luego, para aquellas instrucciones donde tiene sentido de registro a registro (por ejemplo ADD Rx, Ry), necesitas especificar Rx y Ry. Digamos que los dos siguientes bits son para x, y los últimos dos son para y. Por lo tanto:

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

Con solo dos bits para definir un registro de esta manera, ¡solo tienes espacio para un total de cuatro registros!

Como nota aparte, notarás 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, Rx podría convertirse en NOT Rx - una instrucción de un solo operando.
  2. MOV Rx, Rx podría convertirse en una instrucción MOV que tome un segundo byte como un valor inmediato, interpretado como MOV Rx, #$yy.

De esta manera, puedes "jugar" con el mapa de instrucciones, llenando los vacíos para instrucciones de lo contrario inútiles o sin sentido para proporcionar un conjunto de instrucciones más grande para el programador. Pero en última instancia, el conjunto de instrucciones define el conjunto de registros.

0 votos

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

0 votos

Verifica mi respuesta actualizada

1 votos

En mi humilde opinión, esta respuesta mejoraría significativamente al mover el "ejemplo hipotético asume un conjunto de instrucciones de 8 bits" al principio de la pregunta. Perdí tiempo tratando de entenderlo, concluí que solo tenía sentido para un conjunto de instrucciones de 8 bits y longitud fija, luego seguí leyendo para descubrir que es el caso. En mi opinión, ese tipo de conjunto de instrucciones no es muy relevante en el contexto de la pregunta; todo su espacio de direcciones podría ser una RAM estática fuertemente acoplada. También creo que la parte que comienza con "Algunas combinaciones de registros no tienen sentido ..." " no es relevante para la pregunta y podría ser eliminada. Mi opinión es solo mi punto de vista.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X