Ich möchte verstehen, wie das folgende Programm in Bezug auf die Aktualisierung des Hauptspeichers funktioniert.
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;
}
Ich habe einen Adressbus von 16 Bit, Hauptspeicher in Bytes, Cache-Speichergröße von 512 2-Wege-Satzassoziativ, Blockgröße von 16 Byte und die CPU kann nur Informationen aus dem Cache-Speicher lesen.
Was passiert, wenn wir die Write-Write-Richtlinie verwenden? und was ist, wenn wir Write-Write-Write-Policy verwenden?
Antworten:
0 für die Antwort № 1Ich nehme an
Cache-Speichergröße von 512
was meinen Sie 512 byte
.
Und nehmen wir an, der Cache ist leer und enthält nichts, das zugeordnet ist a[]
oder b[]
Region.
Wenn Ihr Code mit Rückschreiben ausgeführt wird, wird die erste Schleife vollständig im Cache übersehen. Die dritte Schleife holt sich danach 16 Byte a[i]
und b[i]
Wenn ein Fehler auftritt, fahren Sie fort, bis der nächste Block erreicht ist (1 Fehler in 8 Iterationen).
Bei der Schreibzuweisung haben die ersten beiden alle 8 Iterationen einen Fehlschlag, und die dritte Schleife ist ein Treffer.
In diesem Fall, a[]
und b[]
sind im gleichen Satz, also ist es gut für den "2-Wege-Assoziativ" -Teil. Wenn Sie jedoch mehr als 4 Arrays der Größe angeben short[256]
Du wirst Konflikte haben.
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;
}