Autor Thema: CPU-Cache  (Gelesen 3892 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 24. February 2010, 17:59 »
Nabend zusammen,

ich habe mal eine Frage zu den Level-Caches der x86-Architektur.
Es gibt ja verschiedene Arten von Caches.
Einmal die Art von Cache, die virtuelle Adressen speichern und dann einmal die, die die physikalischen Adressen speichern.
Was wird bei der x86-Architektur benutzt?
Das müsste an sich die physikalischen Adressen sein, da es ansonsten zu unnötigen Cache-Misses kommen würde, wenn auf einem Dual-Core zwei Prozesse auf gleichen virtuellen Adressen aber auf unterschiedlichen physikalischen Adressen arbeiten, oder?

Gruß,
rizor
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. February 2010, 18:57 »
Hi,

meinst du die L1-/L2-/L3-Caches? Deren Aufgabe ist es ja nicht Adressen zu cachen, sondern Daten, die dieser Adresse zugeordnet sind.

Ich würde mich allerdings deiner Vermutung anschließen, dass dies auf Grundlage der physischen Adressen geschieht. Das Blockdiagramm im Wikipedia-Artikel zum 486er scheint das zu bestätigen.
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. February 2010, 19:20 »
Genau die meinte ich. Danke.
Naja, da müssen ja trotzdem Adressen zu den Daten gespeichert werden.
Muss ja wieder zugeordnet werden ;)
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. February 2010, 22:53 »
Hallo,


die L1-Caches werden manchmal doppelt getagt, soll heißen das virtuelle und physische Adressen als Tag gespeichert werden (ich glaube AMD hat das bei den Athlons angefangen). Damit wird der L1-Cache mit der virtuellen Adresse durchsuchbar und man spart sich das umsetzen per MMU. L2, und alles dahinter, hat normalerweise so lange Latenzen (oft über 10 Takte) das die MMU-Umsetzung auch schon gelaufen sein kann ohne zusätzlich Performance zu kosten (schließlich wurde der L1-Cache bereits durchsucht bevor der L2 überhaupt angesprochen wird), ich wüste nicht das schon mal L2-Cache virtuell getagt wurde, das würde einfach nur Transistoren kosten ohne Performance zu bringen. Die virtuellen Tags müssen natürlich bei einem Kontextwechsel gelöscht werden. Ob der Cache z.B. in der Lage ist zu einer vorhandenen Cache-Line die nur physisch getagt ist die von der MMU ermittelte virtuelle Adresse einfach dazu zu packen ohne an den Daten zu spielen (Write-Back und erneutes Einlesen) weiß ich nicht. Das währe interessant wenn 2 Prozesse gemeinsamen Speicher haben der natürlich immer an der selben physischen Adresse liegt aber an verschieden virtuellen Adressen eingeblendet wird und zufällig eben direkt von dem einen zum anderen Prozess umgeschaltet wird. Manche Soft-CPUs verwenden auch nur virtuelle Tags und haben die MMU hinter dem Cache, das bedeutet aber das der Cache bei einem Kontextwechsel immer invalidiert werden muss und das funktioniert nur beim Code-Cache vernünftig, dort gibt es ja keine modifizierten Cache-Lines.
Ob die Intel-CPUs virtuelle Adressen als L1-Cache-Tag benutzen weiß ich nicht, das stelle ich mir im Zusammenspiel mit Hyper-Threading kompliziert vor, schließlich müsste man dann ja zu jedem virtuellem Tag auch speichern zu welchen CPU-Thread (also zu welchem Kontext) das Tag gehört. Trotzdem sollte das lösbar sein.
Ich bin mir nicht sicher aber bei den dicken PowerPC-CPUs von IBM kann der L1-Cache in kleine Bereiche zerteilt werden um diese den einzelnen CPU-Threads pro Kern (beim Power7 sind es 4) direkt zuzuordnen, damit währe dann klar für welchen Kontext ein virtuelles Tag gültig ist, wobei ich nicht weiß ob die PowerPC-CPUs überhaupt virtuelle Cache-Tags beherrschen.

Fazit: virtuelle Cache-Tags werden benutzt aber nur sehr selten (ist eben etwas knifflig). Typischerweise werden Caches physisch getagt.


Grüße
Erik
« Letzte Änderung: 25. February 2010, 22:59 von erik.vikinger »
Reality is that which, when you stop believing in it, doesn't go away.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. February 2010, 18:40 »
Danke für die Aufklärung.
Das macht vieles leichter.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen