La predicción de la dependencia de la memoria es una técnica empleada por microprocesadores de ejecución fuera de orden de alto rendimiento que ejecutan operaciones de acceso a la memoria (cargas y almacenes) fuera del orden del programa, para predecir dependencias verdaderas entre cargas y almacenes en el momento de ejecución de la instrucción . Con la información de dependencia predicha, el procesador puede decidir ejecutar especulativamente ciertas cargas y almacenes fuera de servicio, mientras evita que otras cargas y almacenes se ejecuten fuera de servicio (manteniéndolos en orden). Más adelante en la tubería , desambiguación de la memoria Se utilizan técnicas para determinar si las cargas y almacenes se ejecutaron correctamente y, de no ser así, para recuperar.
Al utilizar el predictor de dependencia de la memoria para mantener en orden la mayoría de las cargas dependientes y los almacenes, el procesador obtiene los beneficios de una ejecución agresiva de carga / almacenamiento fuera de orden, pero evita muchas de las violaciones de la dependencia de la memoria que ocurren cuando las cargas y los almacenes se ejecutaron incorrectamente. Esto aumenta el rendimiento porque reduce el número de vaciados de canalización necesarios para recuperarse de estas violaciones de dependencia de la memoria. Consulte el artículo sobre desambiguación de la memoria para obtener más información sobre las dependencias de la memoria, las violaciones de la dependencia de la memoria y la recuperación.
En general, la predicción de la dependencia de la memoria predice si dos operaciones de memoria son dependientes, es decir, si interactúan accediendo a la misma ubicación de memoria. Además de utilizar la predicción de dependencia de memoria de almacenamiento a carga (RAW o verdadera) para la programación desordenada de cargas y almacenes, se han propuesto otras aplicaciones de predicción de dependencia de memoria. Ver por ejemplo. [1]
La predicción de la dependencia de la memoria es una optimización además de la especulación de la dependencia de la memoria . La semántica de ejecución secuencial implica que las tiendas y las cargas parecen ejecutarse en el orden especificado por el programa. Sin embargo, al igual que con la ejecución desordenada de otras instrucciones, puede ser posible ejecutar dos operaciones de memoria en un orden diferente al que implica el programa. Esto es posible cuando las dos operaciones son independientes. En la especulación de dependencia de la memoria, se puede permitir que se ejecute una carga antes de una tienda que la precede. La especulación tiene éxito cuando la carga es independiente de la tienda, es decir, cuando las dos instrucciones acceden a diferentes ubicaciones de memoria. La especulación falla cuando la carga depende de la tienda, es decir, cuando los dos accesos se superponen en la memoria. En el primero, los diseños modernos fuera de orden, no se utilizó la especulación de la memoria ya que sus beneficios eran limitados. Dado que el alcance de la ejecución fuera de orden aumentó en unas pocas decenas de instrucciones, se utilizó la ingenua especulación de dependencia de la memoria. En la especulación ingenua de dependencia de la memoria , [2] se permite que una carga eluda cualquier almacenamiento anterior. Al igual que con cualquier forma de especulación, es importante sopesar los beneficios de la especulación correcta frente a la multa que se paga por una especulación incorrecta. A medida que el alcance de la ejecución fuera de orden aumenta aún más en varias decenas de instrucciones, los beneficios de rendimiento de la especulación ingenua disminuyen. Para conservar los beneficios de la especulación agresiva sobre la dependencia de la memoria y evitar los costos de la especulación errónea, se han propuesto varios predictores.
La predicción selectiva de la dependencia de la memoria [2] [3] detiene cargas específicas hasta que se tiene la certeza de que no puede ocurrir ninguna violación. No predice explícitamente las dependencias. Este predictor puede retrasar las cargas más de lo necesario y, por lo tanto, producir un rendimiento subóptimo. De hecho, en algunos casos funciona peor que especular ingenuamente todas las cargas lo antes posible. Esto se debe a que a menudo es más rápido realizar errores de especulación y recuperarse que esperar a que se ejecuten todas las tiendas anteriores. La predicción exacta de la dependencia de la memoria se desarrolló en la Universidad de Wisconsin-Madison. Específicamente, Dynamic Speculation and Synchronization [2] [3] retrasa las cargas solo el tiempo que sea necesario al predecir el almacenamiento exacto que debe esperar una carga. Este predictor predice dependencias exactas (par de almacenamiento y carga). El predictor de sinónimos [1] agrupa todas las dependencias que comparten una carga común o instrucción de almacenamiento. El predictor de conjuntos de tiendas [4] representa múltiples dependencias potenciales de manera eficiente al agrupar todas las posibles tiendas de las que puede depender una carga. El predictor de barrera de tienda [5] trata ciertas instrucciones de tienda como barreras. Es decir, no se permite que todas las operaciones posteriores de carga o tienda pasen por alto la tienda específica. El predictor de barrera de tienda no predice explícitamente las dependencias. Este predictor puede retrasar innecesariamente cargas posteriores, aunque independientes. La predicción de la dependencia de la memoria tiene otras aplicaciones más allá de la programación de cargas y almacenes. Por ejemplo, el encubrimiento de la memoria especulativa [1] y la omisión de la memoria especulativa [1] utilizan la predicción de dependencia de la memoria para agilizar la comunicación de valores a través de la memoria.
Analogía con la predicción de ramas
La predicción de la dependencia de la memoria para cargas y almacenes es análoga a la predicción de bifurcaciones para instrucciones de bifurcaciones condicionales . En la predicción de bifurcaciones, el predictor de bifurcaciones predice de qué manera se resolverá la bifurcación antes de que se conozca. A continuación, el procesador puede buscar y ejecutar de forma especulativa instrucciones por una de las rutas de la rama. Más tarde, cuando se ejecuta la instrucción de bifurcación, se puede determinar si la instrucción de bifurcación se predijo correctamente. Si no es así, se trata de una predicción errónea de rama y es necesario un vaciado de la tubería para descartar las instrucciones que se obtuvieron y ejecutaron especulativamente.
La predicción de ramas se puede considerar como un proceso de dos pasos. Primero, el predictor determina la dirección de la rama (tomada o no). Esta es una decisión binaria. Luego, el predictor determina la dirección de destino real. De manera similar, la predicción de la dependencia de la memoria se puede considerar como un proceso de dos pasos. Primero, el predictor determina si existe una dependencia. Entonces determina cuál es esta dependencia.
Ver también
Referencias
- ^ a b c d Moshovos, A .; Sohi, GS (1997). "Optimización de la comunicación de la memoria entre operaciones a través de la predicción de dependencia de datos". Actas del 30º Simposio Internacional Anual de Microarquitectura . MICRO '97. págs. 235–245. doi : 10.1109 / MICRO.1997.645814 .
- ^ a b c Moshovos, Andreas; Incumplimiento, Scott E .; Vijaykumar, TN; Sohi, Gurindar S. (1997). "Especulación dinámica y sincronización de dependencias de datos". Actas del 24º simposio internacional anual sobre arquitectura informática . ISCA '97. págs. 181-193. doi : 10.1145 / 264107.264189 . También como informe técnico, Departamento de Ciencias de la Computación, Universidad de Wisconsin – Madison, marzo de 1996.
- ^ a b Predicción de la dependencia de la memoria, Moshovos, Ph.D. Tesis, Departamento de Ciencias de la Computación, Universidad de Wisconsin – Madison, diciembre de 1998.
- ^ Chrysos, GZ; Emer, JS (1998). "Predicción de la dependencia de la memoria utilizando conjuntos de tiendas". Actas 25º Simposio Internacional Anual de Arquitectura de Computadoras . ISCA '98. págs. 142-153. doi : 10.1109 / ISCA.1998.694770 .
- ^ Aparato para controlar dinámicamente la ejecución desordenada de instrucciones de almacenamiento de carga en un procesador capaz de despachar, emitir y ejecutar múltiples instrucciones en un solo ciclo de procesador, Hesson, LeBlanc y Ciavaglia, IBM, Patente de Estados Unidos 5.615.350, marzo de 1997.