Welche Informationen genau speichert ein Anweisungs-Cache?

Geben Sie hier die Bildbeschreibung ein

Prozessoren verwenden sowohl Daten- als auch Befehls-Caches, um die Anzahl langsamer Zugriffe auf den Hauptspeicher zu reduzieren. Obwohl mir klar ist, dass der Zweck des Datencaches darin besteht, häufig verwendete Datenelemente (z. B. Elemente in einem Array oder innerhalb einer Schleife) zu speichern, kann ich nicht sehen, was genau der Befehlscache speichert, um die Speicherzugriffszeiten zu verkürzen.

In der obigen Abbildung haben wir ein Beispiel für einen „addi“-Befehl, der einen konstanten Wert zu dem im Mehrzweckregister „r2“ gespeicherten Wert addiert und das Ergebnis in das Mehrzweckregister „r1“ schreibt.

Was genau wird nach Ausführung dieser Anweisung im Cache gespeichert?

  • Es kann nicht nur der Opcode sein – die meisten CPU-Befehlssätze enthalten nur ein paar hundert eindeutige Opcodes oder weniger. Wenn der Befehls-Cache also mit allen möglichen Opcodes vorgeladen wäre, hätte er immer eine Trefferquote von 100 %. Dies würde jedoch den Zweck eines Caches zunichte machen, und ich habe gelesen, dass Befehls-Cache-Fehlschläge sehr wohl möglich sind.
  • Es können nicht die Werte aus dem Hauptspeicher sein, die in die Mehrzweckregister geladen werden, da der Datencache genau dafür da ist.

Vielen Dank im Voraus.

Warum ist es Ihrer Meinung nach für den Cache wichtig, ob eine bestimmte Anweisung ausgeführt wurde oder nicht? Anweisungen ändern sich normalerweise nicht zur Laufzeit.

Antworten (3)

Es speichert buchstäblich Maschinencodezeilen aus dem Programmspeicher (auch bekannt als die gesamte Anweisung, die Sie in Ihrem ursprünglichen Post schreiben.

Die Tatsache, dass Sie sogar das "Speichern aller möglichen Opcodes im Cache" diskutieren, weist auf ein tieferes Missverständnis hin. Es hat keine Bedeutung, über das Speichern aller möglichen Operationscodes im Cache (oder einem anderen Speicher) zu sprechen. Alle möglichen Opcodes, die der Prozessor ausführen kann, sind in der Logikschaltung des Prozessors fest verdrahtet. Sie werden nirgendwo "gespeichert".

Wie ich sehe, hatte ich fälschlicherweise den Eindruck, dass die Anweisungen im Programmspeicher, auf die der Programmzähler zeigt, sofort für die CPU verfügbar waren, dh dass die gesamten Anweisungen irgendwie "fest verdrahtet" waren. Danke, dass Sie die Dinge für mich geklärt haben.
Beachten Sie, dass dies nur für die meisten CPUs gilt. Neuere Intel x86s speichern decodierte Mikrooperationen (d. h. die Ausgabe einer frühen Phase des Ausführungsprozesses), und ich denke, AMD hat möglicherweise auch auf einen Micro-Op-Cache statt auf einen strikten Befehls-Cache umgestellt.
@MartinX Wenn Sie sagen "die gesamten Anweisungen waren irgendwie fest verdrahtet", meinen Sie damit, dass Sie dachten, dass so etwas wie "ADD, Reg1, Reg2" fest verdrahtet war? Und dann war so etwas wie "ADD, Reg2, Reg3" eine separate Festverdrahtung? Denn dem ist nicht so. Nicht jede mögliche Kombination aus Opcode und Argument hat eine einzigartige Schaltung, die fest mit der CPU verbunden ist.
@Mark: Intel P4 hatte einen Trace-Cache anstelle eines L1i-Cache. Dies funktionierte schlecht und war ein großer Engpass (weil es mit seinen schwachen Decodern langsam war, Spuren bei Fehlschlägen zu erstellen). Intel seit Sandybridge ( realworldtech.com/sandy-bridge ) und AMD seit Zen haben immer noch reguläre L1i-Caches, die x86-Maschinencode-Bytes zwischenspeichern, aber auch kleinere, sehr schnell decodierte uop-Caches. Sie haben immer noch leistungsstarke Decoder für einen guten Durchsatz bei uop-Cache-Fehlschlägen, und es ist kein Trace-Cache. (Eine uop-Cache-Zeile kann nur zusammenhängende uops von einem 32-B-Block zwischenspeichern, anstatt Sprüngen zu folgen.)
@PeterCordes Sind diese Micro-Op-Caches tatsächlich Caches? Oder sind sie eher wie eng gekoppelte Erinnerungen?
@Mark: Einige ältere AMD-CPUs speichern neben dem L1i-Cache zusätzliche Metadaten: Sie markieren Befehlsgrenzen im Cache, um die Dekodierung zu beschleunigen. Siehe Microarch pdf von Agner Fog . Auch David Kanter erwähnt die Metadaten vor der Dekodierung in realworldtech.com/bulldozer/4 . Mehr Infos dazu in seinem K10-Beitrag: realworldtech.com/barcelona/4
@Toor: Intel nennt seinen decodierten uop-Cache den "Decode Stream Buffer (DSB)", einschließlich der Ereignisnamen des HW-Leistungszählers. Physisch ist es sehr stark als assoziativer Cache aufgebaut, wobei jeder "Weg" eines Satzes bis zu 6 uops enthält. Es wird durch virtuelle Adresse indiziert und gekennzeichnet (so dass es TLB-Lookups umgeht). Natürlich sind Caches aus "eng gekoppelten" SRAM-Arrays aufgebaut, aber was sie zu Caches macht , ist das Verwaltungssystem und der Such-/Indizierungsmechanismus.
Die Abrufstufe benötigt einen Zyklus, um vom Abrufen vom DSB zum Legacy-Decodieren (MITE) oder umgekehrt umzuschalten. Es ist also nicht nur eine zusätzliche Ebene derselben Hierarchie wie L1i / L2 / L3. Aber wenn Sie es als Teil dieser Hierarchie betrachten möchten, wird es manchmal L0 genannt. Im uop-Cache fehlend kann nicht einfach versuchen, die gleichen Daten von woanders abzurufen, es muss zum Dekodieren von x86-Maschinencode wechseln (um direkt ausgeführt zu werden und neue Zeilen im uop-Cache zu füllen). Im Gegensatz zu Pentium 4, das einen Trace erstellen musste, bevor es ausgeführt werden konnte, was Trace-Cache-Fehlschläge sehr teuer machte.

Der Anweisungs-Cache speichert die zuletzt verwendeten Anweisungen und ihre Adressen, sodass eine Anweisung, wenn sie wiederholt werden muss, nicht aus dem Hauptspeicher abgerufen werden muss – dies geht viel schneller.

Wenn beispielsweise eine Schleife zum ersten Mal ausgeführt wird, werden die Anweisungen aus dem Hauptspeicher abgerufen und gleichzeitig in den Cache gestellt. Bei nachfolgenden Iterationen der Schleife können die Befehle dann schnell aus dem schnellen Cache-Speicher abgerufen werden.

Die Adressen werden im Cache zusammen mit Informationen gespeichert, die angeben, ob der Cache auf dem neuesten Stand ist, sodass die CPU-Steuerung weiß, ob sie die zwischengespeicherten Anweisungen verwenden kann oder zum Hauptspeicher gehen muss.

Gute Antwort. Es sollte betont werden, dass die Anweisungen im Cache abgelegt werden, wenn sie aus dem Speicher abgerufen werden (und zwar bevor sie ausgeführt werden), um das mögliche Missverständnis des OP auszuräumen, dass die Anweisung im Cache gespeichert wird, „nachdem sie ausgeführt wurde“.

Der Instruktionscache speichert die einzelnen Instruktionen für die CPU des aktuell ausgeführten Programms. Es ist das Programm selbst. Der Hauptspeicher ist oft zu langsam (oder hat zu viel Latenz), um die CPU jedes Mal mit der nächsten Anweisung versorgen zu können, wenn sie für eine bereit ist. Aus diesem Grund wird ein schneller Cache in der Nähe der CPU verwendet, das ist der Befehls-Cache.