Si no te importa, déjame reformular un poco tu pregunta. Lo que realmente creo que está llegando es esto: ¿por qué hay solo un pequeño número de registros de CPU en comparación con el tamaño de la memoria? Y como TL; DR sostengo que si bien las respuestas de otros respondedores son ciertamente restricciones en el diseño del archivo de registro, la razón fundamental es que simplemente no necesitamos tantas. Si no necesitamos tantos, podemos usar esa área para otras cosas que aceleran el cálculo. Y * eso * es lo que hace el intercambio, es costoso en términos de pérdida de área para algo más eficiente. Y ciertamente la escala también ocurre, no construiríamos incluso un caché L1 (que es aproximadamente 3 veces más latencia que un archivo de registro) de la misma manera que construimos registros.
Me gustan las otras respuestas y estoy de acuerdo con ellas. Los registros tienen que ser rápidos, porque esperamos que alimenten ALU, a menudo para instrucciones que requieren un ciclo para ejecutarse, o en unidades funcionales canalizadas que toman una instrucción para completar cada ciclo (así que para mantenerlo ocupado, desea emitir nuevos datos a cada ciclo). A menudo, las instrucciones toman múltiples (dos) operandos del archivo de registro para completar, por lo que los archivos de registro deben ser multipuertos (o usar algún otro diseño inteligente), lo que aumenta la cantidad de transistores y cables necesarios para implementar cada bit en cada registro. Y ciertamente esperamos que los registros contengan los valores correctos como dice Maxwell, aunque el archivo de registro no es una de las piezas de hardware que logra esto, ni afecta el diseño físico real de los archivos de registro de la forma en que él afirma (aunque, incorrecto las relaciones de transistor para memorias pueden dar como resultado que la SRAM o los flip flops tengan su estado de descomposición).
Sostengo que el archivo de registro está limitado por la capacidad de un compilador para hacer uso efectivo de esos registros y es por eso que tenemos el tamaño del archivo de registro que tenemos. Si un compilador no puede hacer uso (efectivo) de una gran cantidad de registros, entonces realmente no hay razón para tenerlos. La asignación de registros es un algoritmo complejo que generalmente se deja para el estudio de posgrado. Pero, incluso los mejores algoritmos para esta lucha hacen uso de la cantidad de registros que proporciona un ISA. Algunas investigaciones antiguas de la década de 1990 (que todavía se muestran en los cursos de diseño de compilación de posgrado) muestran que incluso con la asignación de registros interprocediales (que hace un mejor uso de los registros, que los esquemas locales o globales), el mayor número de registros que necesitaría es 52 Tal vez esto ha cambiado, las cargas de trabajo ciertamente lo han hecho. No estoy al día con los últimos avances en la asignación de registros, pero me sorprendería saberlo.
- ¿En qué se diferencia la entrevista de pasantía SWE de Facebook de la de Google?
- ¿Qué reglas debo seguir para seleccionar todas las rutas que son válidas de un vértice a otro vértice?
- ¿Cuál es la estructura de datos utilizada por el cerebro para almacenar datos?
- ¿Por qué un montón de tamaño n tiene altura de piso (log (n))?
- ¿Es correcto que XNOR y XOR se comporten igual si tienen un número impar de entradas y se complementan si tienen un número par de entradas?
Además, en realidad tenemos más registros para el cálculo de los que son visibles para el programador; el cambio de nombre de registro se realiza en casi todas las CPU, excepto la más simple. Esto aumenta el conteo de registros en al menos 2x. Los búferes de reordenamiento tienen circuitos similares en su memoria para guardar los resultados que se escribirán en el archivo de registro o se guardarán en la memoria caché, y en las máquinas superescalares muy grandes a fines de la década de 1990 y principios de la década de 2000 vimos máquinas que tenían cientos de entradas, todas que debía ser muy rápido para garantizar que el IPC permaneciera alto (el ancho de banda para el archivo de registro y el ancho de banda a través de la red de derivación son importantes).
Algunos otros ejemplos que existen son la arquitectura SPARC, que como mínimo tiene unos cientos de registros arquitectónicamente visibles (aunque debe intercambiar entre “ventanas de registro” y algunos de los registros entre ventanas adyacentes son compartidos). Las GPU tienen diferentes diseños de archivos de registro, con diferentes latencias y un modelo de ejecución diferente, pero es notable que se usan más bits para los registros que para la caché L1, y el factor principal es que el compilador puede hacer uso de esos registros Pero esa es una pregunta completamente nueva, y una respuesta tan larga como esta :).