07.06.2013 Views

LEZIONE #05 del 12-Mag-2008 (2 ore) - Dipartimento di Ingegneria ...

LEZIONE #05 del 12-Mag-2008 (2 ore) - Dipartimento di Ingegneria ...

LEZIONE #05 del 12-Mag-2008 (2 ore) - Dipartimento di Ingegneria ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Branch Pre<strong>di</strong>ction<br />

(parte seconda)<br />

Calcolatori Elettronici 2<br />

http://www.<strong>di</strong>i.unisi.it/~giorgi/<strong>di</strong>dattica/calel2<br />

Branch Mispre<strong>di</strong>ction Recovery (1)<br />

• La pre<strong>di</strong>zione <strong>di</strong>namica dei salti consiste <strong>di</strong> due parti<br />

- Parte iniziale che effettua la speculazione negli sta<strong>di</strong> iniziali <strong>del</strong>la pipeline<br />

- Parte finale che effettua la validazione negli ultimi sta<strong>di</strong> <strong>del</strong>la pipeline<br />

• Speculazione sui branch<br />

• Mentre si prelevano istruzioni dal ramo predetto, si puo’ incontrare un<br />

altro branch<br />

- Es. Il pre<strong>di</strong>tt<strong>ore</strong> ci consiglia “Taken” per il branch b1<br />

- Il process<strong>ore</strong> preleva b2 prima che b1 sia risolto<br />

• Soluzioni<br />

- Attendere che b1 sia risolta prima <strong>di</strong> pre<strong>di</strong>rre b2 ? spreco <strong>di</strong> risorse…<br />

- Pre<strong>di</strong>rre b2 anche se b1 non e’ risolto? si complica la gestione <strong>del</strong><br />

“recovery” nel caso <strong>di</strong> mispre<strong>di</strong>ction<br />

NT<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 2<br />

T<br />

NT T NT<br />

NT<br />

T<br />

b1<br />

T<br />

NT<br />

b2<br />

T<br />

NT T NT<br />

b3<br />

T


Branch Mispre<strong>di</strong>ction Recovery (2)<br />

• Come si recupera (recovery) in questo caso<br />

• Vorremmo recuperare da una situazione <strong>di</strong> mispre<strong>di</strong>ction multipli<br />

• Situazione piu’ complessa: primo branch mispre<strong>di</strong>cted, secondo giusto<br />

• Esempio: stiamo speculando su 3 branch, b1, b2, b3<br />

- Le pre<strong>di</strong>zioni sono evidenziate con la linee tratteggiata<br />

- Le istruzioni <strong>di</strong> ogni ramo predetto sono residenti nel process<strong>ore</strong><br />

• Idea: a ogni istruzione su un dato ramo speculativo si assegna in TAG<br />

- Ogni ramo speculativo ha il proprio tag (Tag1, Tag2, Tag3)<br />

NT<br />

NT T NT<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 3<br />

T<br />

NT<br />

T<br />

T<br />

(Tag 2)<br />

(Tag 1)<br />

NT<br />

T<br />

NT T NT<br />

(Tag 3)<br />

Branch Mispre<strong>di</strong>ction Recovery (3)<br />

• Validazione dei branch<br />

• Quando il branch e’ risolto (<strong>di</strong>rezione e target sono noti)<br />

- CASO DI PREDIZIONE CORRETTA<br />

-Il tag viene rimosso e le istruzioni su quel ramo <strong>di</strong>vengono non-speculative<br />

- CASO DI PREDIZIONE ERRATA (MISPREDICTION)<br />

-Il ramo errato viene bloccato ed eliminato dalla pipeline<br />

-Devono essere rimossi anche tutti i rami speculativi successivi<br />

-Il ramo corretto viene eseguito dall’inizio inserendolo in pipeline<br />

• Esempio<br />

- Il secondo branch non e’ stato azzeccato<br />

- Tutte le istruzioni con Tag2 e Tag3 devono essere rimosse<br />

NT<br />

NT T NT<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 4<br />

T<br />

NT<br />

T<br />

T<br />

(Tag 2)<br />

NT<br />

T<br />

NT T NT<br />

(Tag 3)<br />

T<br />

T<br />

Ricominciare<br />

da qui!


Esempio - PowerPC 604 (1)<br />

• Microprocess<strong>ore</strong> Superscalare a 4 vie<br />

• Puo’ effettuare fetch, decode, execute <strong>di</strong> 4 istruzioni per ciclo<br />

• Branch Pre<strong>di</strong>ction<br />

• Usa due buffer separati:<br />

- Branch Target Address Cache (BTAC)<br />

- Branch History Table (BHT)<br />

• Vengono in<strong>di</strong>rizzati entrambi nello sta<strong>di</strong>o <strong>di</strong> fetch<br />

• BTAC (analogo al BTB)<br />

• Cache fully-associative a 64 elementi, risponde in 1 ciclo<br />

• Memorizza l’in<strong>di</strong>rizzo target <strong>del</strong> salto<br />

• BHT<br />

• Cache ad accesso <strong>di</strong>retto a 5<strong>12</strong> elementi, risponde in 2 cicli<br />

• Memorizza i bit <strong>di</strong> storia dei branch<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 5<br />

Esempio - PowerPC 604 (2)<br />

+4<br />

BHT pre<strong>di</strong>ction<br />

BTAC pre<strong>di</strong>ction<br />

Branch<br />

Pre<strong>di</strong>ction<br />

PC Branch History<br />

PC<br />

Table (BHT)<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 6<br />

PC<br />

Branch Target<br />

Address Cache<br />

(BTAC)<br />

PC<br />

BHT<br />

BTAC<br />

update update<br />

execute<br />

commit<br />

I-cache<br />

decode<br />

decode buffer<br />

<strong>di</strong>spatch buffer<br />

<strong>di</strong>spatch<br />

Reservation stations<br />

BRN SFX SFX CFX FPL LS<br />

branch<br />

Re-order buffer


Esempio - PowerPC 604 (3)<br />

• Hit nel BTAC<br />

• In<strong>di</strong>ca la presenza <strong>di</strong> un branch nella coda <strong>di</strong> fetch<br />

• L’in<strong>di</strong>rizzo target prelevato dal BTAC viene usato al ciclo successivo<br />

• Al secondo ciclo viene consultato il BHT<br />

• La pre<strong>di</strong>zione deve essere “taken”, se avevo fatto hit in BTAC al ciclo prima<br />

• Se le due pre<strong>di</strong>zioni NON sono in accordo?<br />

• Si butta la pre<strong>di</strong>zione <strong>del</strong> BTAC (significa che BHT ha predetto “not-taken”)<br />

• Il fetch continua dal ramo in cascata<br />

• La pre<strong>di</strong>zione <strong>del</strong> BHT prevale su quella <strong>del</strong> BTAC<br />

• Dopo aver risolto il branch si devono aggiornare sia BTAC che BHT<br />

• Perche’ servono entrambi ?<br />

• Il BTAC e’ piu’ veloce: se la pre<strong>di</strong>zione e’ giusta non attendo alcun ciclo<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 7<br />

Esempio - PowerPC 604 (4)<br />

• Il PowerPC 604 e’ superscalare<br />

• Nelle reservation-station ci possono essere fino a 4 istruzioni <strong>di</strong> salto<br />

• E’ necessario usare dei tag a 2 bit per gestire la speculazione<br />

• Segue lo schema introdotto poco sopra<br />

• In particolare le risorse occupate dalle istruzioni speculative<br />

debbono essere liberate in caso <strong>di</strong> mispre<strong>di</strong>ction<br />

(es. Reorder Buffer, una struttura tipica dei processori superscalari)<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 8


Pre<strong>di</strong>ttori a correlazione: gselect e gshare<br />

• Per generare l’in<strong>di</strong>ce <strong>del</strong>la PHT, Pan e (successivamente) McFarling<br />

suggeriscono <strong>di</strong> usare sia l’in<strong>di</strong>rizzo <strong>del</strong> branch (BIA) che la stringa<br />

<strong>di</strong> storia globale (BHSR)<br />

• La semplificazione e’ <strong>di</strong> NON usare una BHT con piu’ elementi<br />

• gselect [Pan92]<br />

• Alcuni bit <strong>del</strong> BIA sono accostati ai bit <strong>del</strong>la global history<br />

• gshare [McFarling93]<br />

• I bit <strong>del</strong> BIA sono “mescolati” (hashed) con quelli <strong>del</strong>la global history<br />

• La funzione <strong>di</strong> “mescolamento” <strong>di</strong> solito e’ l’operazione <strong>di</strong> XOR<br />

Branch<br />

address<br />

(BIA)<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 9<br />

Global<br />

history<br />

(BHSR)<br />

gselect 4/4 gshare 8/8<br />

0000 0000 0000 0001 0000 0001 00000001<br />

00000000 00000000 00000000 00000000<br />

11111111 00000000 11110000 11111111<br />

11111111 10000000 11110000 01111111<br />

gselect [Pan92]<br />

• m bit dall’in<strong>di</strong>rizzo (BIA) sono accostati ai k bit <strong>del</strong> BHSR<br />

• Schema molto semplice: 1 BHSR e 1 piccolo PHT<br />

BHSR<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 10<br />

k<br />

BIA<br />

m<br />

k+m<br />

PHT<br />

…<br />

2 k+m x j<br />

entries<br />

pre<strong>di</strong>ction


gshare [McFarling93]<br />

• m bit <strong>del</strong>l’in<strong>di</strong>rizzo BIA sono messi in XOR con il BHSR<br />

• Schema molto semplice: 1 BHSR e 1 piccolo PHT<br />

• Usato nell’Alpha 2<strong>12</strong>64<br />

BHSR<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 11<br />

BIA<br />

Di solito sono i bit meno significativi <strong>del</strong> BIA<br />

Inoltre, <strong>di</strong> solito k == m<br />

k<br />

m<br />

max{k, m}<br />

PHT<br />

…<br />

2 max{k, m} x j<br />

entries<br />

Prestazioni <strong>di</strong> gshare, gselect, GAg<br />

Pre<strong>di</strong>ctor Accuracy (%)<br />

98<br />

96<br />

94<br />

92<br />

90<br />

88<br />

86<br />

84<br />

Grafico da [McFarling93]<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide <strong>12</strong><br />

pre<strong>di</strong>ction<br />

32 64 256 1K 4K 16K 64K<br />

Pre<strong>di</strong>ctor Size(bytes)<br />

“global” si riferisce al pre<strong>di</strong>tt<strong>ore</strong> GAg <strong>di</strong> Yeh e Patt<br />

I benchmark usati sono gli stessi 9 <strong>di</strong> SPEC-89 usati nei lavori [Yeh92] e [Yeh93]<br />

gshare<br />

gselect<br />

global


Pre<strong>di</strong>ttori “competitivi” (“Tournament”)<br />

• Certi pre<strong>di</strong>ttori funzionano bene con determinati branch<br />

• La prima proposta <strong>di</strong> usare due pre<strong>di</strong>ttori competitivi e’ presentata<br />

da McFarling [McFarling93] (bimodal+gshare)<br />

• Selezionare <strong>di</strong>namicamente una pre<strong>di</strong>zione fra piu’ pre<strong>di</strong>ttori<br />

• Usare la storia per selezionare un pre<strong>di</strong>tt<strong>ore</strong><br />

BHT<br />

BIA<br />

• Esempio: Alpha 2<strong>12</strong>64<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 13<br />

Path History<br />

Pre<strong>di</strong>ctor 1<br />

Pre<strong>di</strong>ctor 2<br />

M<br />

U pre<strong>di</strong>ction<br />

U<br />

X<br />

Pre<strong>di</strong>ctor<br />

selection<br />

logic<br />

• Dimensione totale <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong> pari a 29k bits<br />

• A BP = 97.4%(SPEC89 average)<br />

99.9% (SPECfp95 average), 99% (SPECint95 average)<br />

Pre<strong>di</strong>tt<strong>ore</strong> <strong>del</strong>l’in<strong>di</strong>rizzo <strong>di</strong> ritorno<br />

• Alcuni salti variano l’in<strong>di</strong>rizzo target nello stesso programma<br />

• Tali salti sono tipicamente “in<strong>di</strong>rect jumps”<br />

• In particolare, fra questi ci sono i salti <strong>di</strong> ritorno da procedura<br />

• Nel caso <strong>di</strong> SPEC-89 i salti da ritorno da procedura sono l’85%<br />

• Pre<strong>di</strong>zione <strong>del</strong>le istruzioni <strong>di</strong> ritorno da procedura<br />

• L’esito e’ facile da pre<strong>di</strong>rre: always taken!<br />

• Il target non e’ facile da pre<strong>di</strong>rre: la stessa procedura puo’ essere<br />

invocata da <strong>di</strong>versi punti <strong>di</strong> un programma<br />

• Il BTB per pre<strong>di</strong>rre il target puo’ condurre a mispre<strong>di</strong>ction<br />

• E’ stato proposto un piccolo stack per mantenere gli in<strong>di</strong>rizzi<br />

<strong>di</strong> ritorno [Kaeli91]<br />

• Al momento <strong>del</strong>la chiamata si fa push <strong>del</strong>l’in<strong>di</strong>rizzo <strong>di</strong> ritorno in tale stack<br />

• Al momento <strong>del</strong> ritorno basta fare una pop da tale stack<br />

• Funziona come una cache dei piu’ recenti in<strong>di</strong>rizzi <strong>di</strong> ritorno<br />

• Se tale stack e’ sufficientemente grande pre<strong>di</strong>ce tutti i ritorni<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 14


Pre<strong>di</strong>zioni multiple [Yeh93-ics]<br />

• Idea: pre<strong>di</strong>rre i salti successivi anche se i precedenti<br />

non sono risolti<br />

• Effettuare 1 pre<strong>di</strong>zione per ciclo<br />

• Mentre si cerca <strong>di</strong> effettuare le pre<strong>di</strong>zioni successive,<br />

puo’ essere utile aggiornare speculativamente PHT e BHT<br />

• La tecnica funziona bene se l’accuratezza <strong>del</strong>la prima<br />

pre<strong>di</strong>zione e’ alta<br />

• 1 st pre<strong>di</strong>zione – 96% <strong>di</strong> accuratezza =><br />

- 2 nd pre<strong>di</strong>zione – 92.16% accuratezza =><br />

-4 th pre<strong>di</strong>zione – 84.93% accuratezza<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 15<br />

Pre<strong>di</strong>zioni multiple (2)<br />

• Idea2: effettuare PIU’ pre<strong>di</strong>zioni per ciclo<br />

• Questo permette <strong>di</strong> prelevare piu’ basic block (possibilmente<br />

giusti) simultaneamente<br />

• Si puo’ usare come schema base il GAg<br />

• Ha il vantaggio <strong>di</strong> poter effettuare pre<strong>di</strong>zioni senza il BIA<br />

Global BHSR<br />

(k bits)<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 16<br />

k<br />

k-1<br />

PHT<br />

M<br />

U<br />

X<br />

Secondary pre<strong>di</strong>ction<br />

Primary pre<strong>di</strong>ction<br />

Nota: con k bit si seleziona un elemento <strong>del</strong>la PHT (pre<strong>di</strong>zione primaria). Usando k-1 bit meno significativi<br />

seleziono I prossimi due possibili elementi <strong>del</strong>la PHT: da questi posso selezionarne uno uilizzando la<br />

pre<strong>di</strong>zione primaria e ottenendo cosi’ la pre<strong>di</strong>zione secondaria


Eager Execution [Uht95]<br />

• In un gruppo <strong>di</strong> 4 istruzioni e’ possibile che tutte e 4<br />

siano branch<br />

• Si deve far ricorso ad un BTB a 4 porte<br />

(similmente al pre<strong>di</strong>tt<strong>ore</strong> multiplo <strong>di</strong> Yeh)<br />

• Eager Execution<br />

• Si eseguono sia il ramo taken che quello not-taken senza pre<strong>di</strong>zioni<br />

- Il fetch avviene da entrambi i rami taken e not-taken<br />

- Nel lavoro <strong>di</strong> Uht il fetch viene limitato a 6 ramificazioni<br />

- Vengono via via buttati i rami sbagliatai nel momento in cui i branch sono risolti<br />

- Naturalmente viene buttato parecchio lavoro… ma e’ veloce!<br />

• Disjoint Eager Execution<br />

- In questo caso si considera la brench pre<strong>di</strong>ction mentre si fa il fetch<br />

- Si prelevano solo istruzioni dai rami predetti, fino a 6 ramificazioni<br />

- Se il ramo e’ sbagliato, semplicemente si fa ripartire la pipeline<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 17<br />

Trace Cache<br />

• Cattura sequenze <strong>di</strong> basic-blocks (tracce <strong>di</strong>naniche) in una cache che<br />

sostituisce la cache istruzioni<br />

• Tale cache e’ in<strong>di</strong>cizzata dal target <strong>di</strong> un salto<br />

• Gli elementi <strong>di</strong> tale cache sono asssemblati <strong>di</strong>namicamente mentre il programma esegue le<br />

sue istruzioni<br />

• Se c’e’ hit nella trace cache<br />

• Le istruzioni vengono prelevate dalla trace cache<br />

• La sequenza prelevata tipicamente contiene piu’ basic-block<br />

(ovvero una sequenza <strong>di</strong> piu’ taken branch)<br />

• Si elimina la necessita’ <strong>di</strong> fare il fetch <strong>di</strong> piu’ target<br />

• Inoltre la cache non deve essere con piu’ porte<br />

Quando il co<strong>di</strong>ce viene eseguito<br />

la prima volta: si registra la<br />

sequenza nella trace cache<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 18<br />

B1<br />

B2 B3<br />

B4<br />

B1 B3 B4<br />

va nella trace cache<br />

B1<br />

B3<br />

B4<br />

La volta successiva si<br />

legge la sequenza dalla<br />

trace cache: non c’e’<br />

bisogno <strong>di</strong> pre<strong>di</strong>rla !


ALPHA 2<strong>12</strong>64<br />

Branch Pre<strong>di</strong>ction case study<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L01, Slide 19<br />

Process<strong>ore</strong> Alpha 2<strong>12</strong>64<br />

• 500-600 MHz, 15x10 6 transistors, 2.2V, 0.35µ CMOS<br />

• Process<strong>ore</strong> a 64-bit<br />

• Process<strong>ore</strong> Superscalare a 4 vie<br />

• Puo’ prelevare ed eseguire fino a 4 istruzioni per ciclo<br />

• L’esecuzione avviene “fuori or<strong>di</strong>ne” (out-of-order)<br />

• Secondo Hennessy e Patterson ha il pre<strong>di</strong>tt<strong>ore</strong> piu’<br />

sofisticato implmentato fino al 2003<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 20


Pre<strong>di</strong>tt<strong>ore</strong> <strong>del</strong>l’Alpha 2<strong>12</strong>64 [Alpha99]<br />

• Tournament Pre<strong>di</strong>ctor<br />

• Sceglie <strong>di</strong>namicamente fra due pre<strong>di</strong>ttori<br />

- Il “pre<strong>di</strong>tt<strong>ore</strong> locale” (sinistra) – equivalente ad uno schena PAg<br />

- Il “pre<strong>di</strong>tt<strong>ore</strong> globale” (destra) – equivalente ad uno schema Gag<br />

- La selezione <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong> avviene attraverso una storia degli esiti<br />

competitivi data in pasto al solito contat<strong>ore</strong> a saturazione a 2 bit.<br />

Local pre<strong>di</strong>ctor<br />

Local<br />

history<br />

table<br />

(1024 x 10)<br />

Program<br />

counter<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 21<br />

Local<br />

pre<strong>di</strong>ction<br />

(1024 x 3)<br />

branch<br />

pre<strong>di</strong>ction<br />

MUX<br />

Global pre<strong>di</strong>ction<br />

(4096 x 2)<br />

Alpha 2<strong>12</strong>64 - Pre<strong>di</strong>tt<strong>ore</strong> Locale<br />

• Local History Table (LHT)<br />

Choice pre<strong>di</strong>ction<br />

(4096 x 2)<br />

Path history<br />

• Equivalente alla BHT <strong>del</strong>lo schema PAg (k=10, 1024 entry BHT (m=10))<br />

• Mantiene gli ultimi 10 esiti per un massimo <strong>di</strong> 1024 branch<br />

• E’ in<strong>di</strong>cizzato dall’in<strong>di</strong>rizzo <strong>del</strong>l’istruzione <strong>di</strong> salto (BIA)<br />

• Local Pre<strong>di</strong>ction Table (LPT)<br />

• Equivalente a una PHT <strong>del</strong>lo schema PAg (j=3, 1024 entries(k=10))<br />

• E’ in<strong>di</strong>cizzata dall’elemento <strong>di</strong> storia <strong>del</strong>la LHT<br />

• La FSM e’ un contat<strong>ore</strong> a saturazione a 3 bit<br />

• La pre<strong>di</strong>zione coincide col bit piu’ significativo <strong>del</strong>lo stato (1=T)<br />

• La LHT e la LPT sono aggiornate dopo che il branch viene<br />

risolto<br />

• Funziona bene per sequenze alternativamente T e N<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 22


Alpha 2<strong>12</strong>64 - Pre<strong>di</strong>tt<strong>ore</strong> Globale<br />

• Tabella da 4096 elementi<br />

• E’ equivalente alla PHT <strong>del</strong>lo schema GAg (j=2, 4096-entry PHT (k=<strong>12</strong>))<br />

• E’ in<strong>di</strong>cizzata con un registro <strong>di</strong> storia globale a <strong>12</strong> bit<br />

• Pre<strong>di</strong>tt<strong>ore</strong><br />

• La FSM e’ un contat<strong>ore</strong> a saturazione a 2-bit<br />

• La pre<strong>di</strong>zione coincide col bit piu’ significativo <strong>del</strong>lo stato (1=T)<br />

• Funziona bene per branch che sono influenzati da branch<br />

precedenti<br />

• Esempio:<br />

if (x == 10)<br />

{<br />

…<br />

}<br />

if (x % 2 == 0)<br />

…<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 23<br />

Se questo e’ taken…<br />

…e x non e’ cambiata qui…<br />

…anche questo branch sara’ taken<br />

Un pre<strong>di</strong>tt<strong>ore</strong> Globale<br />

tipicamente apprende<br />

e pre<strong>di</strong>ce correttamente<br />

situazioni <strong>di</strong> questo tipo<br />

Alpha 2<strong>12</strong>64 - Dimensione totale <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong><br />

• Pre<strong>di</strong>tt<strong>ore</strong> Globale<br />

• 4096 x 2 = 8K bits<br />

• Pre<strong>di</strong>tt<strong>ore</strong> Locale<br />

• Local History Table – 1024 x 10 = 10K bits<br />

• Local Pre<strong>di</strong>ction Table – 1024 x 3 = 3K bits<br />

• Logica <strong>di</strong> selezione <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong><br />

• 4096 x 2 = 8K bits<br />

• Totale<br />

• 29K bits<br />

• ~180,000 transistors<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 24


Uso <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong> Globale rispetto a Locale<br />

li<br />

eqntott<br />

espresso<br />

gcc<br />

fpppp<br />

spice<br />

doduc<br />

tomcatv<br />

matrix300<br />

nasa7<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 25<br />

Fraction of pre<strong>di</strong>ctions by local pre<strong>di</strong>ctor<br />

37<br />

0 10 20 30 40 50 60 70 80 90 100<br />

Percentuale <strong>di</strong> branch predetti dal local pre<strong>di</strong>ctor<br />

Numero <strong>di</strong> pre<strong>di</strong>zioni <strong>del</strong> pre<strong>di</strong>tt<strong>ore</strong> locale, normalizzato rispetto<br />

al numero totale <strong>di</strong> pre<strong>di</strong>zioni (locali+globali)<br />

Grafico da [Hennessy02]<br />

Prestazioni dei pre<strong>di</strong>ttori – A BP<br />

tomcatv<br />

doduc<br />

fpppp<br />

li<br />

espresso<br />

gcc<br />

Grafico da [Hennessy02]<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 26<br />

55<br />

70%<br />

63<br />

77%<br />

69<br />

84%<br />

72<br />

86%<br />

82%<br />

88%<br />

86%<br />

82%<br />

88%<br />

76<br />

95%<br />

94%<br />

99%<br />

99%<br />

100%<br />

97%<br />

98%<br />

98%<br />

96%<br />

0% 20% 40% 60% 80% 100%<br />

Branch pre<strong>di</strong>ction accuracy<br />

90<br />

94<br />

98<br />

100<br />

Profile-based<br />

2-bit counter<br />

Tournament


Prestazioni dei pre<strong>di</strong>ttori: mispred.rate vs. <strong>di</strong>m.<br />

Con<strong>di</strong>tional branch mispre<strong>di</strong>ction rate<br />

10%<br />

9%<br />

8%<br />

7%<br />

6%<br />

5%<br />

4%<br />

3%<br />

2%<br />

1%<br />

0%<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 27<br />

P6<br />

Benchmark Suite: SPEC89<br />

Local<br />

Correlating<br />

Tournament<br />

0 8 16 24 32 40 48 56 64 72 80 88 96 104 1<strong>12</strong> <strong>12</strong>0 <strong>12</strong>8<br />

Branch Pre<strong>di</strong>ction case study<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L01, Slide 28<br />

Total pre<strong>di</strong>ctor size (Kbits)<br />

Grafico da [Hennessy02]


Branch Pre<strong>di</strong>ction nel P6 [Shen02]<br />

• Risoluzione <strong>del</strong> branch (taken/not taken)<br />

• E’ effettuata nella JEU (Jump Execution Unit)<br />

• Il BTB pre<strong>di</strong>ce il target non appena la IFU (Instruction Fetch Unit) lo<br />

preleva<br />

• Tutti gli in<strong>di</strong>rizzi sono verificati dal BAC (Branch Address Calculator) o<br />

dalla JEU<br />

• Branch Target Buffer (BTB)<br />

• Opera nei primi sta<strong>di</strong> <strong>del</strong>la pipeline<br />

• Parte dall’in<strong>di</strong>rizzo <strong>del</strong>l’IP (Instruction Pointer) e produce una<br />

pre<strong>di</strong>zione <strong>del</strong>l’esito e <strong>del</strong> target<br />

• L’in<strong>di</strong>rizzo target predetto viene inviato alla IFU per il prelievo<br />

• Aggiornamento <strong>del</strong> BTB<br />

• Il BTB viene aggiornato non appena la JEU risolve il branch<br />

• Questo puo’ essere troppo tar<strong>di</strong> se il branch successivo arriva<br />

nelle istruzioni imme<strong>di</strong>atamente successive<br />

-Il BTB viene pertanto speculaticamente aggiornato al momento <strong>del</strong>la pre<strong>di</strong>zione<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 29<br />

P6 - Algoritmo <strong>di</strong> Branch Pre<strong>di</strong>ction<br />

• Basato sullo schema 2-level adaptive [Yeh92]<br />

• Primo livello – storia degli esiti dei branch<br />

• Secondo livello – comportamento <strong>del</strong> branch per un dato pattern <strong>di</strong> storia<br />

• Differenze rispetto a [Yeh92]<br />

- C’e’ una copia speculativa <strong>del</strong> BHT che consente <strong>di</strong> effettuare le pre<strong>di</strong>zioni prima che si<br />

abbia la risoluzione (e l’aggiornamento)<br />

• Per ogni branch…<br />

• Il BTB mantiene k bit <strong>di</strong> storia “reale” (detta BHR ==BHT)<br />

- Taken/Not-taken per gli ultimi N salti<br />

• Il BHT in<strong>di</strong>cizza una tabella <strong>di</strong> 2k elementi <strong>di</strong> stato (Pattern Table – PT ==PHT)<br />

- La FSM relativa e’ il solito contat<strong>ore</strong> a saturazione<br />

• La BTB usa 4-bit <strong>di</strong> pattern table “semilocale” per set<br />

• Ogni elemento ha 4 bit <strong>di</strong> storia<br />

• Quattro branch in un set usano la stessa pattern table<br />

• Aggiornamento speculativo <strong>del</strong> BHR<br />

• Una copia speculativa <strong>del</strong> BHR viene aggiornata con l’attuale pre<strong>di</strong>zione<br />

- Tale copia viene utilizzata nel caso arrivi un branch prima che il precedente sia risolto<br />

• La BHR reale viene aggiornato con l’esito effettivo dopo la risoluzione <strong>del</strong> branch<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 30


Algoritmo <strong>di</strong> Branch Pre<strong>di</strong>ction - BTB<br />

• BTB e’ sud<strong>di</strong>visa in due sta<strong>di</strong><br />

• Il motivo e’ dovuto alla velocita’ <strong>del</strong> circuito<br />

• I branch predetti “taken” inseriscono una bolla nella pipeline<br />

• Se non c’e’ hit nel BTB<br />

• Si utilizza una pre<strong>di</strong>zione <strong>di</strong> tipo statico<br />

• BTFN=Bachward Taken, Forward Not-taken<br />

• Return stack<br />

• La BTB mantiene inoltre un “return stack” [Kaeli91] <strong>di</strong> 16 elementi<br />

• Questo aiuta a pre<strong>di</strong>rre l’in<strong>di</strong>rizzo <strong>di</strong> ritorno <strong>del</strong>le funzioni<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 31<br />

PENTIUM 4 & PENTIUM M<br />

Branch Pre<strong>di</strong>ction case study<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L01, Slide 32


P4 - Branch pre<strong>di</strong>ction [Boggs03]<br />

• Secondo Intel, il piu’ sofisticato schema <strong>di</strong> pre<strong>di</strong>zione al 2007<br />

• Non molti dettagli sono <strong>di</strong>sponibili<br />

• Si avvale <strong>di</strong> due maniere <strong>di</strong> pre<strong>di</strong>rre il branch (simile al P6)<br />

• Se BTB fa hit si usa tale pre<strong>di</strong>zione<br />

• In caso contrario si usa una pre<strong>di</strong>zine statica<br />

• Miglioramenti introdotti nel Pentium M [Gochman03]<br />

- Pre<strong>di</strong>zione dei branch in<strong>di</strong>retti<br />

- Rivelat<strong>ore</strong> <strong>di</strong> loop<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 33<br />

P4 - Branch Pre<strong>di</strong>ction statica<br />

• Generazioni precedenti<br />

• I “backward branch” venivano sempre “taken”<br />

• Backward branches nel P4<br />

• Si controlla se ricade su una chiusura <strong>di</strong> un loop oppure no<br />

- La decisione si basa su una soglia definita in maniera empirica<br />

-Se offset < soglia allora deduco che sono nel caso <strong>di</strong> una chiusa <strong>di</strong> loop pre<strong>di</strong>co taken<br />

-Se offset > soglia deduco che NON sono nel caso <strong>di</strong> una chiusa <strong>di</strong> loop pre<strong>di</strong>co not-taken<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 34


P4 – Pre<strong>di</strong>zione <strong>di</strong>namica dei branch<br />

• Il pre<strong>di</strong>tt<strong>ore</strong> e’ 8 volte piu’ grande <strong>di</strong> quello <strong>del</strong> P6 (4KB)<br />

• L’algoritmo preciso non e’ stato <strong>di</strong>vulgato<br />

• Il pre<strong>di</strong>tt<strong>ore</strong> si combina con la Trace Cache<br />

• La Trace Cache sostituisce la Cache Istruzioni<br />

• Componenti<br />

• Return Address Stack – 16 elementi (v. [Kaeli91])<br />

• In<strong>di</strong>rect Branch Pre<strong>di</strong>ctor (v. slide successiva)<br />

• Loop detector (v. due slide avanti)<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 35<br />

In<strong>di</strong>rect Branch Pre<strong>di</strong>ctor<br />

• Risolve i branch in<strong>di</strong>retti <strong>di</strong>pendenti dai dati<br />

• Sono molto frequenti nei programmi object-oriented (Java, C++)<br />

• Ci sono due casi<br />

• Branch in<strong>di</strong>retti con 1 target (piu’ facili da pre<strong>di</strong>rre)<br />

• Branch in<strong>di</strong>retti con piu’ target (es. statement “case”)<br />

in cui il target <strong>di</strong>pende dai dati <strong>del</strong> programma<br />

• Il pre<strong>di</strong>tt<strong>ore</strong> <strong>di</strong>fferenzia fra questi due casi<br />

• Data-independent<br />

- Viene usato solo l’IP per selezionare il branch target<br />

- Si memorizza il target in una tabella in<strong>di</strong>cizzata dall’IP<br />

• Data-dependent<br />

- Si usa la storia globale degli esiti per selezionare il branch target<br />

- Si memorizza il target in una tabella in<strong>di</strong>cizzata dalla storia globale<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 36


Loop pre<strong>di</strong>ctor<br />

• Cerca <strong>di</strong> scoprire se il branch chiude un ciclo oppure no<br />

• Un branch chiude un ciclo se salta piu’ volte in una <strong>di</strong>rezione (sia essa<br />

taken che not taken)<br />

• L’ultimo movimento avviene in <strong>di</strong>rezione opposta per terminare il loop<br />

• Questa tecnica funziona meglio <strong>di</strong> altri pre<strong>di</strong>ttori per i loop<br />

Conta quante volte questo<br />

branch ha saltato ad un<br />

dato in<strong>di</strong>rizzo<br />

Rivela quando il contat<strong>ore</strong><br />

ha raggiungo il limite per<br />

cui si ripristina<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 37<br />

0<br />

-1<br />

Count Limit Pre<strong>di</strong>ction<br />

=<br />

pre<strong>di</strong>ction<br />

Pre<strong>di</strong>ce che il loop si<br />

chiude fintanto che il<br />

contat<strong>ore</strong> e’ al <strong>di</strong> sotto <strong>del</strong><br />

limite memorizzato<br />

Suggerimenti software per la branch pre<strong>di</strong>ction<br />

• Il P4 consente al software <strong>di</strong> passare suggerimenti (hints) al<br />

process<strong>ore</strong><br />

• L’hardware <strong>di</strong> Branch Pre<strong>di</strong>ction e <strong>di</strong> formazione <strong>del</strong>la traccia<br />

consulta questa informazioni per migliorare le prestazioni<br />

• Cambiamenti nell’ISA<br />

• Le istruzioni <strong>di</strong> branch devono essere mo<strong>di</strong>ficate per supportare i<br />

suggerimenti<br />

• Si aggiungono dei prefissi ai salti con<strong>di</strong>zionali<br />

• La tecnica e’ usata solo nel momento in cui si crea la traccia<br />

• Dopo la creazione <strong>del</strong>la traccia gli hints <strong>del</strong> software non vengono piu’<br />

considerati<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 38


Prestazioni<br />

• Confronto tra due generazioni <strong>di</strong> architetture Intel (130nm vs 90nm)<br />

SPECint_base2000 130nm 90nm<br />

164.gzip 1.03 1.01<br />

175.vpr 1.32 1.21<br />

176.gcc 0.85 0.70<br />

181.mcf 1.35 1.22<br />

186.crafty 0.72 0.69<br />

197.parser 1.06 0.87<br />

252.eon 0.44 0.39<br />

253.perlbmk 0.62 0.28<br />

254.gap 0.33 0.24<br />

255.vortex 0.08 0.09<br />

256.bzip2 1.19 1.<strong>12</strong><br />

300.twolf 1.32 1.23<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 39<br />

References<br />

Nella tabella a lato si riporta il numero<br />

<strong>di</strong> mispre<strong>di</strong>ction su 100 istruzioni <strong>di</strong><br />

branch, nal caso <strong>del</strong>l’architettura P4 a<br />

130 nm e a 90 nm.<br />

Dati forniti da Intel.<br />

[Alpha99] Compaq Computer Corporation, Alpha 2<strong>12</strong>64 Microprocessor Hardware Reference<br />

Manual, 1999.<br />

[Boggs03] Boggs D., et. al. The Microarchitecture of the Intel ® Pentium ® 4 Processor on 90nm<br />

Technology. Intel ® Technology Journal, Vol 08, Issue 01, February 18, 2003.<br />

[Gochman03] Gochman S., et. al. The Intel ® Pentium ® M Processor: Microarchitecture and<br />

Performance. Intel ® Technology Journal, Vol 07, Issue 02, May 21, 2003.<br />

[Hennessy02] Hennessy, J. L. and Patterson, D. A. 2002 Computer Architecture: a Quantitative<br />

Approach. 3 rd E<strong>di</strong>tion. Morgan Kaufmann Publishers Inc. 2002.<br />

[Kaeli91] D. R. Kaeli and P. G. Emma. Branch history table pre<strong>di</strong>ction of moving target<br />

branches due to subroutine returns. In Proc. ISCA-18, pages 34–41, May 1991.<br />

[McFarling93] McFarling, S . Combining Combining branch branch pre<strong>di</strong>ctors. pre<strong>di</strong>ctors. Technical Report TN-36, Digital<br />

Western Research Laboratory, June 1993.<br />

[Pan92] S. T. Pan, K. So, and J. T. Rahmeh. Improving the accuracy of dynamic branch<br />

pre<strong>di</strong>ction using branch correlation. In Procee<strong>di</strong>ngs of ASPLOS V, pages 76–84,<br />

Boston, MA, October 1992.<br />

[Shen02] Shen J. P. , Lipasti M. Modern Processor Design, McGraw Hill Higher Education;<br />

Beta Ed e<strong>di</strong>tion (November 1, 2002).<br />

[Yeh93-ics] Yeh, T., Marr, D. T., and Patt, Y. N. 1993. Increasing the instruction fetch rate via<br />

multiple branch pre<strong>di</strong>ction and a branch address cache. In Procee<strong>di</strong>ngs of the 7th<br />

International Conference on Supercomputing (Tokyo, Japan, July 19 - 23, 1993).<br />

[Uht95] Uht, A. K., Sindagi, V., Hall, K. Disjoint eager execution: an optimal form of<br />

speculative execution. In Procee<strong>di</strong>ngs of the 28th Annual international Symposium<br />

on Microarchitecture (Dec. 1995).<br />

Roberto Giorgi, Universita’ <strong>di</strong> Siena, C208L05, Slide 40

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!