Renombre de registros para niños
En la arquitectura de computadores, el renombre de registros es una técnica que usan los procesadores para hacer que los programas funcionen más rápido. Ayuda a evitar que las operaciones se detengan sin necesidad, incluso si el programa parece usar los mismos espacios de almacenamiento temporal, llamados registros, una y otra vez.
Contenido
¿Qué problema resuelve el renombre de registros?
Los programas de computadora están hechos de instrucciones que trabajan con datos. Para que el procesador sepa dónde están esos datos, las instrucciones les dan nombres, como "X", "Y" o "Z". Por ejemplo, una instrucción podría decir: "Suma X e Y y guarda el resultado en Z". Aquí, X, Y y Z son lugares donde se guardan los datos.
Para que las instrucciones sean cortas y eficientes, la mayoría de los procesadores tienen un grupo pequeño de estos lugares especiales, llamados registros, a los que se puede acceder directamente. Por ejemplo, algunos procesadores tienen 8 o 16 registros, mientras que otros más avanzados pueden tener 32 o incluso 128. En los procesadores más sencillos, estos nombres de registros corresponden directamente a partes de la memoria interna del procesador.
Las diferentes instrucciones no tardan lo mismo en ejecutarse. Por ejemplo, un procesador puede hacer cientos de operaciones mientras espera que se cargue un dato desde la memoria principal. Las instrucciones más rápidas pueden terminar antes, incluso si aparecían después en el programa original. Esto se llama ejecución fuera de orden y ayuda a que los procesadores de alto rendimiento sean más veloces.
Imagina este ejemplo de código en un procesador que puede ejecutar instrucciones fuera de orden:
- Cargar un dato de la posición de memoria 1024 en el registro 1.
- Sumar 2 al dato que está en el registro 1.
- Guardar el dato del registro 1 en la posición de memoria 1032.
- Cargar un dato de la posición de memoria 2048 en el registro 1.
- Sumar 4 al dato que está en el registro 1.
- Guardar el dato del registro 1 en la posición de memoria 2056.
Las instrucciones 4, 5 y 6 no dependen de los resultados de las instrucciones 1, 2 y 3. Sin embargo, el procesador no podría empezar la instrucción 4 hasta que la 3 haya terminado. ¿Por qué? Porque todas usan el "registro 1". Si la instrucción 4 empezara antes, la instrucción 3 podría escribir un valor incorrecto en el registro 1, afectando a la instrucción 4.
Podemos solucionar esto cambiando los nombres de algunos registros, como si les diéramos un nuevo espacio de trabajo:
- Cargar un dato de la posición de memoria 1024 en el registro 1.
- Sumar 2 al dato del registro 1.
- Guardar el dato del registro 1 en la posición de memoria 1032.
- Cargar un dato de la posición de memoria 2048 en el registro 2.
- Sumar 4 al dato del registro 2.
- Guardar el dato del registro 2 en la posición de memoria 2056.
Ahora, las instrucciones 4, 5 y 6 pueden ejecutarse al mismo tiempo que las instrucciones 1, 2 y 3. Esto hace que el programa se ejecute mucho más rápido.
A veces, el programa que crea el código (el compilador) puede hacer este cambio de nombres. Pero el compilador tiene límites, como el número fijo de nombres de registros que puede usar. Por eso, muchos procesadores avanzados tienen más registros físicos de los que se pueden nombrar directamente. Así, el procesador puede renombrar los registros internamente para lograr aún más velocidad.
Problemas y soluciones con el renombre
Cuando varias instrucciones usan el mismo lugar para guardar datos, ya sea para leer o escribir, ejecutarlas en un orden diferente al original puede causar tres tipos de problemas. Estos problemas se conocen como dependencias:
- Lectura después de escritura (RAW)
- Una instrucción que lee un registro o una posición de memoria debe obtener el valor que la última instrucción escribió en ese lugar. Esto se llama dependencia verdadera y significa que las instrucciones deben seguir el orden original del programa.
- Escritura después de escritura (WAW)
- Si varias instrucciones escriben en el mismo registro o posición de memoria, al final, ese lugar debe contener el resultado de la última escritura. Esto se puede solucionar descartando cualquier escritura anterior si es necesario.
- Escritura después de lectura (WAR)
- Una instrucción que lee un registro o una posición de memoria debe obtener el valor que estaba allí antes de que la instrucción actual empezara. No debe obtener un valor que otra instrucción escriba después de la lectura. Este tipo de dependencia se llama falsa dependencia o anti-dependencia. El renombre de registros ayuda a resolver este problema.
En lugar de esperar a que todas las lecturas terminen antes de escribir un nuevo valor, el procesador puede mantener dos copias del lugar: una con el valor antiguo y otra con el nuevo. Las instrucciones que necesitan el valor antiguo lo obtienen, y las que necesitan el nuevo lo obtienen. Así, se rompe la falsa dependencia y el procesador puede ejecutar más instrucciones al mismo tiempo. Una vez que ya no se necesita el valor antiguo, se elimina. Esta es la idea principal detrás del renombre de registros.
Cualquier lugar que se lea y se escriba puede ser renombrado. Aunque se usa principalmente para los registros de uso general, también se aplica a otros tipos de registros.
Las posiciones de memoria también podrían renombrarse, aunque no es tan común.
Si los programas evitaran reutilizar los registros de inmediato, el renombre no sería tan necesario. Algunos procesadores tienen muchos registros precisamente por esta razón. Sin embargo, hay límites a este enfoque:
- Es difícil para el compilador evitar reutilizar registros sin que el código se haga mucho más largo.
- Un gran número de registros requiere más bits para identificarlos, lo que también aumenta el tamaño del código.
- Históricamente, muchos procesadores se diseñaron con pocos registros y eso no se puede cambiar fácilmente.
Un código más grande es un problema porque llena más rápido la memoria caché del procesador, lo que puede hacer que el procesador espere por nuevas instrucciones.
Registros de arquitectura y registros físicos
Los programas de computadora usan un conjunto limitado de registros que son parte del diseño del procesador. Por ejemplo, un procesador puede tener 32 registros para números enteros y 32 para números con decimales. Estos son los registros de arquitectura. Cuando un programador revisa el programa, ve el contenido de estos 64 registros.
Pero un procesador real puede tener muchos más registros de los que el programa "ve". Por ejemplo, un procesador podría tener 80 registros para números enteros y 72 para números con decimales. Estos son los registros físicos. El renombre de registros es el proceso de asignar los registros de arquitectura (los que el programa usa) a los registros físicos disponibles en el chip.
Hay dos formas principales en que los procesadores hacen este renombre:
En la técnica de archivo de registros indexado por etiquetas, hay un gran espacio de almacenamiento para los datos, con un registro para cada "etiqueta" o nombre interno. Cuando una instrucción necesita datos, las etiquetas de los registros se envían a este archivo, se leen los valores y se envían a la parte del procesador que los necesita.
En la técnica de estaciones de reserva, hay muchos espacios de almacenamiento más pequeños, a menudo uno en la entrada de cada parte del procesador que ejecuta instrucciones. Cada dato que una instrucción necesita tiene un lugar en uno de estos archivos. Cuando una instrucción se envía para ejecutarse, los datos se leen de estos archivos y se envían a la unidad de ejecución.
Véase también
En inglés: Register renaming Facts for Kids