Esempio MIPS 32 bit - High Performance Computing...

Post on 18-Feb-2019

217 views 0 download

Transcript of Esempio MIPS 32 bit - High Performance Computing...

Esempio MIPS 32 bit• Indirizzo su 32 byte • Cache ad accessi diretto • Dimensioni della cache 2n blocchi, di cui n bit usati per

l’indice • dimensione del blocco di cache 2m parole ossia 2m+2

byte • In questo caso la dimensione del tag è data da 32 – (n

+ m + 2) • Numero totale bit nella cache:

2n x (dim. blocco + dim. tag + valid bit) • Per convenzione si considera solo la dimensione del

blocco.

4KB Cache

Esercizio• Si consideri una cache con 64 blocchi di 16 byte ciascuno.

A quale numero di blocco corrisponde l’indirizzo 1200

espresso in byte?

• Blocco identificato da:

(indirizzo blocco) modulo (numero blocchi in cache)

(indirizzo blocco) = (indirizzo dato in byte) / (byte per blocco)

• Quindi l’indirizzo del blocco è 1200/16 = 75

• Blocco contente il dato è 75 modulo 64 = 11

Dimensione del blocco• Dimensioni di linea di cache molto grandi esaltano la

località spaziale e da questo punto di vista diminuiscono le

probabilità di miss

• Tuttavia avere pochi blocchi diminuisce l’efficacia nello

sfruttamento della località temporale

• Inoltre avere dei miss con blocchi grandi porta a un costo di

gestione alto (bisogna spostare molti byte)

• Quindi abbiamo un tradeoff

Tradeoff

Gestione delle miss• La Parte di Controllo deve rilevare le miss e portare in

cache i dati contenuti nella memoria indirizzata

• Hit in lettura (conseguenza di i-fetch e load) • accesso alla memoria con il massimo della velocità

• Miss in lettura (conseguenza di i-fetch e load) • La Parte di Controllo mette in stallo la CPU (cicli di attesa,

con registri interni immutati), finché la lettura del blocco (dalla memoria in cache) viene completata • Instruction cache miss: si ripete il fetch dell’istruzione • Data cache miss: si completa l’accesso al dato

dell’istruzione (load)

Gestione delle miss• Hit in scrittura (solo conseguenza di store)

• write-through: scrive sulla cache e in memoria (con buffer di scrittura)

• write-back: scrive solo sulla cache, e segnala che il blocco è stato modificato (setting del bit di Dirty)

• Miss in scrittura (solo conseguenza di store) • con politica write-back, stallo della CPU (cicli di attesa),

lettura del blocco dalla memoria in cache (write allocate), completamento dell’istruzione di store in cache

• con politica write-through, solitamente non si ricopia il blocco in cache prima di effettuare la scrittura (no write allocate) che avviene in memoria

Esempio FastMATH Intrinsity

• Split cache • 256 blocchi • 16 word per blocco • write-through e write-

back • I miss rate: 0.4 % • D miss rate: 11.4 % • Total miss rate: 3.2 %

Prestazioni delle cache• Tempo di CPU: somma di

• (Cicli di esecuzione CPU) x (periodo di clock) • (Cicli di stallo causati dalla memoria) x (periodo di

clock) • Costo di hit trascurabile • Cicli di stallo in memoria causati da cache miss

(semplificazione); somma di: • cicli di stallo in lettura • cicli di stallo in scrittura

Prestazioni delle cache• Cicli di stallo in lettura:

(# letture/programma) x (frequenza miss in lettura) x

(penalità miss in lettura) • Cicli di stallo in scrittura (write-through):

(# scritture/programma) x (frequenza miss in scrittura) x (penalità miss in scrittura) +

# stalli buffer di scrittura • Gli stalli del buffer in scrittura avvengono quando è pieno, ma

se è abbastanza profondo, hanno un costo trascurabile. • Nel write-back dobbiamo includere anche il costo di scrivere il

blocco di cache nella memoria principale

Prestazioni delle cache• Nelle cache write-through spesso si ha:

(penalità miss in lettura) = (penalità miss in scrittura) • Pari al tempo necessario per prelevare un blocco dalla

memoria principale • Cicli di stallo in scrittura:

(# accessi memoria/programma) x (frequenza miss) x (penalità miss)

= (istruzioni/programma) x (miss/istruzioni) x (penalità miss)

Esercizio• Cache istruzioni con 2% di frequenza di miss • Cache dati con 4% di frequenza di miss • Processore con 2 CPI in assenza di stalli di memoria • Penalità di miss di 100 cicli di clock • Istruzioni LOAD e STORE pari al 36% delle istruzioni I dei

programmi

• Quando sarebbe più veloce il processore se dotato di una cache perfetta ideale che non provochi mai miss?

• Cicli di miss per istruzioni = I x 2% x 100 • Cicli di miss per dati = I x 36% x 4% x 100

Esercizio• Cicli di miss per istruzioni = 2.00 x I • Cicli di miss per dati = 1.44 x I

• CPImiss = 3.44 x I • CPInormale = 2 x I • CPIstallo = 5.44 x I

TCPUstallo/TCPUideale = CPIstallo / CPInormale =

5.44 / 2 = 2.72

Cache Full Associative• Le cache ad accesso diretto sono piuttosto semplici da realizzare

• Tuttavia hanno un problema: se ho spesso bisogno di locazioni di memoria che si mappano sullo stesso blocco, ho cache miss in continuazione

• All’estremo opposto ho una cache completamente associativa • Posso mappare qualsiasi blocco in qualsiasi blocco di cache

• Il problema per le cache full associave è che devo cercare ovunque il dato (il tag è tutto l’indirizzo del blocco)

• Per effettuare la ricerca in maniera efficiente, devo farla su tutti i blocchi in parallelo

• Per questo motivo ho bisogno di n comparatori (uno per ogni blocco di cache che operino in parallelo)

• Il costo hardware è così alto che si può fare solo per piccole cache

Cache Set Associative• Le cache set associative sono un via di mezzo tra

l’accesso diretto e la completamente associativa • In pratica ogni blocco può essere mappato su n > 1

blocchi diversi (vie) • Quindi combiniamo due idee

1. associamo ciascun blocco a una linea (una degli n blocchi su cui possiamo mappare il blocco)

2. All’interno della linea effettuiamo una ricerca parallela come se avessimo una cache completamente associativa

Mappatura del blocco• In una cache ad accesso diretto il blocco viene mappato

nel blocco dato da: tag blocco = (indirizzo blocco) modulo (numero di blocchi)

• In una cache set associative la linea che contiene il blocco viene individuata da:

tag linea = (indirizzo blocco) modulo (numero di linee) • Per trovare il blocco all’interno della linea dobbiamo

confrontare il tag con tutti i tag dei blocchi della linea

Esempio

• Mappatura diretta: tag blocco = 12 modulo 8 = 4, il blocco 12 è in posizione 4 • Mappatura associativa a 2 vie: tag linea = 12 modulo 4 = 0, il blocco 12 è in

posizione 0 o 1 • Mappatura completamente associativa: il blocco 12 è in posizione 0, 1, 2, …, 11

Configurazioni per cache a 8 blocchi

Confronto: cache ad accesso diretto• Cache a 4 blocchi • Determinare il numero di miss per gli indirizzi: 0, 8, 0, 6, 8

• 5 miss per 5 accessi

Confronto: cache associativa a 2 vie

• 4 miss per 5 accessi

• Cache a 4 blocchi • Determinare il numero di miss per gli indirizzi: 0, 8, 0, 6, 8

• Rimpiazzamento del blocco usato meno di recente:

Confronto: cache full associative

• 3 miss per 5 accessi

• Cache a 4 blocchi • Determinare il numero di miss per gli indirizzi: 0, 8, 0, 6, 8

• Aumentando l’associatività: • Vantaggi: minor frequenza di miss • Svantaggi: complessità

• La scelta dipende da questo tradeoff

Vantaggi dell’associatività

Esempio cache a 4 vie

Sostituzione blocchi• Nelle cache ad accesso diretto quando ho una cache

miss sicuramente so chi sostituire (l’unico blocco in cui posso mapparmi)

• Nelle cache associative ho più scelte. Se la linea è piena chi sostituisco?

• Politiche di rimpiazzamento (eviction policies) • First In First Out (FIFO) • Least Recently Used (LRU)

Impatto delle gerarchie di memoria