Articulo de referencia

Predictor de ramificaciones

En arquitectura de computadoras , un predictor de bifurcación [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] es un circuito digital que intenta adivinar hacia dónde se dirigirá una bifurcación (...

En arquitectura de computadoras , un predictor de bifurcación [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] es un circuito digital que intenta adivinar hacia dónde se dirigirá una bifurcación (por ejemplo, una estructura if-then-else ) antes de que esto se conozca definitivamente. El propósito del predictor de bifurcación es mejorar el flujo en la tubería de instrucciones . Los predictores de bifurcación desempeñan un papel fundamental para lograr un alto rendimiento en muchas arquitecturas de microprocesadores modernas con arquitectura de tubería .

Figura 1: Ejemplo de una arquitectura de cuatro etapas. Los recuadros de colores representan instrucciones independientes entre sí.

La bifurcación bidireccional se implementa generalmente con una instrucción de salto condicional . Un salto condicional puede ejecutarse, dirigiendo la instrucción a una ubicación diferente en la memoria del programa, o bien, no ejecutarse, continuando la ejecución inmediatamente después. No se sabe con certeza si un salto condicional se ejecutará o no hasta que se haya calculado la condición y el salto haya superado la etapa de ejecución en la tubería de instrucciones (véase la figura 1).

Sin la predicción de bifurcaciones, el procesador tendría que esperar a que la instrucción de salto condicional superara la etapa de ejecución antes de que la siguiente instrucción pudiera entrar en la etapa de búsqueda en la tubería. El predictor de bifurcaciones intenta evitar esta pérdida de tiempo adivinando si es más probable que se tome o no el salto condicional. La bifurcación que se predice como más probable se busca y se ejecuta de forma especulativa . Si posteriormente se detecta que la predicción fue errónea, las instrucciones ejecutadas de forma especulativa o parcialmente ejecutadas se descartan y la tubería comienza de nuevo con la bifurcación correcta, lo que genera una demora.

El tiempo que se pierde en caso de una predicción errónea de bifurcación es igual al número de etapas en la tubería desde la etapa de búsqueda hasta la etapa de ejecución. Los microprocesadores modernos suelen tener tuberías bastante largas, de modo que el retardo por predicción errónea oscila entre 10 y 20 ciclos de reloj . En consecuencia, alargar la tubería aumenta la necesidad de un predictor de bifurcación más avanzado. [ 6 ]

La primera vez que se encuentra una instrucción de salto condicional, no hay mucha información para hacer una predicción. Sin embargo, el predictor de bifurcaciones registra si las bifurcaciones se toman o no, por lo que cuando encuentra un salto condicional que ya se ha visto varias veces, puede basar la predicción en el historial registrado. El predictor de bifurcaciones puede, por ejemplo, reconocer que el salto condicional se toma con bastante frecuencia o que se toma cada dos veces.

La predicción de bifurcaciones no es lo mismo que la predicción del destino de las bifurcaciones . La predicción de bifurcaciones intenta adivinar si se realizará o no un salto condicional. La predicción del destino de las bifurcaciones intenta adivinar el destino de un salto condicional o incondicional realizado antes de que se calcule mediante la decodificación y ejecución de la instrucción. La predicción de bifurcaciones y la predicción del destino de las bifurcaciones suelen combinarse en el mismo circuito.

Implementación

Predicción de ramificación estática

La predicción estática es la técnica de predicción de bifurcaciones más simple porque no depende de información sobre el historial dinámico de ejecución del código. En cambio, predice el resultado de una bifurcación basándose únicamente en la instrucción de bifurcación. [ 7 ] Las primeras implementaciones de SPARC y MIPS (dos de las primeras arquitecturas RISC comerciales ) usaban predicción de bifurcaciones estáticas unidireccionales: siempre predecían que un salto condicional no se tomaría, por lo que siempre buscaban la siguiente instrucción secuencial. Solo cuando la bifurcación o el salto se evalúa y se encuentra que se toma, el puntero de instrucción se establece en una dirección no secuencial.

Ambas CPU obtienen las instrucciones en un ciclo y evalúan las bifurcaciones en la etapa de decodificación. Como resultado, la recurrencia del destino de la bifurcación dura dos ciclos, y la máquina siempre obtiene la instrucción inmediatamente después de cualquier bifurcación tomada. Ambas arquitecturas definen intervalos de retardo de bifurcación para utilizar estas instrucciones obtenidas.

Una forma más avanzada de predicción estática asume que las bifurcaciones hacia atrás se tomarán y las bifurcaciones hacia adelante no. (Una bifurcación hacia atrás es aquella cuya dirección de destino es menor que su propia dirección). Esta regla aumenta la precisión de la predicción en bucles, que pueden construirse con una bifurcación hacia atrás al final que se toma mayoritariamente, o una bifurcación hacia adelante al principio que no se toma mayoritariamente. Con los procesadores que utilizan este método de predicción, el orden de las instrucciones puede maximizar la precisión de la predicción de bifurcaciones. El conjunto de instrucciones RISC-V recomienda que el software escrito para núcleos RISC-V (hilos de hardware), o generado para ejecutarse en núcleos RISC-V, se optimice bajo el supuesto de que las bifurcaciones hacia atrás se toman y las bifurcaciones hacia adelante no. (Incluso cuando el procesador incorpora un predictor más avanzado que disminuye el valor relativo de la predicción estática). [ 8 ]

Algunos procesadores aceptan sugerencias de predicción de bifurcaciones que anulan la predicción estática. Los procesadores Intel Pentium 4 y Pentium 4E aceptan sugerencias de predicción de bifurcaciones como prefijos. En presencia de predicción dinámica, la predicción estática no ofrece prácticamente ningún beneficio, y anularla ayuda aún menos. Los procesadores posteriores Intel Pentium M y Core2 ignoran los prefijos de sugerencias de predicción de bifurcaciones. [ 9 ] Ningún fabricante de x86 ha reintroducido las sugerencias de predicción.

Los predictores de bifurcación dinámicos recurren naturalmente a la predicción de bifurcación estática cuando no tienen información en caché (como la primera vez que se encuentra una bifurcación determinada). Tanto el Motorola MPC7450 (G4e) como el Intel Pentium 4 recurren a la predicción estática. [ 10 ]

En la predicción estática, todas las decisiones se toman en tiempo de compilación, antes de la ejecución del programa. [ 11 ]

Predicción dinámica de ramificaciones

La predicción dinámica de bifurcaciones [ 2 ] utiliza información sobre las bifurcaciones tomadas o no tomadas recopilada en tiempo de ejecución para predecir el resultado de una bifurcación. [ 1 ]

predicción de ramificación aleatoria

La predicción aleatoria de bifurcaciones implica adivinar al azar si una bifurcación se tomará cada vez que se ejecuta. El costo de un generador de números pseudoaleatorios es bajo en comparación con otras técnicas. La predicción aleatoria garantiza una tasa de predicción correcta del 50%, que no se puede aumentar ni reducir de ninguna manera. (Y hace que la sincronización sea aún más no determinista o impredecible que otros métodos). La predicción estática de bifurcaciones (suponiendo que las bifurcaciones hacia adelante se toman y las bifurcaciones hacia atrás no) predice cada bifurcación con una precisión que va del 0% al 100%, con una tasa de éxito general en algún punto intermedio. Es muy probable que el código no optimizado se ejecute con una precisión de predicción superior al 50%; incluso es probable que alcance el 90%. Si el compilador realiza algún reordenamiento de instrucciones, la tasa de predicción correcta de bifurcaciones es mayor que para el código no optimizado. La predicción estática de bifurcaciones superó hace mucho tiempo a la predicción aleatoria de bifurcaciones. La predicción dinámica de bifurcaciones ha superado a la predicción estática de bifurcaciones y es común, a pesar de la complejidad adicional.

Predicción de la siguiente línea

Algunos procesadores superescalares (MIPS R8000 , Alpha 21264 y Alpha 21464 (EV8)) obtienen cada línea de instrucciones con un puntero a la siguiente línea. Este predictor de la siguiente línea gestiona tanto la predicción del destino de la bifurcación como la predicción de su dirección.

Cuando un predictor de la siguiente línea apunta a grupos alineados de 2, 4 u 8 instrucciones, el destino de la bifurcación generalmente no será la primera instrucción capturada, por lo que las instrucciones iniciales capturadas se desperdician. Suponiendo, para simplificar, una distribución uniforme de los destinos de bifurcación, se descartan 0,5, 1,5 y 3,5 instrucciones capturadas, respectivamente.

Dado que la bifurcación en sí no suele ser la última instrucción de un grupo alineado, las instrucciones posteriores a la bifurcación ejecutada (o su intervalo de retardo ) se descartan. Una vez más, suponiendo una distribución uniforme de las ubicaciones de las instrucciones de bifurcación, se descartan 0,5, 1,5 y 3,5 instrucciones obtenidas.

Las instrucciones descartadas en las líneas de bifurcación y destino suman casi un ciclo de recuperación completo, incluso para un predictor de la siguiente línea de un solo ciclo.

Predicción de ramificación de un nivel

Contador de saturación

Un contador de saturación de 1 bit (básicamente un flip-flop ) registra el último resultado de la bifurcación. Esta es la versión más simple posible de un predictor de bifurcación dinámico, aunque no es muy precisa.

Un contador saturado de 2 bits [ 1 ] es una máquina de estados con cuatro estados:

Figura 2: Diagrama de estados de un contador saturado de 2 bits.
  • No se recomienda en absoluto.
  • No se toma débilmente
  • Tomado débilmente
  • Fuertemente tomado

Cuando se evalúa una bifurcación, se actualiza la máquina de estados correspondiente. Las bifurcaciones que no se toman cambian su estado a "fuertemente no se toman", y las que sí se toman cambian su estado a "fuertemente se toman". La ventaja del esquema de contador de dos bits sobre el de un bit radica en que un salto condicional debe desviarse dos veces de su comportamiento habitual para que cambie la predicción. Por ejemplo, un salto condicional que cierra un bucle se predice erróneamente una vez, en lugar de dos.

El procesador Intel Pentium original, sin MMX, utiliza un contador de saturación, aunque con una implementación imperfecta. [ 9 ]

En los benchmarks SPEC '89, los predictores bimodales muy grandes se saturan al 93,5 % de precisión, una vez que cada rama se asigna a un contador único. [ 12 ] : 3

La tabla predictiva está indexada con los bits de dirección de la instrucción , de modo que el procesador puede obtener una predicción para cada instrucción antes de que esta sea decodificada.

Predictor de dos niveles

El predictor de bifurcaciones de dos niveles, también conocido como predictor de bifurcaciones basado en correlación, utiliza una tabla bidimensional de contadores, también llamada "tabla de historial de patrones". Las entradas de la tabla son contadores de dos bits.

Predictor adaptativo de dos niveles

Figura 3: Predictor de bifurcación adaptativo de dos niveles. Cada entrada en la tabla de historial de patrones representa un contador de saturación de 2 bits del tipo que se muestra en la figura 2. [ 13 ]

Si una ifinstrucción se ejecuta tres veces, la decisión tomada en la tercera ejecución podría depender de si las dos anteriores se ejecutaron o no. En tales casos, un predictor adaptativo de dos niveles funciona de manera más eficiente que un contador de saturación. Los saltos condicionales que se ejecutan cada dos veces o que presentan algún otro patrón recurrente no se predicen bien con el contador de saturación. Un predictor adaptativo de dos niveles recuerda el historial de las últimas n ocurrencias de la bifurcación y utiliza un contador de saturación para cada uno de los 2n posibles patrones de historial. Este método se ilustra en la figura 3.

Consideremos el ejemplo de n  = 2. Esto significa que las dos últimas ocurrencias de la rama se almacenan en un registro de desplazamiento de dos bits . Este registro de historial de rama puede tener cuatro valores binarios diferentes : 00, 01, 10 y 11, donde cero significa "no tomada" y uno significa "tomada". Una tabla de historial de patrones contiene cuatro entradas por rama, una para cada uno de los 2² =  4 historiales de rama posibles, y cada entrada en la tabla contiene un contador de saturación de dos bits del mismo tipo que en la figura 2 para cada rama. El registro de historial de rama se utiliza para elegir cuál de los cuatro contadores de saturación utilizar. Si el historial es 00, se utiliza el primer contador; si el historial es 11, se utiliza el último de los cuatro contadores.

Supongamos, por ejemplo, que se realiza un salto condicional cada tres veces. La secuencia de bifurcación es 001001001... En este caso, la entrada número 00 en la tabla de historial de patrones pasará al estado "fuertemente tomada", lo que indica que después de dos ceros viene un uno. La entrada número 01 pasará al estado "fuertemente no tomada", lo que indica que después de 01 viene un cero. Lo mismo ocurre con la entrada número 10, mientras que la entrada número 11 nunca se utiliza porque nunca hay dos unos consecutivos.

La regla general para un predictor adaptativo de dos niveles con un historial de n bits es que puede predecir cualquier secuencia repetitiva con cualquier período si todas las subsecuencias de n bits son diferentes. [ 9 ]

La ventaja del predictor adaptativo de dos niveles es que puede aprender rápidamente a predecir un patrón repetitivo arbitrario. Este método fue inventado por T.-Y. Yeh y Yale Patt en la Universidad de Michigan . [ 14 ] Desde su publicación inicial en 1991, este método se ha vuelto muy popular y se utiliza en procesadores Pentium posteriores, como el Pentium MMX. [ 15 ] Variantes de este método de predicción se utilizan en la mayoría de los microprocesadores modernos.

Predictor neuronal de dos niveles

Se ha propuesto un predictor de ramificación de dos niveles donde el segundo nivel se reemplaza con una red neuronal . [ 16 ]

Predicción de rama local

Un predictor de bifurcación local tiene un búfer de historial independiente para cada instrucción de salto condicional. Puede utilizar un predictor adaptativo de dos niveles. El búfer de historial es independiente para cada instrucción de salto condicional, mientras que la tabla de historial de patrones también puede ser independiente o compartida entre todos los saltos condicionales.

Los procesadores Intel Pentium MMX , Pentium II y Pentium III cuentan con predictores de bifurcación locales con un historial local de 4 bits y una tabla de historial de patrones local con 16 entradas para cada salto condicional.

En los benchmarks SPEC '89, los predictores locales muy grandes se saturan al 97,1 % de precisión. [ 12 ] : 6

Predicción de ramificaciones globales

Un predictor de bifurcaciones global no guarda un registro histórico independiente para cada salto condicional. En su lugar, mantiene un historial compartido de todos los saltos condicionales. La ventaja de un historial compartido es que cualquier correlación entre diferentes saltos condicionales forma parte de la elaboración de las predicciones. La desventaja es que el historial se diluye con información irrelevante si los diferentes saltos condicionales no están correlacionados, y que el búfer de historial puede no incluir ningún bit de la misma bifurcación si existen muchas otras bifurcaciones intermedias. Puede utilizar un predictor adaptativo de dos niveles.

Este esquema es mejor que el esquema de contador de saturación solo para tablas de gran tamaño, y rara vez es tan bueno como la predicción local. El búfer de historial debe ser más largo para realizar una buena predicción. El tamaño de la tabla de historial de patrones crece exponencialmente con el tamaño del búfer de historial. Por lo tanto, la tabla de historial de patrones grande debe compartirse entre todos los saltos condicionales.

Un predictor adaptativo de dos niveles con búfer de historial compartido globalmente y tabla de historial de patrones se denomina predictor "gshare" si aplica la operación XOR al historial global y al PC de ramificación, y "gselect" si los concatena . La predicción de ramificación global se utiliza en procesadores AMD y en procesadores Intel Pentium M , Core , Core 2 y Atom basados ​​en Silvermont .

Predicción de rama aleada

Un predictor de bifurcación aleado [ 17 ] combina los principios de predicción local y global mediante la concatenación de historiales de bifurcación locales y globales, posiblemente con algunos bits del contador de programa . Las pruebas indican que el procesador VIA Nano podría estar utilizando esta técnica. [ 9 ]

Predictor de acuerdo

Un predictor de concordancia es un predictor adaptativo de dos niveles con un búfer de historial y una tabla de historial de patrones compartidos globalmente, y un contador de saturación local adicional. Las salidas de los predictores local y global se combinan mediante la operación XOR para obtener la predicción final. El objetivo es reducir las contenciones en la tabla de historial de patrones cuando dos ramas con predicciones opuestas comparten la misma entrada. [ 18 ]

Predictor híbrido

Un predictor híbrido, también llamado predictor combinado, implementa más de un mecanismo de predicción. La predicción final se basa en un metapredictor que recuerda cuál de los predictores ha realizado las mejores predicciones en el pasado, o en una función de votación mayoritaria basada en un número impar de predictores diferentes.

Scott McFarling propuso la predicción de ramas combinadas en su artículo de 1993. [ 12 ]

En las pruebas de rendimiento SPEC'89, dicho predictor es prácticamente tan bueno como el predictor local.

Los predictores como gshare utilizan múltiples entradas de tabla para rastrear el comportamiento de cada rama. Esta multiplicación de entradas aumenta considerablemente la probabilidad de que dos ramas se asocien a la misma entrada de tabla (una situación denominada aliasing), lo que a su vez reduce significativamente la precisión de la predicción para dichas ramas. Una vez que se dispone de varios predictores, es conveniente que cada uno tenga patrones de aliasing diferentes, de modo que sea más probable que al menos uno de ellos no presente aliasing. Los predictores combinados con diferentes funciones de indexación se denominan predictores gskew y son análogos a las cachés asociativas sesgadas utilizadas para el almacenamiento en caché de datos e instrucciones.

Predictor de bucles

Un salto condicional que controla un bucle se predice mejor con un predictor de bucles especial. Un salto condicional en la parte inferior de un bucle que se repite N veces se ejecutará N-1 veces y luego no se ejecutará una vez. Si el salto condicional se coloca en la parte superior del bucle, no se ejecutará N-1 veces y luego se ejecutará una vez. Un salto condicional que va muchas veces en una dirección y luego una vez en la otra se detecta como un comportamiento de bucle. Dicho salto condicional se puede predecir fácilmente con un contador simple. Un predictor de bucles forma parte de un predictor híbrido donde un metapredictor detecta si el salto condicional tiene comportamiento de bucle.

Predictor de ramificación indirecta

Una instrucción de salto indirecto puede elegir entre más de dos ramas. Algunos procesadores tienen predictores de ramas indirectas especializados. [ 19 ] [ 20 ] Los procesadores más recientes de Intel [ 21 ] y AMD [ 22 ] pueden predecir ramas indirectas mediante un predictor adaptativo de dos niveles. Este tipo de instrucción aporta más de un bit al búfer de historial. Los procesadores zEC12 y posteriores de la arquitectura z/ de IBM admiten una instrucción BRANCH PREDICTION PRELOAD que puede precargar la entrada del predictor de ramas para una instrucción dada con una dirección de destino de rama construida sumando el contenido de un registro de propósito general a un valor de desplazamiento inmediato. [ 23 ] [ 24 ]

Los procesadores que no cuentan con este mecanismo simplemente predecirán un salto indirecto para ir al mismo destino que la última vez. [ 9 ]

Predicción de los retornos de la función

Una función normalmente regresa al lugar desde donde fue llamada. La instrucción de retorno es un salto indirecto que lee su dirección de destino de la pila de llamadas . Muchos microprocesadores tienen un mecanismo de predicción independiente para las instrucciones de retorno. Este mecanismo se basa en un búfer de pila de retorno , que es una copia local de la pila de llamadas. El tamaño del búfer de pila de retorno suele ser de 4 a 16 entradas. [ 9 ]

Anulación de la predicción de bifurcación

La disyuntiva entre una predicción de bifurcaciones rápida y una buena predicción se resuelve a veces mediante el uso de dos predictores de bifurcaciones. El primer predictor es rápido y sencillo. El segundo, más lento, complejo y con tablas más grandes, anulará cualquier predicción errónea realizada por el primero.

Los microprocesadores Alpha 21264 y Alpha EV8 utilizaban un predictor de siguiente línea rápido de un solo ciclo para gestionar la recurrencia del destino de la bifurcación y proporcionar una predicción de bifurcación sencilla y rápida. Debido a la imprecisión del predictor de siguiente línea y al tiempo que tarda la resolución de la bifurcación, ambos núcleos cuentan con predictores de bifurcación secundarios de dos ciclos que pueden anular la predicción del predictor de siguiente línea a costa de perder un ciclo de búsqueda.

El Intel Core i7 tiene dos búferes de destino de bifurcación y posiblemente dos o más predictores de bifurcación. [ 25 ]

predicción de ramificaciones neuronales

El aprendizaje automático para la predicción de bifurcaciones utilizando LVQ y perceptrones multicapa , denominado " predicción neuronal de bifurcaciones", fue propuesto por Lucian Vintan ( Universidad Lucian Blaga de Sibiu ). [ 26 ] Un año después desarrolló el predictor de bifurcaciones basado en perceptrones. [ 27 ] La investigación sobre el predictor neuronal de bifurcaciones fue desarrollada mucho más por Daniel Jiménez. [ 28 ] En 2001, [ 28 ] se presentó el primer predictor basado en perceptrones que era factible de implementar en hardware. La primera implementación comercial de un predictor de bifurcaciones basado en perceptrones se realizó en la microarquitectura Piledriver de AMD . [ 29 ]

La principal ventaja del predictor neuronal es su capacidad para explotar historiales extensos, requiriendo únicamente un crecimiento lineal de los recursos. Los predictores clásicos requieren un crecimiento exponencial de los recursos. Jiménez reporta una mejora global del 5,7 % con respecto a un predictor híbrido de estilo McFarling. [ 30 ] También utilizó un perceptrón gshare que anulaba los predictores híbridos. [ 30 ]

La principal desventaja del predictor perceptrón es su alta latencia. Incluso aprovechando técnicas aritméticas de alta velocidad, la latencia de cálculo es relativamente alta en comparación con el período de reloj de muchas microarquitecturas modernas. Para reducir la latencia de predicción, Jiménez propuso en 2003 el predictor neuronal de ruta rápida , donde el predictor perceptrón elige sus pesos según la ruta de la rama actual, en lugar de según el PC de la rama. Muchos otros investigadores desarrollaron este concepto (A. Seznec, M. Monchiero, D. Tarjan y K. Skadron, V. Desmet, Akkary et al., K. Aasaraai, Michael Black, etc.).

La mayoría de los predictores de bifurcaciones más avanzados utilizan un predictor perceptrón (véase la "Competencia de predicción de bifurcaciones del campeonato" de Intel [ 31 ] ). Intel ya implementa esta idea en uno de los simuladores del IA-64 (2003). [ 32 ]

El Infinity Fabric del procesador multinúcleo AMD Ryzen [ 33 ] [ 34 ] [ 35 ] y los procesadores Samsung Exynos incluyen predictores de ramificación neuronal basados ​​en perceptrones.

Historia

El IBM 7030 Stretch , diseñado a finales de la década de 1950, preejecuta todas las bifurcaciones incondicionales y cualquier bifurcación condicional que dependa de los registros de índice. Para otras bifurcaciones condicionales, los dos primeros modelos de producción implementaron la predicción de bifurcaciones no tomadas; los modelos posteriores se modificaron para implementar predicciones basadas en los valores actuales de los bits indicadores (correspondientes a los códigos de condición actuales). [ 36 ] Los diseñadores de Stretch habían considerado bits de sugerencia estáticos en las instrucciones de bifurcación al principio del proyecto, pero decidieron no utilizarlos. La recuperación de predicciones erróneas la proporcionaba la unidad de anticipación en Stretch, y parte de la reputación de Stretch por su rendimiento no tan brillante se atribuyó al tiempo requerido para la recuperación de predicciones erróneas. Los diseños posteriores de grandes computadoras de IBM no utilizaron la predicción de bifurcaciones con ejecución especulativa hasta el IBM 3090 en 1985.

Los predictores de dos bits fueron introducidos por Tom McWilliams y Curt Widdoes en 1977 para la supercomputadora S-1 del Laboratorio Nacional Lawrence Livermore e independientemente por Jim Smith en 1979 en los CDC. [ 37 ]

Los procesadores microprogramados, populares desde la década de 1960 hasta la de 1980 y posteriormente, requerían varios ciclos por instrucción y, por lo general, no necesitaban predicción de bifurcaciones. Sin embargo, además del IBM 3090, existen otros ejemplos de diseños microprogramados que sí incorporaron la predicción de bifurcaciones.

La Burroughs B4900 , una máquina COBOL microprogramada lanzada alrededor de 1982, utilizaba segmentación y predicción de bifurcaciones. El historial de predicción de bifurcaciones de la B4900 se almacena en las instrucciones en memoria durante la ejecución del programa. La B4900 implementa la predicción de bifurcaciones de cuatro estados mediante el uso de cuatro códigos de operación semánticamente equivalentes para representar cada tipo de operador de bifurcación. El código de operación utilizado indica el historial de esa instrucción de bifurcación en particular. Si el hardware determina que el estado de predicción de una bifurcación específica necesita actualizarse, reescribe el código de operación con el código de operación semánticamente equivalente que indicaba el historial correcto. Este esquema obtiene una tasa de acierto del 93 %. La patente estadounidense 4,435,756 y otras fueron otorgadas para este esquema.

El DEC VAX 9000 , anunciado en 1989, es microprogramado y segmentado, y realiza predicción de bifurcaciones. [ 38 ]

Los primeros procesadores RISC comerciales, los MIPS R2000 y R3000 , y los procesadores SPARC anteriores , solo realizan predicciones de bifurcaciones "no tomadas" triviales. Debido a que utilizan ranuras de retardo de bifurcación, obtienen solo una instrucción por ciclo y se ejecutan en orden, no hay pérdida de rendimiento. El R4000 posterior utiliza la misma predicción de bifurcaciones "no tomadas" trivial y pierde dos ciclos por cada bifurcación tomada, ya que la recurrencia de resolución de bifurcaciones dura cuatro ciclos.

La predicción de bifurcaciones cobró mayor importancia con la introducción de procesadores superescalares segmentados como el Intel Pentium , el DEC Alpha 21064 , el MIPS R8000 y la serie IBM POWER . Todos estos procesadores se basan en predictores bimodales simples o de un bit.

El DEC Alpha 21264 (EV6) utiliza un predictor de la siguiente línea sobrescrito por un predictor local combinado y un predictor global, donde la elección de la combinación la realiza un predictor bimodal. [ 39 ]

El AMD K8 cuenta con un predictor bimodal y global combinado, donde la opción de combinación es otro predictor bimodal. Este procesador almacena en caché los contadores del predictor bimodal base y de opción en bits de la caché L2 que normalmente se utilizan para ECC. Como resultado, dispone de tablas de predictores base y de opción muy grandes, y utiliza paridad en lugar de ECC en las instrucciones almacenadas en la caché L2. El diseño de paridad es suficiente, ya que cualquier instrucción que presente un error de paridad puede invalidarse y recuperarse de la memoria.

El Alpha 21464 [ 39 ] (EV8, cancelado en la fase final de diseño) tenía una penalización mínima por predicción errónea de bifurcación de 14 ciclos. Iba a utilizar un predictor de siguiente línea complejo pero rápido, sobrescrito por un predictor combinado bimodal y de votación mayoritaria. La votación mayoritaria se realizaba entre el predictor bimodal y dos predictores gskew.

En 2018, el Proyecto Zero de Google y otros investigadores hicieron pública una vulnerabilidad de seguridad catastrófica llamada Spectre . Esta vulnerabilidad, que afecta prácticamente a todas las CPU modernas , consiste en preparar los predictores de bifurcación para que otro proceso (o el kernel) prediga erróneamente una bifurcación y utilice datos secretos como índice de matriz, expulsando así una de las líneas de caché del atacante. El atacante puede cronometrar el acceso a su propia matriz para averiguar cuál es, convirtiendo este estado interno (microarquitectónico) de la CPU en un valor que el atacante puede guardar y que contiene información sobre valores que no podría leer directamente. [ 40 ]

Véase también

Referencias

  1. 1 2 3 Malishevsky, Alexey; Beck, Douglas; Schmid, Andreas; Landry, Eric. "Predicción dinámica de ramas" . Archivado del original el 17 de julio de 2019. Recuperado el 22 de marzo de 2017 .
  2. 1 2 Cheng, Chih-Cheng. "Los esquemas y el rendimiento de los predictores de ramificación dinámica" (PDF) .
  3. Parihar, Raj. "Técnicas y optimizaciones de predicción de ramificaciones" (PDF) . Archivado del original (PDF) el 16 de mayo de 2017. Consultado el 2 de abril de 2017 .
  4. Mutlu, Onur (11 de febrero de 2013). "18-447 Arquitectura de Computadoras, Lección 11: Predicción de Ramas" (PDF) . Archivado del original (PDF) el 25 de marzo de 2015.
  5. ^ Michaud, Pedro; Seznec, André; Uhlig, Richard (septiembre de 1996). Predictores de ramas sesgadas . HAL (informe). S2CID 3712157 . 
  6. Eyerman, S.; Smith, JE; Eeckhout, L. (2006). Caracterización de la penalización por predicción errónea de bifurcación . Simposio Internacional IEEE de 2006 sobre Análisis de Rendimiento de Sistemas y Software. IEEE. págs. 48–58 . doi : 10.1109/ispass.2006.1620789 . ISBN  1-4244-0186-0. S2CID 72217 . 
  7. Shen, John P.; Lipasti, Mikko (2005). Diseño de procesadores modernos: fundamentos de los procesadores superescalares . Boston: McGraw-Hill Higher Education . pp. 455. ISBN  0-07-057064-7.
  8. "Manual del conjunto de instrucciones RISC-V Volumen I Arquitectura sin privilegios" . Google Docs .
  9. 1 2 3 4 5 6 Fog, Agner (2016-12-01). "La microarquitectura de las CPU de Intel, AMD y VIA" (PDF) . págs. 26, 38. Recuperado el 22-03-2017 . 
  10. "El Pentium 4 y el G4e: una comparación arquitectónica" . Ars Technica . 12 de mayo de 2001.
  11. Plusquellic, Jim. "CMSC 611: Arquitectura avanzada de computadoras, Capítulo 4 (Parte V)" .
  12. 1 2 3 McFarling, Scott (junio de 1993). "Combinación de predictores de ramificación" (PDF) . Informe técnico del Laboratorio de Investigación Occidental Digital (WRL), TN-36.
  13. "Nuevo algoritmo mejora la predicción de bifurcaciones: 27/3/95" (PDF) . Microprocessor Report . 9 (4). 27 de marzo de 1995. Archivado (PDF) del original el 10/03/2015 . Consultado el 02/02/2016 .
  14. Yeh, T.-Y.; Patt, YN (1991). "Predicción de ramificación de entrenamiento adaptativo de dos niveles". Actas del 24.º simposio internacional anual sobre microarquitectura . Albuquerque, Nuevo México, Puerto Rico: ACM. pp. 51–61 . doi : 10.1145/123465.123475 . 
  15. Fog, Agner. "Predicción de ramificaciones en la familia Pentium" . Dr. Dobb's Journal . Archivado del original el 13 de mayo de 2008.
  16. Egan, Colin; Steven, Gordon; Quick, P.; Anguera, R.; Vintan, Lucian (diciembre de 2003). "Predicción de ramificaciones de dos niveles mediante redes neuronales" . Journal of Systems Architecture . 49 ( 12–15 ): 557–570 . doi : 10.1016/S1383-7621(03)00095-X .
  17. Skadron, K.; Martonosi, M.; Clark, DW (octubre de 2000). "Una taxonomía de predicciones erróneas de ramificación y predicción combinada como solución robusta a las predicciones erróneas de historial incorrecto" (PDF) . Actas de la Conferencia Internacional de 2000 sobre Arquitecturas Paralelas y Técnicas de Compilación . Filadelfia. págs. 199–206 . doi : 10.1109/PACT.2000.888344 . 
  18. Sprangle, E.; Chappell, RS; Alsup, M.; Patt, YN (junio de 1997). "El predictor Agree: un mecanismo para reducir la interferencia negativa del historial de ramificación" (PDF) . Actas del 24.º Simposio Internacional sobre Arquitectura de Computadoras . Denver. doi : 10.1145/264107.264210 .
  19. "Manual de referencia técnica de Cortex-A15 MPCore, sección 6.5.3 "Predictor indirecto"" . ARM Holdings .
  20. Driesen, Karel; Hölzle, Urs (25 de junio de 1997). "Límites de la predicción de ramificaciones indirectas" (PDF) . Archivado del original (PDF) el 6 de mayo de 2016.
  21. Stokes, Jon (25 de febrero de 2004). "Una mirada al núcleo de Centrino: el Pentium M" . págs. 2-3 . 
  22. Kanter, Aaron (28-10-2008). "Análisis de rendimiento para Core 2 y K8: Parte 1" . pág. 5. 
  23. Principios de funcionamiento de z/Architecture (PDF) (Decimocuarta edición). IBM . Mayo de 2022. págs. 7-42 – 7-45 . SA22-7832-13.  
  24. "Guía técnica de IBM zEnterprise BC12" (PDF) . IBM . Febrero de 2014. pág. 78. 
  25. WO 2000/014628 , Yeh, Tse-Yu y Sharangpani, HP, "Un método y aparato para la predicción de ramificaciones utilizando una tabla de predicción de ramificaciones de segundo nivel", publicado el 16 de marzo de 2000 
  26. Vintan, Lucian N. (1999). "Hacia un predictor de ramificación neuronal de alto rendimiento" (PDF) . Actas de la Conferencia Internacional de la Revista sobre Redes Neuronales (IJCNN) . doi : 10.1109/IJCNN.1999.831066 . Archivado del original (PDF) el 13 de julio de 2019. Consultado el 2 de diciembre de 2010 .
  27. Vintan, Lucian N. (2000). "Hacia un predictor dinámico de ramificaciones potente" (PDF) . Revista Rumana de Ciencia y Tecnología de la Información . 3 (3). Bucarest: Academia Rumana: 287–301 . ISSN 1453-8245 . 
  28. 1 2 Jiménez, DA; Lin, C. (2001). "Predicción dinámica de bifurcaciones con perceptrones" (PDF) . Actas del 7º Simposio Internacional sobre Arquitectura de Computadoras de Alto Rendimiento (HPCA-7) . Monterrey, NL, México. pp. 197–296 . doi : 10.1109/HPCA.2001.903263 . 
  29. Walton, Jarred (15 de mayo de 2012). "Análisis de AMD Trinity (A10-4600M): Una nueva esperanza" . AnandTech . Archivado del original el 17 de mayo de 2012.
  30. 1 2 Jiménez, Daniel A. (diciembre de 2003). Predicción rápida de ramificaciones neuronales basada en rutas (PDF) . 36.º Simposio Internacional Anual IEEE/ACM sobre Microarquitectura (MICRO-36). San Diego, EE. UU. pp. 243–252 . doi : 10.1109/MICRO.2003.1253199 . Archivado del original (PDF) el 31 de marzo de 2016. Recuperado el 8 de abril de 2018 . 
  31. "Predicción de la rama del campeonato" .
  32. Brekelbaum, Edward; Rupley, Jeff; Wilkerson, Chris; Black, Bryan (diciembre de 2002). "Ventanas de programación jerárquica". Actas del 35.º Simposio Internacional sobre Microarquitectura . Estambul, Turquía. doi : 10.1109/MICRO.2002.1176236 .
  33. James, Dave (06-12-2017). "Análisis, noticias, rendimiento, precios y disponibilidad de AMD Ryzen" . PCGamesN .
  34. "AMD lleva la informática a un nuevo horizonte con los procesadores Ryzen™" (Comunicado de prensa). AMD . Consultado el 14 de diciembre de 2016 .
  35. "La CPU Zen de AMD ahora se llama Ryzen y podría realmente desafiar a Intel" . Ars Technica UK . Consultado el 14 de diciembre de 2016 .
  36. "IBM Stretch (7030) -- Paralelismo agresivo de uniprocesador" .
  37. "Supercomputadora S-1" .
  38. Murray, JE; Salett, RM; Hetherington, RC; McKeen, FX (1990). "Microarquitectura del VAX 9000". Resumen de ponencias de Compcon Spring '90. Trigésimo quinta Conferencia Internacional de la IEEE Computer Society sobre Apalancamiento Intelectual . págs. 44–53 . doi : 10.1109/CMPCON.1990.63652 . ISBN  0-8186-2028-5. S2CID 24999559 . 
  39. 1 2 Seznec, A.; Felix, S.; Krishnan, V.; Sazeides, Y. "Compromisos de diseño para el predictor de bifurcación condicional Alpha EV8" . Actas del 29.º Simposio Internacional Anual sobre Arquitectura de Computadoras . doi : 10.1109/ISCA.2002.1003587 .
  40. Gibbs, Samuel (4 de enero de 2018). "Meltdown y Spectre: los peores errores de CPU de la historia afectan prácticamente a todos los ordenadores" . The Guardian . Consultado el 18 de mayo de 2018 .
  • Seznec et al. (1996). " Predictores de bifurcación de múltiples bloques por adelantado " demuestra que la precisión de la predicción no se ve afectada por la indexación con la dirección de bifurcación anterior. 
  • Seznec et al. (2002). " Compromisos de diseño para el predictor de bifurcaciones condicionales Alpha EV8 " describe el predictor de bifurcaciones Alpha EV8. Este artículo explica de forma excelente cómo llegaron a su diseño a partir de diversas limitaciones de hardware y estudios de simulación. 
  • Jiménez (2003). " Reconsiderando predictores de bifurcación complejos " describe los predictores de bifurcación EV6 y K8, y consideraciones sobre la segmentación. 
  • Fog, Agner (2009). "La microarquitectura de las CPU de Intel, AMD y VIA" . Recuperado el 1 de octubre de 2009 .
  • Andrews, Jeff (30 de octubre de 2007). "Reorganización de ramificaciones y bucles para prevenir predicciones erróneas" . Intel Software Network . Archivado del original el 11 de noviembre de 2018. Recuperado el 10 de noviembre de 2018 .
  • Yee, Alexander (27 de junio de 2012). "¿Qué es la predicción de ramificación? (primera respuesta, Respuesta 35214) ¿Por qué procesar una matriz ordenada es más rápido que procesar una matriz no ordenada?" . Stack Overflow: Java .