lucidi in formato pdf - Dipartimento di Matematica e Informatica
Transcript
lucidi in formato pdf - Dipartimento di Matematica e Informatica
Migliorare le prestazioni di processori e memorie Corso: Architetture degli Elaboratori Docenti: F. Barbanera, G. Bella UNIVERSITA’ DI CATANIA Dip. di Matematica e Informatica Tipologie dei Miglioramenti Implementativi: ad esempio, aumentare la velocità di clock I vecchi programmi continuano a girare senza problemi E’ il caso dei miglioramenti dall’80386 al Pentium II Architetturali: ridisegnato instruction set esteso o Per esempio, macchine RISC F. Barbanera, G. Bella 2 Migliorare le prestazioni v.2.3 1 Miglioramenti 1. Memoria cache: la CPU è molto più veloce della memoria… 2. Predizione di salto: linearizzare l’esecuzione del codice 3. Esecuzione fuori ordine: eseguire le istruzioni in ordine diverso da quello dato 4. Esecuzione speculativa: eseguire prima di sapere se servirà F. Barbanera, G. Bella 3 codice Migliorare le prestazioni v.2.3 1. Memoria cache Una memoria piccola e veloce per memorizzare le parole di dati usate più recentemente (come sappiamo!) F. Barbanera, G. Bella 4 Migliorare le prestazioni v.2.3 2 Cache di livello 1 A bordo della CPU Dimensioni tipiche: 16-64 KB Tipicamente separata (split cache) per istruzioni e dati Ciascuna porzione associata a una porta di memoria (due porte separate come nel Mic-1) Accesso indipendente alla memoria: raddoppiano le prestazioni (operano indipendentemente: larghezza di banda raddoppiata) F. Barbanera, G. Bella 5 Migliorare le prestazioni v.2.3 Cache di livello 2 Fra la cache di livello 1 e la memoria Dimensioni tipiche: 512 KB – 1 MB Unificata per istruzioni e dati Non e’ a bordo della CPU ma si puo’ includere in un package per essa (come per il SEC del Pentium II) F. Barbanera, G. Bella 6 Migliorare le prestazioni v.2.3 3 Cache di livello 3 Alloggiata sulla scheda ospitante la CPU Fra la cache di livello 2 e la memoria Dimensioni tipiche: alcuni MB Unificata per istruzioni e dati F. Barbanera, G. Bella 7 Migliorare le prestazioni v.2.3 Caratteristiche di cache a livelli Inclusive: Livello 3 include livello 2; livello 2 include livello 1 Basate sul principio di località Località spaziale: un programma usa celle di memoria vicine Località temporale: alta probabilità di accedere nuovamente a celle appena richieste Memoria vista come insieme di linee di cache, ognuna di 4-64 byte Se viene indirizzata una parola, il controllore della cache verifica se essa è in cache, altrimenti sostituisce una linea con quella richiesta F. Barbanera, G. Bella 8 Migliorare le prestazioni v.2.3 4 Cache a mappatura diretta - intuizione Si immagini di suddividere tutta la RAM in porzioni di dimensioni fisse, chiamate linee Si immagini di suddividere tutte le linee in gruppi di γ linee, identificando ciascun gruppo con un tag Si potrà indirizzare la memoria richiedendo la linea β di tag α Si potrà considerare un gruppo (di γ linee) aventi tutte lo stesso tag oppure tag diverso F. Barbanera, G. Bella 9 Migliorare le prestazioni v.2.3 Cache a mappatura diretta Esempio con 2048 linee Attenzione: alcuni testi presentano errori su questa figura! Valid Una linea di memoria è registrata esattamente in un posto: se non sta lì, allora non sta nella cache Formato di una linea di cache (nell’esempio): Data: (32 byte) copia della linea di memoria Tag: (16 bit) valore che identifica un gruppo di linee di memoria Valid: (1 bit) settato se Data contiene valori validi (aggiornati) F. Barbanera, G. Bella 10 Migliorare le prestazioni v.2.3 5 Indirizzamento di un byte in cache - intuizione Il byte sia la minimia cella indirizzabile di memoria Un tag si può vedere come un insieme di linee A sua volta, una linea è un insieme di parole (4 byte) A sua volta, una parola è un insieme di byte Allora per indirizzare un byte, se ne deve stabilire la posizione all’interno di una parola, della quale si deve stabilire la posizione all’interno di una linea, della quale si deve stabilire la posizione all’interno di un tag. Esempio. La CPU indirizza il byte δ della parola χ della linea β del tag α F. Barbanera, G. Bella 11 Migliorare le prestazioni v.2.3 Indirizzi di memoria generati dalla CPU – esempio di 32 bit TAG: quale tag di linee è richiesto (216 tag) LINE: quale linea all’interno del tag (211 linee) WORD: quale parola all’interno della linea (23 parole) BYTE: quale byte all’interno della parola (22 byte) F. Barbanera, G. Bella 12 Migliorare le prestazioni v.2.3 6 Indirizzamento di un byte in cache Appena la CPU genera un indirizzo di tale formato, il controllore della cache: ricerca linea LINE nella cache; se il TAG dell’indirizzo coincide con il Tag della linea di cache e il bit Valid è settato, allora si ha un successo (cache hit); altrimenti si ha un insuccesso (cache miss): l’intera linea LINE di tag TAG viene letta dalla memoria principale e sostituita alla porzione Data della linea LINE di cache; TAG rimpiazza Tag; bit Valid viene settato F. Barbanera, G. Bella 13 Migliorare le prestazioni v.2.3 Prestazioni Inizialmente, linee contigue di memoria vengono messe in cache Pertanto, se Y è la dimensione della cache e un programma Accede alla linea d’indirizzo X, con X < Y, cache hit Quindi accede alla linea X+Y, cache miss Raro inconveniente Cautelativaemente, non si dovrebbe mai scrivere su linee troppo distanti di memoria Soluzione: cache associativa ad n modi F. Barbanera, G. Bella 14 Migliorare le prestazioni v.2.3 7 Cache associativa ad n modi (vie) n linee di memoria per linea di cache Una linea di memoria va ricercata fra le n presenti in una linea di cache (dà ottime prestazioni) Associazione a 4 modi La ricerca si effettua mediante controllo sui tag F. Barbanera, G. Bella 15 Migliorare le prestazioni v.2.3 Cache associativa ad n modi Uno stesso tag (per esempio β1) si può trovare su linee di cache diverse Rimpiazzare linee è complicato. Per esempio, dove inserire la linea di memoria 7 di tag β13? β1 β6 β3 β1 β19 β1 β1 F. Barbanera, G. Bella 16 Migliorare le prestazioni v.2.3 8 Progettazione di una cache Rimpazzamento delle linee LRU (Least Recently Used), MRU (Most Recently Used) Se la CPU intende scrivere una linea che si trova in cache Write through (immediato: resettare bit Valid!) Write deferred (attraverso cache) non in cache Write through (immediato: resettare bit Valid!) Write allocation (attraverso cache) Osservazione elementare: tutti i bit Valid sono resettati all’accensione. 17 Migliorare le prestazioni v.2.3 2. Predizione di salto Then: Else: Next: CMP i,0 BNE Else MOV k,1 BR Next MOV k,2 Frammento Assembly F. Barbanera, G. Bella Le pipeline funzionano meglio se il codice non ha salti Unità di lettura e decodifica separate Quando l’unità di decodifica scopre il salto, l’unità di lettura deve già fornire una nuova istruzione Con salti non condizionati, spesso si legge l’istruzione successiva malgrado non serva Con salti condizionati, le prime pipeline si fermavano fino a quando non si stabiliva se saltare all’etichetta THEN (salto preso) o all’ELSE (salto non preso) Bisognerebbe predire il futuro! F. Barbanera, G. Bella 18 Migliorare le prestazioni v.2.3 9 Stragegie di predizione 1. Tutti i salti all’indietro siano presi (ad esempio, si trovano alla fine di un ciclo, e molti cicli sono eseguiti più volte) 2. Tutti i salti in avanti siano non presi (ad esempio, servono a gestire gli errori: errori rari implicano salti in avanti tipicamente non presi) E se la predizione fosse errrata? Quali misure adoperare? F. Barbanera, G. Bella 19 Migliorare le prestazioni v.2.3 Misure di error recovery Eseguire le istruzioni che seguono un salto condizionato adoperando le seguenti misure all’atto della scrittura su un registro della memoria. 1. Si scrivano i dati freschi su un registro di scratch, poi copiato in memoria solo quando si accerta la correttezza della predizione 2. Si faccia una copia di backup del registro della memoria, da usare per ripristinare i vecchi dati quando si accerti l’errore nella predizione Medesima filosofia… F. Barbanera, G. Bella 20 Migliorare le prestazioni v.2.3 10 Predizione dinamica di salto La CPU mantiene in hardware una tabella con le informazioni sui salti condizionati più recenti Ogni linea contiene l’indirizzo dell’istruzione di salto e un bit che indica se il salto e’ stato preso l’ultima volta che è stato eseguito Quindi la strategia di predizione è: il salto si comporti come la volta precedente Quando la predizione di un salto è accertata errata, si modifica il bit relativo al salto nella tabella Gestibile esattamente come una cache F. Barbanera, G. Bella 21 Migliorare le prestazioni v.2.3 Predizione statica di salto Si espleta prima dell’esecuzione di un programma. Non richiede hardware specializzato e costoso (come la predizione dinamica) 1. Suggerimenti da parte del compilatore: Se il compilatore ritiene che certi salti saranno presi (si pensi, ad esempio, a un ciclo for), allora vengono compilati in istruzioni precipue del linguaggio assemblatore, le quali indicano il suggerimento del compilatore In realtà è una modifica architetturale 2. Profili di funzionamento: si simula il programma e le informazioni sull’andamento dei salti direttamente passate al compilatore F. Barbanera, G. Bella 22 vengono Migliorare le prestazioni v.2.3 11 3. Esecuzione fuori ordine Architettura superscalare: singola pipeline con più unità funzionali. lettura delle istruzioni decodifica delle istruzioni lettura degli operandi ALU ALU LOAD Gi à vis ta ! scrittura STORE • La lettura di un’istruzione comincia Floating prima che la precedente abbia point percorso l’intera pipeline • Dipendenza: l’esecuzione di alcune istruzioni non può cominciare prima di aver ricevuto dei dati calcolati da istruzioni precedenti • Soluzione: eseguire nel frattempo altre istruzioni, anche seguenti, che non abbiano dipendenze (da cui esecuzione fuori ordine) F. Barbanera, G. Bella 23 Migliorare le prestazioni v.2.3 Dipendenze RAW (Read After Write): tentativo di leggere un registro la cui scrittura(*) non è ancora terminata WAR (Write After Read): tentativo di scrivere su un registro la cui lettura(*) non è ancora terminata WAW (Write After Write): tentativo di scrivere un registro la cui scrittura(*) non è ancora terminata (*) = da parte di qualche istruzione precedente F. Barbanera, G. Bella 24 Migliorare le prestazioni v.2.3 12 L’esecuzione di un’istruzione inizi un ciclo dopo il ciclo di decodifica. + e – impieghino qu 2 cicli, * impieghi 3 cicli. ali cic lo … son e c o i om niz ple iat ta e te Scoreboard: tabella di contatori per ciascun registro, indica volte che un registro è usato da un’istruzione Dipendenza RAW: I4 non viene inziata Dipendenza WAR: I6 non viene inziata In caso di dipendenza, l’istruzione successiva e’ bloccata! F. Barbanera, G. Bella 25 Migliorare le prestazioni v.2.3 Completamento fuori ordine renderebbe impossibile il precise interrupt Esempio di esecuzione in ordine Esempio di esecuzione fuori ord. L’esecuzione di un’istruzione inizi un ciclo dopo il ciclo di decodifica. + e – impieghino 2 cicli, * impieghi 3 cicli. Anche se I4 è bloccata, abbiamo iniziato I5 ed I6 E se I5 usasse R6? Ossia, se le istruzioni eseguite fuori ordine usassero registri che l’istruzione bloccata avrebbe modificato? Va aggiunto allo scoreboard un bit in più per ogni registro che indichi se il registro è “atteso” da un’istruzione bloccata F. Barbanera, G. Bella 26 Migliorare le prestazioni v.2.3 13 Rinominazione dei Registri L’unita’ di decodifica ha rinominato R1 come S1 nell’istruzione 6 e 7. Pertanto, le istruzioni 5 e 6 possono essere eseguite in parallelo. F. Barbanera, G. Bella 27 Migliorare le prestazioni v.2.3 4. Esecuzione speculativa Esecuzione anticipata di codice prima di sapere se servirà Potenzia l’esecuzione fuori ordine Assistita dal compilatore Per esempio, anticipare la lettura (LOAD) delle variabili utilizzate all’interno di un ciclo prima che il ciclo cominci Certamente c’è il rischio di fare lavoro inutile F. Barbanera, G. Bella 28 Migliorare le prestazioni v.2.3 14 Esecuzione speculativa: esempio si può già calcolare k si possono già calcolare evensum e oddsum Ma non si deve scrivere in memoria perché in generale non è detto che un’operazione speculativa sia giusta! Soluzione: il codice speculativo usi registri di scratch. F. Barbanera, G. Bella 29 Migliorare le prestazioni v.2.3 Problemi e soluzioni Se un’istruzione speculativa causasse un cache miss? Rischiamo lavoro inutile. Soluzione. Caricamento speculativo: quando un’istruzione speculativa tenta di leggere una linea dalla cache, abbandona qualora non la trovi Se un’istruzione speculativa causasse un’eccezione? Esempio. if (x > 0) z = y/x Per ogni istruzione c’è un poison bit che viene settato se l’esecuzione speculativa di quell’istruzione causa eccezione. Prima dell’esecuzione “normale” dell’istruzione, se ne controlla il poison bit F. Barbanera, G. Bella 30 Migliorare le prestazioni v.2.3 15