Informática: ¿Por qué la memoria contenida en los registros es tan costosa?

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.

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 :).

Puertos de lectura / escritura.

Para cada microoperación despachada en un ciclo, el procesador debe poder leer hasta dos entradas.

Por cada microoperación completada en un ciclo, el procesador debe poder escribir una salida.

Cada puerto es otro conjunto de cables para cada celda de memoria

Compare eso con la memoria DRAM normal, donde no solo hay un solo cable para cada celda, sino que hay un patrón de acceso complejo que toma múltiples ciclos (RAS / CAS / etc.). Con el archivo de registro de un procesador, no tiene el lujo de esperar tantos ciclos.

Ahora, para un procesador que puede emitir 7 microoperaciones por ciclo, como el Core i7 moderno, el número de puertos necesarios con un esquema ingenuo sería imposible 21. Ese número se reduce a través de una variedad de técnicas:

  1. Lo más importante es que los registros de vectores (Intel: xmm / ymm / …) son un archivo de registro diferente del archivo de registro de enteros normal (los 15 GPR en Intel). Algunos puertos de emisión hacen exclusivamente vectores, y el resto hace exclusivamente instrucciones que no son vectores.
  2. Algunos puertos de emisión son especializados y no necesitan 2 registros de entrada
  3. Bypass de redes
  4. Bancario
  5. etc.

Registre el cambio de nombre.

El número total de registros físicos es, aproximadamente:

  • la cantidad de registros arquitectónicos (por ejemplo, 15 para Intel), más
  • el tamaño de la ventana dinámica de instrucciones (el número de instrucciones / micro-operaciones en el búfer de reordenamiento), ~ 128 para procesadores modernos con programación dinámica.

Entonces ves 15 registros, pero esos son de hecho ~ 143.

Lo anterior se entiende como una descripción general de alto nivel: sé con certeza que Intel, AMD, IBM, etc. utilizan técnicas aún más complejas que las que estoy describiendo.

Dado que los registros son los lugares en su CPU con el tiempo de acceso más rápido, las rutas de datos deben ser de primera categoría. Además, estos registros deben poder accederse desde múltiples lugares simultáneamente. Simplemente hacer una operación simple en un valor en el registro 26, por ejemplo, podría tener que ir a la unidad de coma flotante, o en otro lugar al mismo tiempo. Todas estas cosas conducen a un alto poder de procesamiento utilizado y, debido a toda esta memoria en los registros, es bastante costoso.
Ver ¿Por qué es tan costosa la memoria caché?
estas personas son mucho más inteligentes que yo 🙂

Por la misma razón que los apartamentos en Manhattan son caros. Los registros están en la CPU, y una CPU tiene una pequeña cantidad de espacio en comparación con la cantidad disponible en la memoria principal.

No es costoso, los registros son simplemente flip-flops viejos.

En los viejos tiempos, incluso las chanclas eran caras, por lo que las computadoras solo tenían algunos registros.

Hoy las chanclas son baratas, por lo que el costo no es el problema. Son un poco más calientes y más complejos que otros flip-flops, ya que a menudo quieres que sean de doble puerto y sombreados también.

El número de registros es pequeño en la arquitectura x86 porque solo había unos pocos registros en el 8080. Por lo tanto, solo tiene sus AX, BX, CX, DX, SI, DI, BP básicos. Además de los recién llegados, los registros MMX y los registros SSE. Aún así, no hay una gran cantidad de registros. La otra razón para mantener bajo el número de ellos es el espacio de representación. Cada vez que desea especificar un registro en una instrucción, toma algunos bits, y eso se multiplica por el número de instrucciones, y se convierte en muchos bits. Por lo tanto, le gustaría mantener el campo de índice de registro en un pequeño número de bits, 3 o 4 bits sería bueno. Podría tener 256 registros, pero cada instrucción necesitaría 8 o 16 o 24 bits para especificar, 1, 2 o 3 operandos de registro. Eso mastica la memoria bastante rápido. Un compromiso es cambiar el nombre de los registros, insertarlos en una pila para que cada función obtenga un nuevo conjunto de 16 registros más una ruta a los registros más antiguos.