Considera il seguente ciclo in assembly:
loop: ADDI R1, R1, #-1 ;subtract 1 from the value stored in R1
BNEZ R1, loop ; if the value of R1 is not 0, go to the code at label "loop"
SUBI R2, R2, #2 ; completely unrelated to the loop
Questo codice sottrarà continuamente 1 dal valore memorizzato in R1, finché il valore in R1 è 0. Abbastanza semplice, se non pratico. Il codice C equivalente potrebbe leggere
while(a != 0)
a--;
Secondo Wikipedia :
In computer architecture, a branch predictor is a digital circuit that tries to guess which way a branch (e.g. an if-then-else structure) will go before this is known for sure.
In questo esempio, il predittore di branche tenterà di indovinare se il valore di R1 è, in effetti, 0, con vari metodi trattati nell'articolo di Wikipedia. Tutto ciò che il predittore di branchi fa è determinare "Sì, questo ramo sarà preso", o "No, questo ramo non sarà preso".
D'altra parte, un Branch Target Predictor prenderà i risultati del Predictor del ramo e darà l'indirizzo che il programma salterà a.
Utilizzando l'esempio precedente, se il predittore di ramo dice che l'istruzione BNEZ
prenderà il ramo, il predittore target del ramo fornirà l'indirizzo del prossima istruzione da eseguire dopo l'istruzione ADDI
. Questa potrebbe essere l'istruzione ADDI
, all'etichetta loop
, oppure potrebbe essere l'istruzione SUBI
dopo l'istruzione branch.
Il Branch Predictor predice il risultato di un confronto. Il Branch Target Predictor indica dove va il programma a causa di un ramo.
I rami (e anche i salti) sono relativi al contatore del programma (PC). Il Branch Target Predictor aggiungerà l'offset (dato dall'istruzione branch) e lo aggiungerà al contatore del programma corrente. Questo fornisce l'indirizzo dell'istruzione da eseguire dopo il ramo.
I predittori di ramo danno una risposta sì / no alla domanda "Sto andando al ramo". The Branch Target Predictor ha bisogno di quella risposta Sì / No per determinare la risposta a "DOVE vado dopo il ramo".