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.
Blatt 5 Aufgabe 7
Ist bei der Aufgabenstellung in der Größe jedes Blockes auch noch die Adresse mit einbezogen?
Also das für die Tag+Valid Speicherung schon fast 4 Byte draufgehen und wir nur noch 4Byte speichern könnnen oder sind die 8Bytes auf reinen Datenspeicher bezogen?
Die 8 Byte beziehen sich auf die Groeße der Nutzdaten.
Kann man davon ausgehen, dass die letzten 4 Bit der Adresse die Byteadresse und das 5. Bit von rechts für den Index (also die Menge) steht?
Und sollen wirklich pro Lesevorgang nur 4 Byte in den Cache geschrieben werden, obwohl ein Block 8 Byte groß ist?
Die Aufteilung der Adresse ist ja abhaengig von der Organisationsform und den Eigenschaften des Caches. Die Byteadresse muss so viele Bits umfassen, dass jedes einzelne Byte eines Blockes adressiert werden kann. Die Groeße ist also (nur) abhaengig von der gewaehlten Blockgroeße. Der Index-Anteil der Adresse bei einem n-fach assoziativen Cache ist so groß, dass eine der vorhandenen Mengen gewaehlt wird, da ja bei dieser Organisationsform die Menge eines Blockes eindeutig durch dessen Adresse gegeben ist (wohingegen eine der Cache-Lines innerhalb der eindeutigen Menge frei gewaehlt werden kann). Die Index-Groeße laesst sich hier also aus der Anzahl der Mengen ableiten.
Nein. Die CPU verlangt jeweils 4 Byte pro Zugriff, allerdings werden immer nur ganze Bloecke in den Cache geladen bzw. wieder aus diesem verdraengt. Die Groeßen-Angabe von 4 Bytes bezieht sich hier also nur auf die von der CPU verlangten Daten. Theoretisch kann es passieren, dass mehrere Bloecke dafuer in den Cache geladen werden muessen, durch Alignment der Daten kann dieses Problem jedoch reduziert werden.
Das heißt also, dass z.B. “57 41 56 41 55 41 54 41” in den Cache geschrieben wird, wenn das Programm die 4 Byte der Adresse “0x00 cd 10 70” einliest?
Es sind ja 8 Adressen gegeben, von denen eingelesen wird. D.h. es werden 8x8 Byte eingelesen, oder?
Ja, in diesem Fall wird genau der Block in den Cache geladen. Es kann aber natuerlich sein, dass bei einem Zugriff kein Block mehr aus dem Speicher in den Cache kopiert werden muss, naemlich genau dann, wenn das entsprechende Datum bereits im Cache vorliegt. Kann also durchaus sein, dass hier nicht bei jedem Zugriff ein Block auch geladen werden muss (genau das will man bei einem Cache ja auch haben: bei einem Zugriff auf ein Datum befindet es sich bereits im Cache, sodass nicht der lange Weg ueber den Hauptspeicher genommen werden muss).
und wie wird dann auf die anderen 8 Byte in dieser Zeile zugegriffen? (Also 89 55 53 fd 89 48 48 f3)
Naja, indem halt auf ein Datum zugegriffen wird, dessen Adresse in diesem Block liegt.
Laut Aufgabenstellung umfasst ja jeder Block 8 Byte, d.h. der Hauptspeicher wird in jeweils 8 Byte große Bloecke unterteilt, die jeweils unabhaengig voneinander im Cache liegen koennen (jedoch befinden sich entweder alle Bytes eine Blocks im Cache oder gar keines, d.h. ein Block ist die Einheit, mit der der Cache arbeitet und die vom Cache als Ganzes verwaltet wird). Ein Block befindet sich (zumindest bei uns) nur dann im Cache, wenn auf ihn bereits zugegriffen wurde, d.h. ein Block wird in den Cache geladen, sobald das erste Mal auf ein Byte innerhalb dieses Blocks zugegriffen wird. Allerdings kann es natuerlich passieren, dass ein Block wieder aus dem Cache verdraengt wird, falls fuer einen neu angeforderten Block kein Platz mehr im Cache vorhanden ist.
Beispiel, um das alles vielleicht etwas zu verdeutlichen: Angenommen, an Adresse 0x 00 cd 10 7a liegt ein einzelnes Byte x, welches die CPU lesen moechte (in diesem Fall hat x den Wert 0x53). Dazu wird diese Adresse aufgeteilt in Tag, Index und Byteadresse. Dabei gibt die Byteadresse den Offset innerhalb des Blocks zu dem Byte von x an (in diesem Fall also ein Offset von 2, da es sich um das dritte Byte in dem entsprechenden Block handelt). Der Index gibt bei einem n-fach assoziativen Cache an, in welcher Menge sich der Block befinden muss, falls er im Cache ist (welche Menge das hier ist, verschweige ich an dieser Stelle, weil das Teil der Aufgabe ist). Der Tag schließlich wird zur Identifizierung verwendet, da die Abbildung von Hauptspeicher zu Cache nicht surjektiv (rechtseindeutig) ist, d.h. eine Cache-Zeile viele verschiedene Bloecke aus dem Hauptspeicher beinhalten kann, man also eine Moeglichkeit braucht, herauszufinden, welcher der moeglichen Bloecke nun tatsaechlich in einer Cache-Zeile ist.
Wenn die Adresse aufgeteilt ist, werden innerhalb der betreffenden Menge (diese ist durch Adresse ja eindeutig bestimmt) die abgespeicherten Tags aller Cache-Zeilen mit dem Tag der angeforderten Adresse verglichen. Falls eine Uebereinstummung gefunden wird (und weitere Bedingungen erfuellt sind, wie beispielsweise ein gesetztes Valid-Bit), handelt es sich um einen Cache-Hit und das Datum x kann aus der Cache-Zeile gelesen werden. Andernfalls befindet sich der Block, in dem sich x befindet, offensichtlich nicht im Cache und es kommt zum sog. Cache-Miss. In diesem Fall wird der Block aus dem Hauptspeicher in den Cache geladen (dabei wird u.U. ein anderer Block verdraengt), bevor x gelesen werden kann.
ich hatte irgendwie nicht verstanden, dass z.B. die Adresse, die mit ‚58‘ aufhört, auf die letzten 8 Byte in der Zeile mit der Adresse ‚0x00 cd 10 50‘ zeigt. Das war ein dummer Fehler, aber das hab ich jetzt verstanden
wir haben ja einen 4-fach-assoziativen cache, d.h. wir haben nur 2 mengen. wie regele ich denn dan den zugriff auf die einzelnen 4 blöcke in jeder menge? reicht das, wenn ich das nur durch den offset regele, wenn ich genug bits dafür spendiere?
Ich bin mir jetzt nicht ganz sicher, ob ich deine Frage richtig verstanden habe…
Innerhalb einer Menge ist die Position eines Blocks ja beliebig, d.h. die Menge ist zwar fuer jeden Block eindeutig durch seine Adresse bestimmt, innerhalb der Menge kann ein Block aber an jeder beliebigen Stelle stehen (deswegen muessen bei einem Zugriff auch alle Zeilen einer Menge durchsucht werden).
Wie sich die Adresse aufteilt, habe ich oben schon beschrieben
Was willst du da regeln? Es ist doch völlig egal wo etwas in einer Menge steht (deshalb assoziativ). Deswegen gibt es ja die Komparatoren, die den Tag vergleichen. Wenn du auf ein Byte mit der Adresse 0x…0a zugreifen willst, dann ist klar, dass es in Menge 2 steht (wenn überhaupt schon im Cache), da 10 in binär gleich 1010, somit Index: 1 und Byte-Adr.: 010. Die Frage bleibt nur noch ob der Tag in der Menge vorhanden ist und das wird mit Hilfe der Komparatoren herausgefunden.
oha, da hab ich das die ganze zeit komplett falsch verstanden
Vielen vielen Dank für die Hilfe, ich hab’s jetzt gecheckt!
Gern