Desambiguación de la memoria


La desambiguación de memoria es un conjunto de técnicas empleadas por microprocesadores de ejecución fuera de orden de alto rendimiento que ejecutan instrucciones de acceso a la memoria (cargas y almacenamientos) fuera del orden del programa. Los mecanismos para realizar la desambiguación de la memoria, implementados mediante lógica digital dentro del núcleo del microprocesador, detectan verdaderas dependencias entre las operaciones de la memoria en el momento de la ejecución y permiten que el procesador se recupere cuando se ha violado una dependencia. También eliminan las dependencias de memoria espurias y permiten un mayor paralelismo a nivel de instrucciones al permitir la ejecución fuera de orden segura de cargas y almacenamientos.

Al intentar ejecutar instrucciones desordenadas, un microprocesador debe respetar las verdaderas dependencias entre instrucciones . Por ejemplo, considere una dependencia verdadera simple:

En este ejemplo, la addinstrucción en la línea 2 depende de la addinstrucción en la línea 1 porque el registro R1 es un operando fuente de la operación de suma en la línea 2. La addlínea 2 no puede ejecutarse hasta addque se complete la línea 1. En este caso, la dependencia es estática y fácilmente determinada por un microprocesador, porque las fuentes y los destinos son registros. El registro de destino de la addinstrucción en la línea 1 ( R1) es parte de la codificación de la instrucción y, por lo tanto, el microprocesador puede determinarlo desde el principio, durante la etapa de decodificación de la canalización. De manera similar, los registros fuente de la addinstrucción en la línea 2 ( R1yR4) también se codifican en la propia instrucción y se determinan en la decodificación. Para respetar esta verdadera dependencia, la lógica del planificador del microprocesador emitirá estas instrucciones en el orden correcto (instrucción 1 primero, seguida de la instrucción 2) para que los resultados de 1 estén disponibles cuando la instrucción 2 los necesite.

Las complicaciones surgen cuando la dependencia no es estáticamente determinable. Estas dependencias no estáticas surgen con las instrucciones de memoria (cargas y almacenamientos) porque la ubicación del operando puede especificarse indirectamente como un operando de registro en lugar de especificarse directamente en la codificación de la instrucción misma.

Aquí, la instrucción de almacenamiento escribe un valor en la ubicación de memoria especificada por el valor en la dirección (R2+2), y la instrucción de carga lee el valor en la ubicación de memoria especificada por el valor en la dirección (R4+4). El microprocesador no puede determinar estáticamente, antes de la ejecución, si las ubicaciones de memoria especificadas en estas dos instrucciones son diferentes o son la misma ubicación, porque las ubicaciones dependen de los valores en R2 y R4. Si las ubicaciones son diferentes, las instrucciones son independientes y se pueden ejecutar con éxito fuera de orden. Sin embargo, si las ubicaciones son las mismas, la instrucción de carga depende de la tienda para producir su valor. Esto se conoce como una dependencia ambigua .

La ejecución de cargas y almacenamientos fuera de servicio puede producir resultados incorrectos si un par de carga/almacenamiento dependiente se ejecutó fuera de servicio. Considere el siguiente fragmento de código, proporcionado en el ensamblado de MIPS :