Kann in den Cache zweimal dieselbe Addresse geladen werden?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Kann in den Cache zweimal dieselbe Addresse geladen werden?
Angenommen man hat die ließt die 0x00 cd 10 54 und 0x00 cd 10 50 ein und stellt fest, sie zeigen auf denselben Block an Daten. Wird dann immer der Datensatz zweimal in den Cache geladen, selbst wenn er bereits schon einmal im Cache existiert?
Dieser Fall ist einmal in der Klausur vom 2.2.15 aufgetreten. Im StuvePad zur Aufgabe zählt man höchstens 7 Addressen, obwohl in der Aufgabe 8 zu lesende aufgeführt werden.


Hab jetzt keine Lust das zu suchen, aber als Denkanstoß:

Egal welche Adresse du ließt, es wird auf den Beginn der Cacheline “abgerundet”. Passen also 8 Byte in eine Cacheline, setzt du die letzten 3 Bit generell auf 0, um den Start von dem zu finden, was in die Cacheline geladen wird.

Immer wenn du irgendetwas aus dem Cache ließt, wird geprüft, ob es schon drin ist. Dabei spielt es keine Rolle, wegen welchem Adresszugriff die Cacheline ursprünglich geladen wurde.

Bzgl. höchstens 7 Adressen: Denke daran, dass der Cache irgendwann voll ist, oder schon vorher durch die Assoziativität ggf. eine Cacheline verdrängt werden muss.

Hilft das? Sonst wäre der Link zum Pad und die Aufgabennummer hilfreich.

1 „Gefällt mir“

Ich deute das zu: Wurde Addresse bereits geladen - (aktuell werden die entsprechenden Daten gecached)?
Fall nein: Daten werden in den Cache übernommen, eventuell etwas verdrängt.
Fall ja: Cache bleibt unverändert.

Wenn das passt, hat sich die Frage erledigt. Ansonsten: Vielen Dank für deine Antwort, sehr hilfreich!!


Ich mag deine Formulierung mit “wurde Adresse geladen” nicht so ganz, weil eben nicht nur eine Adresse geladen wird. Aber ich glaube du hast es verstanden :slight_smile:

1 „Gefällt mir“

Wie würdest du stattdessen formulieren? Addresse gelesen/eingelesen, Daten geladen?
Ich denke ich habe es auch verstanden, denn soviele Möglichkeiten, was passieren kann, gibt es ja nicht.

Aber eine Frage: Es wird ja geprüft, ob schon einmal eine Addresse in den Cache geladen wurde. Wer kann das alles machen? Ich kann mir vorstellen, dass das von Software Seite aus passiert oder von der Hardware Seite, von der Hardware fällt mir spontan nur der TLB ein, gäbe es da theoretisch auch noch andere Möglichkeiten?


Die Software ist nicht daran beteiligt, zu prüfen, ob die Cachezeile bereits geladen wurde, oder nicht. Das funktioniert ausschließlich in Hardware. Nur unter bestimmten Umständen wird die Software explizit Cachezeilen invalidieren oder den Cache gar ausschalten.

Der TLB ist ein Cache für ein anderes Problem. Es kann Prozessoren mit “normalem” Cache, aber ohne TLB geben. Und es kann Prozessoren mit TLB, aber ohne “normalen” Cache geben. Im TLB werden Einträge aus den Seitentabellen für die MMU zwischengespeichert.


Ich glaube „Daten geladen“. Man läd einen Datenblock „rund um“ eine Adresse(*), nicht direkt die Adresse selbst(**).

(*) Der Datenblock beginnt bei der Adresse BeginnAdresse = GeleseneAdresse % CachelineGrößeInBytes und hat die Größe einer Cacheline.

(**) Die Adresse des gesamten Datenblocks (entspricht dem ersten Byte der Cacheline) muss teilweise doch im Cache gespeichert werden, denn sonst kann später nicht geprüft werden, ob ein Datensatz schon in den Cache geladen wurde.
Bsp.: Ich nehme zur Vereinfachung mal einen einstufigen, vollassoziativen Cache an. Ist der Cache 8 Byte groß, sind die BeginnAdressen immer mindestens um den Wert 8 unterschiedlich. Dementsprechend sind die letzten 3 Bit irrelevant, weil die Daten aller Adressen, bei denen die ersten N-3 Bits übereinstimmen, in dieser Cacheline vorhanden sind.
Wie schon beschrieben passiert das in der Hardware. Die CPU gibt die zu ladende Adresse (und genau genommen auch die Wortgröße) ans Speichersystem. Dort werden die ersten N-3 Bits mit den BeginnAdressen aller Cachelines verglichen. (Wenn jede Cacheline ihre eigene Bitvergleich-Schaltung hat, geht das alles gleichzeitig.)
→ Gibt es einen Treffer, werden die die letzten 3 Bit der Adresse dazu verwendet, das Byte in der Cacheline zu adressieren.
→ Gibt es keinen Treffer, wird die BeginnAdresse der Cacheline berechnet und diese aus dem Hauptspeicher geladen.

Zur Übung kannst du ja mal drüber nachdenken, welche Bits und wie viele Comparatoren du dir bei weniger assoziativen Caches einsparen kannst. Das hängt dann auch von der Gesamtgröße des Caches ab.

1 „Gefällt mir“