Ejecución especulativa


La ejecución especulativa es una técnica de optimización en la que un sistema informático realiza alguna tarea que puede no ser necesaria. El trabajo se realiza antes de que se sepa si es realmente necesario, a fin de evitar un retraso en el que se tendría que incurrir al realizar el trabajo después de que se sabe que es necesario. Si resulta que el trabajo no era necesario después de todo, la mayoría de los cambios realizados por el trabajo se revierten y los resultados se ignoran.

El objetivo es proporcionar más simultaneidad si hay recursos adicionales disponibles. Este enfoque se emplea en una variedad de áreas, incluida la predicción de ramas en procesadores en cadena , la predicción de valor para explotar la localidad de valor, la obtención previa de memoria y archivos y el control de concurrencia optimista en sistemas de bases de datos . [1] [2] [3]

Los microprocesadores de canalización modernos utilizan la ejecución especulativa para reducir el costo de las instrucciones de bifurcación condicionales mediante esquemas que predicen la ruta de ejecución de un programa basándose en el historial de ejecuciones de bifurcaciones. [2] Con el fin de mejorar el rendimiento y la utilización de los recursos informáticos, las instrucciones se pueden programar en un momento en el que aún no se ha determinado que las instrucciones deberán ejecutarse, antes de una rama . [4]

La ejecución ansiosa es una forma de ejecución especulativa en la que se ejecutan ambos lados de la rama condicional; sin embargo, los resultados se confirman solo si el predicado es verdadero. Con recursos ilimitados, la ejecución ávida (también conocida como ejecución de Oracle ) proporcionaría en teoría el mismo rendimiento que la predicción de rama perfecta . Con recursos limitados, la ejecución ávida debe emplearse con cuidado, ya que la cantidad de recursos necesarios crece exponencialmente con cada nivel de rama ejecutado con entusiasmo. [6]

La ejecución predictiva es una forma de ejecución especulativa en la que se predice algún resultado y la ejecución procede a lo largo de la ruta prevista hasta que se conoce el resultado real. Si la predicción es verdadera, se permite que la ejecución predicha se confirme; sin embargo, si hay una predicción errónea, la ejecución debe desenrollarse y volver a ejecutarse. Las formas comunes de esto incluyen predictores de rama y predicción de dependencia de la memoria . En ocasiones, una forma generalizada se denomina predicción de valor. [7]

La ejecución perezosa es lo opuesto a la ejecución ansiosa y no implica especulación. La incorporación de la ejecución especulativa en implementaciones del lenguaje de programación Haskell , un lenguaje perezoso, es un tema de investigación actual. Eager Haskell , una variante del lenguaje, está diseñado en torno a la idea de ejecución especulativa. Una tesis doctoral de 2003 hizo que GHC respaldara una especie de ejecución especulativa con un mecanismo de aborto para retroceder en caso de una mala elección llamada ejecución optimista . [8] Se consideró demasiado complicado. [9]