¿Qué es la unidad de predicción especulativa que tienen algunas CPU?

¿Qué es la unidad de predicción especulativa que tienen algunas CPU?

Josep Roca

Una de las partes más desconocidas por el hecho que el marketing no suele hablar de ellas son las unidades de predicción de saltos y la ejecución especulativa de los procesadores. Estas unidades son importantes porque son una parte esencial del rendimiento en muchas arquitecturas de los procesadores que están en todo tipo dispositivos informáticos. Os explicamos de manera rápida y sencilla cuál es su cometido y qué ventajas aportan.

En este mundo nada es seguro, todo es pura incertidumbre, incluso para una pobre CPU que lo único que hace es ejecutar código de manera secuencial hasta que inesperadamente le llega una instrucción de salto.

Predicción de saltos en una CPU

Predicción saltos CPU

Las CPUs a la hora de ejecutar un programa lo hacen de manera secuencial; esto significa que una vez han leído y han ejecutado una instrucción pasan a la siguiente línea que se encuentra en la siguiente dirección de memoria.

La forma más habitual de ahorrar código a través de la recursión son los saltos, instrucciones que cambian el valor del contador de programa que indica la dirección de memoria de la RAM que ha de leer la CPU, haciendo que el procesador ejecute el código situado a partir de esa nueva dirección de memoria que le hemos marcado con la instrucción de salto.

Cuando se produce un salto, el tiempo entre la instrucción ejecutada previa al salto y la primera instrucción después del salto es más alto que el traslado de una instrucción a otra de manera secuencial.

La unidad de predicción de saltos lo que hace es hacer de avanzadilla y comprobar si el salto se va a producir o no y adelantarse. En el caso de que el salto sea obligatorio y no tenga una instrucción condicional de antemano entonces la unidad de salto prepara el salto lo más rápidamente posible y deja la situación preparada para realizarlo.

Saltos condicionales

saltos condicionales

Con los saltos condicionales la cosa es distinta, porque no puede saber si se va a dar o no se va a dar el salto de antemano ya que antes ha de ejecutar la condición. Las unidades de predicción no saben leer el código, solo prevén el salto a través de ciertas condiciones y hay veces que fallan por completo haciendo que la CPU pierda una gran cantidad de ciclos en realizar el salto previamente porque la unidad de predicción ha fallado por completo.

Imaginad que la unidad de predicción de saltos es una persona que se encuentra con el dilema de las tres puertas o de Motley Fool, no sabe cuál escoger y se queda completamente bloqueada porque necesita saber de antemano cuál de las tres puertas coger; es aquí donde entra la ejecución especulativa que le permite a la CPU escoger la opción más adecuada.

Ejecución Especulativa

Bingo

La idea de la ejecución especulativa es que todas las opciones posibles en un salto se ejecuten en una rama de ejecución aparte, o dicho de otra manera, que la CPU no escoja una de las tres puertas sino las tres a la vez y luego una vez sepa qué rama del código se ejecuta descartar las dos no utilizadas.

Esto significa que la CPU coge el salto como si se cumpliese ya de antemano, de manera independiente a si se va a cumplir o no, y lo ejecuta internamente. Si el salto condicional se da, entonces la CPU ha ganado una ventaja con el tiempo y se ha adelantado correctamente, si no se cumple entonces se descarta por completo esa rama del código y en teoría no afecta a la rama principal.

Por tanto, la ejecución especulativa es la ejecución de código por parte de la CPU que no tiene por qué ser necesaria a priori, pero con ello existe un problema y es que dicho código es válido para la CPU mientras desconozca el resultado de la condición que lo activa y continuara siendo válido o dejara de serlo tan pronto como la CPU conozca si se cumple o no la condición.