# Predictor de salts

Un predictor de salts és un mecanisme maquinari utilitzat en els processadors que utilitzen segmentació de la unitat de procés per reduir cicles de parada en el pipeline.
Els salts condicionals introdueixen retard en aquests processadors, ja que normalment no s'avalua la condició del salt fins passades diverses etapes, el que fa que s'hagi de parar el llit, o que es puguin introduir instruccions en el pipeline que no han de ser executades, havent de convertir-se posteriorment en nops, i decrementat així el rendiment.
La predicció és possible anotant el comportament del programa en salts anteriors.

## Predictor dinàmic

Un predictor dinàmic treballa en temps d'execució, intentant aprendre el comportament del programa per predir amb la mínima taxa d'error si un salt serà o no pres. Hi ha diversos tipus depenent de la informació que són capaços de recollir sobre el programa per fer prediccions.

### Taula d'història de salts

Conegut com a BHT ( Branch History Table ), són petites memòries indexades per la direcció del PC de la instrucció de salt.
Per emmagatzemar totes les possibles instruccions del PC, es necessitarien $2^{30}$ o $2^{62}$ (en processadors de 64 bits) posicions (suposant que les direccions del PC fossin múltiples de 4, els 2 bits de menys pes són sempre 00), per la qual cosa aquestes memòries es farien increïblement grans, i lentes, a més que es malgastaria la major part de les entrades. En comptes d'això, només s'utilitza una part de la direcció del PC, però es produeix l'efecte aliasing (més d'una direcció pot referir-se a la mateixa posició de la taula).
Així, les taules de predicció guarden uns valors que s'utilitzen per predir el comportament del següent salt. El seu funcionament consisteix a incrementar o decrementar-sempre amb saturació-el comptador quan un salt ha estat pres o no respectivament.

#### Predictor d'1 bit

Guarda un bit d'història que diu si el salt va ser pres o no l'última vegada. Atès que en un bit només emmagatzema l'estat del salt anterior, la seva actualització és molt violenta, canviant la predicció d'un salt només per un comportament puntual.

#### Predictor de 2 bits

Utilitza un comptador de 2 bits per a cada salt, de manera que pot comptar fins a 4 valors (0, 1, 2 i 3), si el salt anteriorment va ser pres, incrementa el comptador, en cas contrari el decrementa, i predirà que el salt és pres si es troba en els valors 2 o 3 (bit més significatiu a 1), i predecirá no pres en cas que sigui 0 o 1 (bit més significatiu a 0). Amb el que aconsegueix major nombre d'encerts que l'anterior, a més d'un reajustament més real del comportament del salt, no variant la predicció per un salt puntual.

#### Predictor de 3 bits

Igual que l'anterior, només que ara pot comptar fins a 8 valors. Tot i així, tenir més de 2 bits de predicció no implica tenir major taxa d'encerts, ja que en aquest cas el temps d'adaptació de la predicció a un nou comportament del salt és més alt.

### Predictors amb correlació

Usen informació d'altres salts recents, a més de la història del salt a predir en si.
Hauríem ara diverses taules funcionant com predictors d'història independents entre si. Amb bits addicionals, es porta el compte, de forma similar a l'anterior, de si els últims salts que van ocórrer en el programa van ser presos o no, i depenent d'aquests, es triarà una de les taules d'història per fer la predicció, que s'indexen amb el valor del PC i van actualitzant els seus valors com es feia anteriorment.
La notació per referir-se al nombre de bits d'aquest predictor és (x, y), i 'x' el nombre de bits de correlació (els utilitzats per triar cada taula), i 'i' el nombre de bits d'història que tindrà cada una de les taules (predictor d'1 bit, predictor de 2 bits, etc.). Així, un predictor (2,2), tindria 2 bits per a referir-se a cadascuna de les 4 taules, les quals tindrien cadascuna 2 bits d'història. Un predictor (8,1) tindria 256 taules d'1 bit d'història.
Per tant, un predictor de 2 bits normal, podria considerar com un predictor de correlació (0,2).

### Predictor híbrid

Els predictors híbrids combinen les dues estratègies de predicció anteriors. Té un predictor de cada tipus, que es van actualitzant de manera independent, es van comptant els encerts i les errades que té cada un, i se'n va llavors triant qual utilitzar en cada moment.
La idea és donar-li més pes al predictor que més encerti.

### Buffer de destinació de salts

Conegut com a BTB ( Branch Target Buffer ), és una memòria cau que emmagatzema l'adreça de la següent instrucció que segueix a un salt.
S'accedeix a l'etapa de descodificació de la instrucció (ID) fent servir l'adreça del PC actual, si es troba una entrada s'obté del BTB qual és la següent instrucció a executar, que pot ser la següent en l'ordre seqüencial, o la del destinació del salt, l'elecció dependrà del valor dels bits de predicció assignats a aquesta entrada. Si no es troba la direcció, la instrucció no és un salt, o ho és i encara no ha estat executat cap vegada (la primera vegada sempre falla la predicció, perquè no n'hi ha).
En cas que la predicció hagi fallat, es modificarà l'entrada corresponent del BTB per a predir futurs salts correctament.

## Enllaços externs

* Seznec et al. (1996). "Multiple-Block Ahead Branch Predictors" — demonstrates prediction accuracy is not impaired by indexing with previous branch address.
* Seznec et al. (2002). "Design Tradeoffs for the Alpha EV8 Conditional Branch Predictor" — describes the Alpha EV8 branch predictor. This paper does an excellent job discussing how they arrived at their design from various hardware constraints and simulation studies.
* Jimenez (2003). "Reconsidering Complex Branch Predictors" — describes the EV6 and K8 branch predictors, and pipelining considerations.
* Fog, Agner. «The microarchitecture of Intel, AMD and VIA CPUs», 2009. [Consulta: 1r octubre 2009].
* Andrews, Jeff. «Branch and Loop Reorganization to Prevent Mispredicts». Intel Software Network, 30-10-2007. Arxivat de l'original el 2008-04-17. [Consulta: 20 agost 2008].