In che modo differisce la previsione del target del ramo dalla previsione di branca?

2

Non capisco in che modo BTP differisce da BP? Sì, comprendo che BP valuta se un condizionale è vero / falso, ma sicuramente implicitamente questo determina anche l'istruzione "bersaglio"?

Se prevedo che il primo ramo di un IF sia vero, allora sicuramente ho appena determinato anche il target del ramo (il codice all'interno del ramo IF previsto) ??

    
posta user997112 14.02.2014 - 20:45
fonte

3 risposte

2

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".

    
risposta data 06.05.2014 - 20:45
fonte
2

Salti / chiamate indiretti (tramite un puntatore a funzione o uno switch che utilizza una tabella di salto) non hanno la diramazione disponibile quando un'istruzione viene decodificata. Anche senza una cache miss o qualcosa, jmp rax deve recuperare il valore di rax dal file di registro (o dalla rete di inoltro). Il Branch Target Buffer predice l'indirizzo di destinazione in anticipo, quindi il recupero del codice può iniziare al più presto. Un BTB sofisticato può riconoscere i modelli, come un salto indiretto che si alterna tra due bersagli. Le buone prestazioni del BTB sono fondamentali per i salti indiretti. (Combinato con la solita necessità di una buona previsione del ramo normale (presa rispetto a quella non presa) per i rami indiretti condizionali ).

Un BTB può anche prevedere dove sta andando un salto prima che l'istruzione jmp sia decodificata. Questo è importante su un'architettura come x86, in cui la codifica delle istruzioni a lunghezza variabile rende impossibile la scansione del flusso di istruzioni per i rami futuri prima di quello che viene attualmente decodificato. Ci sono più fasi della pipeline di recupero / pre-decodifica prima del punto in cui una jmp è completamente decodificata.

Vedi questa domanda SO per un esempio del BTB che accelera le normali istruzioni incondizionate dirette jmp su un Intel Broadwell. Un loop con meno del 4096% dijmp s gira a 1 jmp per ~ 3 cicli, mentre un loop di grandi dimensioni (con molti più jmp s che il BTB può contenere) gira più lentamente, come 1 jmp per ~ 12 cicli.

    
risposta data 08.08.2016 - 22:43
fonte
2

In parole semplici:

Predizione ramo prevede la risposta a "Will I branch?"

Predizione target filiale prevede la risposta a "Dove andrò?"

Entrambi sono considerati allo stesso tempo. Una CPU ottimale sarà in grado non solo di prevedere se un ramo succederà, ma anche dove si diramerà. Ciò gli consentirebbe di iniziare a spingere le istruzioni attraverso la pipeline che prevede saranno in arrivo.

    
risposta data 08.08.2016 - 23:19
fonte

Leggi altre domande sui tag