PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu den 3 Cachearten in der CPU


mittelding
2010-01-18, 16:43:09
Hallo!

Wir haben neulich kurz den vollassoziativen Cache, Direct mapped Cache und den n-Way Cache behandelt. Hab da aber noch einige Unklarheiten.
Hier gibts zwar auch ein Technologie und CPU-Board, aber ich denke, ich bin im Programmierboard gut aufgehoben.

Im Anhang seht ihr die 3 entsprechenden Bilder, auf die ich mich beziehe.
Die Caches bestehen ja alle 3 aus Adress- und Datenspeicher, aber es gibt doch ein paar Unterschiede.

Der vollassoziative Cache ist eigentlich klar, denke ich zumindest. Von der CPU kommt ein Request und es wird eine Adresse mitgeliefert, der Adresspeicher wird dann Zeile für Zeile nach der Adresse durchsucht und wenn ein Hit vorliegt, dann gibts die entsprechenden Daten zurück.
In dem Request sind auch noch 2 bit für die Wortanwahl und 2 bit für die Byteanwahl innerhalb des Worts enthalten, soweit sogut.

Beim DM-Cache ist das ähnlich, nur dass dort noch ein Index mitgeliefert wird.. man spart sich hier also die ganzen Adressvergleiche und kann direkt ansteuern. An Byte- und Wortanwahl hat sich nix geändert. Dieser Index ist im Beispiel 4 bit groß, damit lassen sich logischerweise 16 Zeilen ansteuern, wie es im Bild auch zu sehen ist.

Jetzt der n-Way Cache: Hier spricht der Index ja keine Zeilen, sondern Sätze an. 3 bit groß für 8 Sätze, das verstehe ich noch.

ABER: jetzt habe ich ja mehrere Zeilen innerhalb eines Satzes. Wie der Satz angewählt wird ist klar, dafür hab ich den Index. Aber wir kommt man auf die richtige Zeile innerhalb des Satzes? Oder läft das dann wieder so ab wie beim Assoz. Cache, dass man innerhalb des Satzes Zeile für Zeile durchgehen muss?

Was mir desweiteren noch unklar ist: es hieß, der Cache sei für die CPU unsichtbar (daher auch der Name), ihm sei egal ob er Daten aus dem Ram oder Cache bekommt. Warum liefert er im Request neben der Adresse aber auch den Index und die Anwahlbytes mit? Die sind ja spezifisch für den Cache und bringen im Ram nichts (Oder etwa doch? dann muss der Ram ja genauso organisiert und "breit" sein wie der Cache, richtig? sonst haut die Anwahl nicht hin).

Dann hab ich noch eine Pro/Kontraliste der 3 Arten, bei der ich auch einiges nicht verstehe.

Ein Nachteil des VA-Caches sei, dass man eine Verdrängungsstrategie bräuchte, wenn der Cache voll ist (was soll ersetzt werden).

Jetzt steht beim DM-Cache: "es ist kein Verdrängungsalgo. notwendig, weil die direkte Zuordnung keine alternativen zulässt." Hää? Der kann doch genauso voll laufen wie der VA auch, oder nicht?

Dann hätte ich noch ne Frage zu DM vs n-Way, aber das reicht hier fürs erste mal :)


Danke!

Trap
2010-01-18, 17:26:10
Es ist meiner Meinung nach einfacher es von der Speicheradresse als Bitstring anzugehen:

10100010101010
MMMMAAAARRRIII

Die Bezeichnungen hab ich mir grad so ausgesucht, M steht für Mapping, A für Assoziation, R für Rest und I für Index.

Indexbits gibt es so viele wie man für die Blockgröße des Caches braucht, bei 2^n Bytes Blockgröße eben n Indexbits (je größer die Blockgröße, desto weniger Verwaltungsoverhead, aber auch desto ungenauer wird der tatsächlich verwendete Speicher gecacht).

Mappingbits, Assoziationsbits geben dann die Organisation und Größe des Caches vor, alles was übrigbleibt sind die Restbits, die braucht man um entscheiden zu können ob man eine konkrete Adresse im Cache hat.

Die Mappingbits benutzt man direkt um einen Teil des Caches auszuwählen (die Zuordnung ist fest, Bitmuster 1010=>Cacheteil xy). Wenn man nur Mappingbits und keine Assoziationsbits hat, hat man einen direct-mapped Cache.

Die Assoziationsbits werden über alle im aktiven Teil des Caches gespeicherten Einträgen (genau: mit den Assoziationsbits der Cacheeinträge) verglichen um den korrekten Block auszuwählen. Ohne Mappingbits und mit Assoziationsbits hat man einen vollassoziativen Cachen.

Wenn man beide Arten von Bits hat, hat man einen 2^n-Way Cache wobei n die Anzahl der Assoziationsbits angibt. 64-Way also mit 6 Assoziationsbits.

Coda
2010-01-18, 17:54:19
ABER: jetzt habe ich ja mehrere Zeilen innerhalb eines Satzes. Wie der Satz angewählt wird ist klar, dafür hab ich den Index. Aber wir kommt man auf die richtige Zeile innerhalb des Satzes? Oder läft das dann wieder so ab wie beim Assoz. Cache, dass man innerhalb des Satzes Zeile für Zeile durchgehen muss?
Ja muss man. Die Cacheline mit dem richtigen Tag muss im Set gesucht werden.

Das ist ja auch der Grund warum man N-Way assoziative Caches baut: Man verringert diesen Suchaufwand und damit die Latenz.

Was mir desweiteren noch unklar ist: es hieß, der Cache sei für die CPU unsichtbar (daher auch der Name), ihm sei egal ob er Daten aus dem Ram oder Cache bekommt. Warum liefert er im Request neben der Adresse aber auch den Index und die Anwahlbytes mit? Die sind ja spezifisch für den Cache und bringen im Ram nichts (Oder etwa doch? dann muss der Ram ja genauso organisiert und "breit" sein wie der Cache, richtig? sonst haut die Anwahl nicht hin).
Ich verstehe deine deutsche Nomenklatur nicht, aber der Cache ist wirklich transparent. Alle Infos die er braucht bekommt er aus der Adresse (Tag, Set und Cacheline-Offset).

Jetzt steht beim DM-Cache: "es ist kein Verdrängungsalgo. notwendig, weil die direkte Zuordnung keine alternativen zulässt." Hää? Der kann doch genauso voll laufen wie der VA auch, oder nicht?
Bei einem Direct Mapped Cache kommt für jede Speicheradresse genau eine Cacheline in Frage. Da gibt's nicht viel an Verdrängungsstrategie zu haben. Entweder Hit (behalten) oder Miss (rausschmeißen und neu laden).

Gast
2010-01-20, 12:38:10
Was mir desweiteren noch unklar ist: es hieß, der Cache sei für die CPU unsichtbar (daher auch der Name), ihm sei egal ob er Daten aus dem Ram oder Cache bekommt. Warum liefert er im Request neben der Adresse aber auch den Index und die Anwahlbytes mit? Die sind ja spezifisch für den Cache und bringen im Ram nichts (Oder etwa doch? dann muss der Ram ja genauso organisiert und "breit" sein wie der Cache, richtig? sonst haut die Anwahl nicht hin).In jeder Cache-Zeile wird nicht ein Datenwort abgelegt, sondern mehrere. Dadurch wird der Cache schneller bei sequenziellen Speicherzugriffen (ein einziger Fetch stellt sicher, dass die nächsten x Zugriffe Hits sind) und die benötigte Logik schrumpft (weniger Vergleicher usw).
Da fast alle Architekturen ihre Speicher byteweise adressieren entspricht eine Cache-Zeile so zig Speicheradressen. Deshalb können die niedrigsten Bits in der Speicheradresse zur Wort- und Byte-Anwahl innerhalb der Cache-Zeile verwendet werden. Die CPU generiert also für Cache und Speicher die selbe Adresse und merkt nicht, woher die Antwort kommt -> der Cache ist transparent.

btw wird Cache nicht "Zeile für Zeile" durchsucht sondern die Tags aller Zeilen werden gleichzeitig verglichen (über parallele HW-Vergleicher). Deshalb ist es nicht möglich (bzw nicht praktikabel) große voll assoziative Caches zu bauen, da die Anzahl der Vergleicher und der Resolver-Logik die Größe auf dem Chip in die Höhe treiben.

den Rest der Fragen hat Coda glaub ich schon sehr gut erläutert.

mfg,
zgep