vorrei capire come funziona il seguente programma in termini di aggiornamento della memoria principale.
int main() {
short a[256], b[256];
register i;
for (i=0 ; i < 256 ; i++)
a[i] = i;
for (i=0 ; i < 256 ; i++)
b[i] = 255 - i;
for (i=0 ; i < 256 ; i++)
b[i] = b[i] - a[i];
return 0;
}
Ho un bus di indirizzo di 16 bit, memoria principale organizzata in byte, dimensione della memoria cache di 512 set associativo a 2 vie, dimensione del blocco di 16 byte e la CPU può solo leggere informazioni dalla memoria cache.
cosa succede quando utilizziamo la politica di scrittura senza scrittura e cosa succede quando usiamo la funzione Write back write allocate policy?
risposte:
0 per risposta № 1Presumo da
dimensione della memoria cache di 512
intendi 512 byte
.
E supponiamo che la cache sia vuota e non contenga nulla a cui è mappata a[]
o b[]
regione.
Se il tuo codice viene eseguito con write back, il primo ciclo verrà completamente perso nella cache. Il terzo loop recupererà dopo 16 byte a[i]
e b[i]
quando si verifica un errore e continua a colpire fino al raggiungimento del blocco successivo (1 errore in 8 iterazioni).
Con write-allocate, i primi due avranno un errore ogni 8 iterazioni, e il terzo loop è completamente colpito.
In questo caso, a[]
e b[]
sono nello stesso set, quindi va bene per la parte "associativa a 2 vie". Ma se dichiari più di 4 matrici di dimensioni short[256]
, avrai un conflitto.
int main() {
short a[256], b[256], c[256], d[256], e[256];
register i;
for (i=0 ; i < 256 ; i++)
a[i] = i;// a in set0
for (i=0 ; i < 256 ; i++)
c[i] = 255 - i; //c in set 1
for (i=0 ; i < 256 ; i++)
e[i] = c[i] - a[i]; // e/c/a evacuates each other
return 0;
}