¿Por qué necesitamos la predicción de ramas?
- La ganancia producida por Pipelining puede reducirse por la presencia de instrucciones de transferencia de programa, por ejemplo, JMP, CALL, RET, etc.
- Cambian la secuencia causando que todas las instrucciones que ingresaron a la canalización después de las instrucciones de transferencia del programa no sean válidas
- Por lo tanto, no se realiza ningún trabajo a medida que se recargan las etapas de la tubería.
Lógica de predicción de bifurcaciones:
para evitar este problema, Pentium utiliza un esquema denominado predicción dinámica de bifurcaciones. En este esquema, se realiza una predicción para la instrucción de bifurcación actualmente en proceso. La predicción se tomará o no se tomará. Si la predicción es verdadera, la canalización no se vaciará y no se perderán ciclos de reloj. Si la predicción es falsa, la tubería se vacía y comienza de nuevo con la instrucción actual.
Se implementa utilizando un conjunto de caché asociado de 4 vías con 256 entradas. Esto se llama Búfer de destino de rama (BTB) . La entrada de directorio para cada línea consta de:
- Bit válido: Indica si la entrada es válida o no.
- Bit de historial: realiza un seguimiento de la frecuencia con la que se ha tomado un bit.
La dirección de la memoria de origen es desde donde se obtuvo la instrucción de bifurcación. Si la entrada del directorio es válida, la dirección de destino de la sucursal se almacena en la entrada de datos correspondiente en BTB.
Trabajo de predicción de rama:
- BTB es un caché de búsqueda que se encuentra al lado de la etapa de instrucción de decodificación (DI) de 2 tuberías y monitores para instrucciones de bifurcación.
- La primera vez que una instrucción de bifurcación ingresa a la canalización, el BTB usa su memoria de origen para realizar una búsqueda en el caché.
- Dado que la instrucción nunca se vio antes, es BTB miss. Predice que la bifurcación no se tomará aunque sea una instrucción de salto incondicional.
- Cuando la instrucción llega a la UE (unidad de ejecución), la sucursal se tomará o no se tomará. Si se toma, la siguiente instrucción que se ejecutará se obtendrá de la dirección de destino de la bifurcación. Si no se toma, habrá una búsqueda secuencial de instrucciones.
- Cuando se toma una bifurcación por primera vez, la unidad de ejecución proporciona retroalimentación a la predicción de la bifurcación. La dirección de destino de la sucursal se devuelve, que se registra en BTB.
- Se crea una entrada de directorio que contiene la dirección de memoria de origen y el bit de historial se establece como fuertemente tomado.
El diagrama se explica en la siguiente tabla:
Bits de historia | Descripción resultante | Predicción hecha | Si se toma rama | Si no se toma la sucursal |
---|---|---|---|---|
11 | fuertemente tomado | Rama tomada | Permanece en el mismo estado | Degradado a tomado débilmente |
10 | tomado débilmente | Rama tomada | Actualizado a fuertemente tomado | Degradado a débilmente no tomado |
01 | Débilmente no tomado | Sucursal no tomada | Actualizado a tomado débilmente | Degradado a fuertemente no tomado |
00 | Fuertemente no tomado | Sucursal no tomada | Actualizado a débilmente no tomado | Permanece en el mismo estado |