Renombre de registros

En ingeniería informática, el renombramiento de registros se refiere a una técnica utilizada para evitar la ejecución innecesaria en serie de las instrucciones del programa debido a la reutilización de los mismos registros por parte de dichas instrucciones.

 

Definición del problema

Los programas se componen de instrucciones que operan sobre valores. Las instrucciones deben nombrar estos valores para distinguirlos unos de otros. Una instrucción típica podría decir: suma X e Y y pon el resultado en Z. En esta instrucción, X, Y y Z son los nombres de las ubicaciones de almacenamiento.

Para tener una codificación de instrucciones compacta, la mayoría de los conjuntos de instrucciones de los procesadores tienen un pequeño conjunto de ubicaciones especiales que pueden nombrarse directamente. Por ejemplo, la arquitectura del conjunto de instrucciones x86 tiene 8 registros de enteros, x86-64 tiene 16, muchos RISC tienen 32 y IA-64 tiene 128. En los procesadores más pequeños, los nombres de estas localizaciones se corresponden directamente con los elementos de un archivo de registro.

Diferentes instrucciones pueden tardar diferentes cantidades de tiempo (por ejemplo, la arquitectura CISC). Por ejemplo, un procesador puede ser capaz de ejecutar cientos de instrucciones mientras una sola instrucción de carga de la memoria principal está en curso. Las instrucciones más cortas ejecutadas mientras la carga está pendiente terminarán primero, por lo que las instrucciones están terminando fuera del orden original del programa. La ejecución fuera de orden se ha utilizado en la mayoría de las CPUs recientes de alto rendimiento para lograr algunas de sus ganancias de velocidad.

Considere esta secuencia de instrucciones que se ejecutan en una CPU fuera de orden:

1.CARGAR R1, LOC MEM[1024] 2.R1 = R1 + 2 3.ALMACENAR R1, LOC MEM[1024+8] 4.CARGAR R1, LOC MEM[2048] 5.R1 = R1 + 4 6.ALMACENAR R1, LOC MEM[2048+8]


 Las instrucciones 4, 5 y 6 son independientes de las instrucciones 1, 2 y 3, pero el procesador no puede terminar la 4 hasta que termine la 3, porque entonces la 3 escribiría el valor equivocado.

Solución del problema

Podemos eliminar esta restricción cambiando los nombres de algunos de los registros:

1.CARGAR R1, LOC MEM[1024] 2.R1 = R1 + 2 3.ALMACENAR R1, LOC MEM[1024+8] 4.CARGAR R2, LOC MEM[2048] 5.R2 = R2 + 4 6.ALMACENAR R2, LOC MEM[2048+8]

Ahora las instrucciones 4, 5 y 6 pueden ejecutarse en paralelo con las instrucciones 1, 2 y 3, de modo que el programa puede ejecutarse más rápidamente.

Cuando es posible, los compiladores hacen este renombramiento. Pero los compiladores están limitados por el número de registros dentro de la CPU. Muchas CPUs de alto rendimiento tienen más registros físicos de los que se pueden nombrar directamente en el conjunto de instrucciones y pueden renombrar los registros en el hardware para lograr un mejor paralelismo a nivel de instrucción.

Todo lo que se lee y escribe puede ser renombrado. Mientras que los registros de propósito general y de punto flotante son los más, los registros de bandera y de estado o incluso los bits de estado individuales son comúnmente renombrados también.

Las ubicaciones de memoria también se pueden renombrar, aunque no se suele hacer al nivel que se utiliza en el renombramiento de registros.

Peligros Problema

Cuando más de una instrucción hace referencia a una ubicación particular para un operando, ya sea leyéndolo (como entrada) o escribiéndolo (como salida), la ejecución de esas instrucciones en un orden diferente al del programa original puede causar tres tipos de problemas, también conocidos como peligros:

  • Lectura después de la escritura (RAW)

Una lectura de un registro o ubicación de memoria debe devolver el valor colocado allí por la última escritura en el orden del programa, no otra escritura. Esto se conoce como una verdadera dependencia o dependencia de flujo, y requiere que las instrucciones se ejecuten en el orden del programa.

  • Escritura después de la escritura (WAW)

Las escrituras sucesivas en un determinado registro o ubicación de memoria deben dejar esa ubicación con el resultado de la segunda escritura. Esto puede resolverse aplastando (sinónimos: cancelando, anulando, anulando) la primera escritura si es necesario. Las dependencias WAW también se conocen como dependencias de salida.

  • Escritura después de la lectura (WAR)

Una lectura de un registro o ubicación de memoria debe devolver el último valor anterior escrito en esa ubicación, y no uno escrito programáticamente después de la lectura. Este es el tipo de falsa dependencia que puede resolverse cambiando el nombre. Las dependencias WAR también se conocen como antidependencias.

En lugar de retrasar la escritura hasta que se completen todas las lecturas, se pueden mantener dos copias de la ubicación, el valor antiguo y el nuevo. Las lecturas que preceden, en el orden del programa, a la escritura del nuevo valor pueden recibir el valor antiguo, incluso mientras otras lecturas que siguen a la escritura reciben el nuevo valor. La falsa dependencia se rompe y se crean oportunidades adicionales para la ejecución fuera de orden. Cuando todas las lecturas que necesitan el valor antiguo han sido satisfechas, éste puede ser descartado. Este es el concepto esencial detrás del renombramiento de registros.  

Páginas relacionadas

  • Computación paralela
  • Paralelismo a nivel de instrucción
 

AlegsaOnline.com - 2020 / 2023 - License CC3