Branch Predictors

La presentazione dei nuovi processori Intel Core i7 è alle porte. In attesa dei benchmark, iniziamo con il dare un'occhiata all'architettura su cui saranno basati: Nehalem.

Avatar di Andrea Ferrario

a cura di Andrea Ferrario

Editor in Chief

Branch Predictors

L'ultimo miglioramento nel front end ha a che fare con i branch predictor. L'efficienza degli algoritmi di branch prediction diventa cruciale nelle architetture che necessitano di alti livelli di parallelismo. Un branch rompe il parallelismo perchè è necessario aspettare per il risultato della precedente istruzione prima che l'esecuzione del flusso di istruzioni possa continuare. Il branch prediction determina se un branch sarà preso oppure no e, se si, determina velocemente l'indirizzo obiettivo per continuare l'esecuzione. Non sono necessarie tecniche complicate per farlo; tutto quello che ci vuole, è un array di branch ? il Branch Target Buffer (BTB) ? che immagazzina i risultati dei branch come progressi esecutivi ( ?Taken? o ?Not Taken? e l'indirizzo) e un algoritmo determina il risultato del prossimo branch.

Intel non ha fornito dettagli riguardo l'algoritmo usato per i nuovi predictor, ma si sa che sono a due livelli. Il primo livello non è diverso dall'architettura Conroe, ma il nuovo livello ha un accesso più lento e può immagazzinare più informazioni storiche. Secondo Intel, questa configurazione incrementa il branch prediction in certe applicazioni che usano un grosso volume di codice, come i database - ecco un'altra evidenza dell'orientazione server del Nehalem. Un altro miglioramento è il Return Stack Buffer, che immagazzina gli indirizzi di ritorno delle funzioni quando sono chiamate. In certi casi, questo buffer può sovraccaricarsi e quindi le predizioni possono non andare a buon fine. Per limitare questa possibilità, AMD ha incrementato la dimensione a 24 dati, mentre Intel ha introdotto un sistema di rinominazione per questo buffer.

Il ritorno dell'Hyper-Threading

Il front end non è stato cambiato radicalmente e nemmeno il back end. È dotato esattamente delle stesse unità presenti nei recenti processori Core, ma qui gli ingegneri hanno effettuato alcune modifiche per rendere tutto più efficiente.

Con il Nehalem, l'Hyper-Threading fa il suo grande ritorno. Introdotto con la versione Northwood dell'architettura NetBurst, l'Hyper-Threading - anche conosciuto, fuori dal mondo Intel, come Simultaneous Multi-Threading (SMT) - è un sistema per parallelizzare i thread e incrementare l'uso delle unità di esecuzione del core, facendo sì che il core appaia, a livello applicativo, come due core.

Per usare thread paralleli, alcune risorse - come i registri - devono essere duplicate. Altre risorse sono condivise dai due thread: il buffer istruzioni, unità esecutive e memoria cache. Una semplice osservazione ci riporta all'introduzione dell'SMT: con il maggior numero di unità esecutive e la maggior lunghezza delle pipeline, diventò più difficoltoso estrarre abbastanza parallelismo per usare tutte le unità di esecuzione a ogni ciclo. Dove i Pentium 4 avevano una pipeline molto lunga, Nehalem ha prediletto l'aumento delle unità esecutive. La nuova architettura ha sei unità di esecuzione in grado di eseguire tre operazioni sulla memoria e tre di calcolo. Se il motore non trova abbastanza parallelismo per avantaggiarsi di queste unità, significa perdere dei cicli, e quindi meno prestazioni.

Per rimediare a questa situazione, l'SMT cerca istruzioni da parallelizzare in due thread anzichè uno, con l'obiettivo di lasciare meno unità inutilizzate. Quest'approccio può essere veramente efficiente quando due thread stanno eseguendo task molto differenti e separati. D'altra parte, due thread richiedono calcoli più intensivi, per esempio, possono creare più pressione sulla stessa unità di calcolo, creando una sorta di competizione per l'accesso alla cache. In questa situazione, l'SMT diventa meno interessante e può impattare sulle prestazioni.