Gerarchia di memoria 1 Gerarchia di memoria: Terminologia • Hit: il dato appare in qualche blocco al livello superiore (Es.: Blocco X) – Hit Rate: la frazione degli accessi di memoria trovati nel livello superiore – Hit Time: tempo per accedere al livello superiore che consiste in RAM access time + tempo per determinare hit/miss • Miss: il dato deve essere estratto dal livello inferiore (Blocco Y) – Miss Rate = 1 - (Hit Rate) – Miss Penalty: tempo per sostituire un blocco nel livello superiore + tempo per consegnare il blocco al processore • Hit Time << Miss Penalty Al processore Dal processore Memoria di liv. superiore Memoria di liv. inferiore Blocco X Blocco Y 2 Il tempo necessario alla risoluzione di un fallimento nell’accesso alla cache dipende sia dalla latenza della memoria sia dalla sua ampiezza di banda. La latenza determina il tempo necessario a recuperare la prima parola del blocco, mentre l’ampiezza di banda è responsabile del tempo richiesto per accedere alla parte rimanente del blocco. 3 Gerarchia di memoria Registri 1KB 1 ciclo Cache L1 (dati o istruzioni) 32KB 2 cicli Cache L2 2MB 15 cicli Memoria 1GB 300 cicli Disco 80 GB 10M cicli 4 Gerarchia di memoria: Apple iMac G5 1.6 GHz Gestiti da compilatore Gestiti da hardware Gestito da OS, hardware, applicazione Reg L1 Istr L1 Dati L2 DRAM Disco Dimensioni 1K 64K 32K 512K 256M 80G Latenza 1 ciclo, 3 cicli, 3 cicli, 11 cicli, 88 cicli, 107cicli, 0.6 ns 1.9 ns 1.9 ns 6.9 ns 55 ns 12 ms 5 L1 (64K Istruzioni) Regi stri 512K L2 (1K) L1 (32K Dati) 6 4 Domande per la gerarchia di memoria • D1: Dove può essere posto un blocco nel livello superiore? (Block placement) • D2: Come si fa a trovare un blocco se è a livello superiore? (Block identification) • D3: Quale blocco deve essere sostituito in occasione di un miss? (Block replacement) • D4: Cosa accade in occasione di una write? (Write strategy) 7 D1: Dove può essere posto un blocco nel livello superiore? • Blocco 12 posto in una cache di 8 blocchi: Posizione di partenza nella cache = Indirizzo del blocco in memoria Modulo Numero di linee per via 01234567 01234567 01234567 1111111111222222222233 01234567890123456789012345678901 8 D2: Come si fa a trovare un blocco se è a livello superiore? • Aumentando l’associatività si restringe index, si espande tag 9 D3: Quale blocco deve essere sostituito in occasione di un miss? • In una write miss, si può scegliere di portare il blocco nella cache (write-allocate) o no (write-no-allocate) • In una read miss, si deve sempre portare il blocco nella cache (località spaziale e temporale) – ma, se non ci sono blocchi vuoti, quale blocco sostituire? non c’è scelta per cache direct-mapped prendere a caso la via da sostituire sostituire la via least-recently used (LRU) sostituzione FIFO (round-robin) 10 D4: Cosa accade in occasione di una write? Le letture costituiscono il tipo dominante di accesso alla cache. Tutti gli accessi per le istruzioni sono in lettura e la maggior parte delle istruzioni non scrive dati in memoria. Fortunatamente, il caso più frequente è anche quello che si può rendere veloce più facilmente. Si può leggere un blocco della cache nello stesso momento in cui si legge e si confronta il suo tag, in modo che la lettura di un blocco inizi non appena è disponibile il suo indirizzo. Se la lettura è un accesso con successo, la porzione di blocco richiesta viene immediatamente trasferita al processore. Se, invece, si tratta di un accesso con fallimento, non si trae beneficio da questa strategia, ma non ci sono nemmeno conseguenze negative, se si eccettua un maggior consumo di potenza: basta ignorare il valore che è stato letto. Un tale ottimismo non è consentito quando si tratta di operazioni di scrittura. La modifica di un blocco non può iniziare prima che sia terminata la verifica del suo tag, per essere certi che l’accesso avvenga con successo. Così, le operazioni di scrittura sono solitamente più lente 11 delle operazioni di lettura. Write Buffer per Write-Through Caches Processore Cache Memoria di livello inferiore Write Buffer Contiene dati in attesa di write-through alla memoria di livello inferiore Così la CPU non va in stallo Burst di writes sono comuni 12 Migliorare le prestazioni delle cache • Tempo di accesso medio in memoria (Average memory access time - AMAT) AMAT = hit time + miss rate * miss penalty – Ridurre miss rate – Ridurre miss penalty – Ridurre hit time 13 Tipi di Cache Misses • Compulsory misses: avvengono la prima volta che si accede ad una parola di memoria – i miss di una cache infinita • Capacity misses: avvengono poiché il programma ha “toccato” molte altre parole prima di toccare di nuovo la stessa parola – i miss per una cache fully-associative • Conflict misses: avvengono poiché due parole hanno un mapping alla stessa locazione nella cache – i miss generati se si passa da una cache fully-associative ad una directmapped 14 Ridurre miss rate • Blocchi di grande dimensione – riduce miss compulsory, riduce miss penalty in caso di località spaziale – aumenta il traffico tra differenti livelli, spreco di spazio, e miss di conflitto • Grandi cache – riduce miss di capacità/conflitto – penalità in tempo di accesso • Alta associatività – riduce miss di conflitto – 2-way cache di capacità N/2 ha più o meno la stessa miss rate di 1-way cache di capacità N – penalità in tempo di accesso • Predizione della via – predicendo la via, il tempo di accesso è prossimo a quello di una cache direct-mapped – può anche ridurre il consumo di potenza 15 Ridurre miss penalty • Cache multilivello • Critical word first • Priorità per le letture • Victim caches 16 Ridurre Miss Penalty: cache multilivello AMAT = HitTimeL1+MissRateL1MissPenaltyL1 MissPenaltyL1= HitTimeL2+MissRateL2MissPenaltyL2 MissPenaltyL2= HitTimeL3+MissRateL3MissPenaltyL3 • Proprietà di esclusione – Se un blocco è nella cache L1, esso non è mai nella cache L2 – Risparmia spazio in L2 • Proprietà di inclusione – Se un blocco è nella cache L1, esso deve essere anche nella cache L2 17 Ridurre Miss Penalty: Early Restart e Critical Word First • Non attendere l’intero blocco prima di far ricominciare la CPU • Early Restart & Critical Word First – Il trasferimento di un blocco prende tempo (bus troppo stretto) • Early restart – Quando la parola necessaria arriva, lasciare che il processore la usi – Quindi continuare il trasferimento del blocco per riempire la linea di cache – Località spaziale tende a volere la prossima parola in sequenza, così non è chiaro il beneficio nell’adottare solo early restart • Critical Word First – Trasferire la parola loaded prima, quindi il resto del blocco (con wrap-around per ottenere l’intero blocco) – Usarlo con early restart per far sì che il processore riprenda appena possibile 18 – Lunghi blocchi più popolari oggi Critical Word 1st largamente usata Ridurre Miss Penalty: priorità read/write • Per cache writeback/thru, le write ai livelli inferiori sono poste in un write buffer • Quando si ha un read miss, si deve cercare nel write buffer prima di controllare il livello inferiore • Quando si ha un write miss, se il buffer contiene blocchi modificati, gli indirizzi possono essere controllati per vedere se l’indirizzo del nuovo dato si accorda con quello di una entry valida del write buffer: in tal caso, il nuovo dato è combinato con quella entry • Le read sono più urgenti delle write (la probabilità di un’istruzione in attesa del risultato di una read è 100%, mentre la probabilità di un’istruzione in attesa del risultato di una write è molto più piccola) – quindi, le read hanno la precedenza a meno che il write buffer non sia pieno 19 Ridurre Miss Penalty: Victim Caches • Una cache direct-mapped soffre dai miss poiché pezzi multipli di dati corrispondono alla stessa locazione • Il processore spesso tenta di accedere a dati che ha recentemente scartato – tutti gli scarti sono posti in una piccola victim cache (4 o 8 entries) – la victim cache è controllata prima di andare ad L2 • Può essere vista come associatività addizionale per alcuni insiemi che tendono ad aver più conflitti • In generale, miss che abbiamo nella nostra cache set associativa ad N vie, ma che non avremmo avuto se la cache fosse stata fully associative 20 Ridurre Miss Penalty: Prefetching di istruzioni & dati • Prefetching si basa sull’avere extra bandwidth di memoria che può essere usata senza penalità • Prefetching di istruzioni – Tipicamente, la CPU estrae 2 blocchi ad ogni miss: il blocco richiesto ed il prossimo blocco consecutivo – Il blocco richiesto è posto nella cache di istruzioni, ed il blocco prefetched è posto nel buffer dello stream di istruzioni • Prefetching di dati – I dati prefetched sono posti in L2 21 Ridurre Hit Time: piccole e semplici cache • Selezionare una linea (index) e quindi confrontare i tag prende tempo Piccole cache possono aiutare poiché memorie più piccole • richiedono meno tempo per index – Per es., le cache L1 sono state della stessa dimensione per 3 generazioni di microprocessori AMD: K6, Athlon, ed Opteron – Anche una cache L2 abbastanza piccola da entrare su un chip con il processore evita la time penalty di andare off chip • Semplice direct mapping – Si può sovrapporre il controllo del tag con la trasmissione del dato poiché non c’è scelta da effettuare • Stime dei tempi di accesso: Access time (ns) 2.50 1-way 2.00 2-way 4-way 8-way 1.50 1.00 0.50 16 KB 32 KB 64 KB 128 KB Cache size 256 KB 512 KB 1 MB 22 Ridurre Hit Time: Way Prediction • Come combinare I piccoli hit time di cache Direct Mapped ed avere pochi conflict misses di cache set associative a 2 vie? • Way prediction: la predizione della via tiene dei bit extra nella cache per predire la “via” del prossimo accesso alla cache – Per la via selezionata, si comporta come una cache direct mapped (“Si può sovrapporre il controllo del tag con la trasmissione del dato poiché non c’è scelta da effettuare”) – Miss controlla gli altri blocchi nel prossimo ciclo di clock Hit Time Way-Miss Hit Time Miss Penalty • Accuratezza ≈ 85% • Inconveniente: per la pipeline è difficile se l’hit può prendere 1 o 2 cicli 23 Aumento di Bandwidth: Pipelining • Pipeline dell’accesso in cache per mantenere la bandwidth, ma latenza maggiore – Essenziale per cache L1 ad alta frequenza » Anche piccole cache hanno latenze di 2-3 cicli ad N GHz – Usata anche in molte cache L2 - penalità più alta in caso di branch mispredetti più cicli di clock tra l’emissione di un load e l’uso del dato 24 Aumento di Bandwidth: Non-Blocking • Idea: sovrapporre la latenza dei miss con lavoro utile – Detto anche “latency hiding” • Cache non-blocking – Una cache blocking serve un accesso alla volta » Mentre un miss è servito, altri accessi sono bloccati (wait) – Una cache non-blocking rimuove questa limitazione » Mentre un miss è servito, può trattare altre richieste • Hit Under Miss – Permette cache hit mentre un miss è in progresso – Ma un altro miss deve attendere • Miss Under Miss, Hit Under Multiple Misses – Permette hit e miss quando altri miss sono in progresso – Aumenta significativamente la complessità del controllore della cache poiché ci possono essere parecchi accessi in memoria in sospeso – Richiede banchi di memoria multipli 25