Zweck des Anweisungscache

Ein Prozessor arbeitet mit 100 MHz. Der daran angeschlossene Programmspeicher kann nur mit maximal 25 MHz arbeiten. Können wir trotzdem in einem Taktzyklus des Prozessors eine Anweisung daraus abrufen? Ich habe gelesen, dass der Anweisungscache für diesen Zweck verwendet werden kann. Wie der Befehls-Cache den Befehlsabruf tatsächlich beschleunigt, während wir die Geschwindigkeit des langsamen Speichers nicht erhöhen können?

ein Cache ist nur ein Teil davon, der Prefetch und der Prefetch-Puffer sind ein Faktor. Cache macht einfach einige der Informationen schneller für sich wiederholende oder lineare Zugriffe. Ihr Prozessor bleibt jedoch immer noch stehen, wenn Sie auch mit einem Cache nur jeweils eine Anweisung abrufen (abhängig davon, wo sich der Cache befindet, Busse usw.).

Antworten (2)

Prozessoren haben eine Abruf-/Ausführungs-Pipeline, die Anweisungen abruft, dekodiert und ausführt. Unterschiedliche Prozessoren haben eine unterschiedliche Anzahl von Pipelineebenen. Eine dreistufige Rohrleitung ist gezeigt. Jeder Befehl benötigt zur Ausführung drei Taktzyklen, aber da die Stufen parallel geschaltet werden können, beträgt die Nettoausführung 1 Takt/Befehl für den Prozessor.

Pipeline abrufen/ausführen

Idealerweise möchten wir, dass Programme so schnell wie möglich ausgeführt werden. Aber das ist nicht kosteneffektiv. Eine typische Speicherhierarchie ist gezeigt.

Speicherhierarchie

Der schnellste Speicher sind Register. Wenn Sie viele Allzweckregister haben, kann das Programm von den Registern ausgeführt werden.

Lokalität bedeutet, dass die meisten Befehlsabrufe sequentiell sein werden. Es ist nur dann nicht der Fall, wenn auf eine Verzweigung gestoßen wird. Der gegenwärtige Inhalt der dreistufigen Pipeline muss verworfen werden, damit die neuen Anweisungen geladen werden können. Wenn der Zweig klein ist, können sich Inhalte in Registern befinden. Wir verlieren 3 Taktzyklen, während die neue Anweisung aus den Registern geholt wird. Der Prozessor hält an, bis eine neue Anweisung auszuführen ist. Zusätzliche Taktzyklen werden eingefügt.

Wenn sie nicht in den Registern ist, wird die Adresse an den Cache gesendet. On-Chip-Cache ist eine kleine Menge an Hochgeschwindigkeitsspeicher. Wenn es ein Hit ist. Der On-Chip-Cache dauert 1 oder 2 Taktzyklen, um auf die nächste Anweisung zuzugreifen. Immer noch 1'ish Taktzyklen / Anweisung.

Wir überspringen mehrere Cache-Ebenen. Nur eine weitere Stufe der Pufferung. Kein wirklicher Punkt bei 100MHz. L2-Caches sind nur kleine Mengen an schnellem SRAM.

Wenn es sich um einen Fehltreffer handelt, muss der Cache Anweisungen vom Hauptspeicher anfordern. Hauptspeicher ist eine große Menge an billigem Speicher. Bei 25 MHz würde jeder Befehl 4 Taktzyklen zum Abrufen benötigen. Der Befehl wird in den Cache und den Prozessor eingelesen. 4 Takte zum Abrufen und 3 zum Ausführen.

Lokalität bedeutet, dass der Prozessor auch die nächste Anweisung benötigt. Der Speichercontroller ist so eingerichtet, dass er einen vollständigen Block benachbarter Orte aus dem DRAM in den Cache liest. Der Programmzähler des Prozessors fordert den nächsten Speicherort an, Cache Miss, aber der Speichercontroller ruft diesen zweiten Speicherort bereits aus dem Hauptspeicher ab, sodass die Gesamtverzögerung geringer ist.

Wenn sich das Programm schließlich nicht im Hauptspeicher befindet, muss es aus dem Speicher in den DRAM geladen werden. Großer Leistungseinbruch, da der Speicher langsam ist ...

Letztendlich hängt 1 Taktzyklus / Anweisung vom Programm und Compiler / Programmierer ab.


Bearbeiten...

Cache muss geladen werden. Typischerweise haben DRAM-Controller Burst-Kapazität, wobei das erste Lesen 4 Zyklen dauert, aber die anfängliche DRAM-Adresse bereits geliefert wird und nachfolgende Lesevorgänge weniger als 4, sagen wir, 2 Zyklen dauern. Ein dreistufiger Pipeline-Prozessor muss 7 Taktzyklen warten, um die erste Anweisung zu erhalten (schlechteres Szenario – Verzweigung, Papierkorb-Pipeline – Cache-Fehlschlag, Abruf aus dem DRAM), aber 2 oder 3 für die nächste Anweisung, die bereits unterwegs ist der Cache.

Viele Programme sind nicht sequentiell, sondern Schleifen oder wiederverwendete Unterroutinen, bei denen der Cache (und die Cache-Ebenen) die Leistung verbessern können. Wenn ein Programm sequentiell wäre, hätte der Cache keinen Zweck. Der Prozessor würde mit der Geschwindigkeit des DRAM-Lesezugriffs laufen.

Kein Pipelining, sequentieller Code, keine Burst-Fähigkeit, dann läuft Ihr Prozessor mit 25 MHz, wobei 3 Wartezustände in jede Anweisung eingefügt werden. Pipelining, Loopey-Code (der in 100-MHz-Register oder 100-MHz-Cache passt) und Burst-DRAM-Lesefähigkeit bedeuten, dass der Prozessor mit 100 MHz und 1 Taktzyklus/Anweisung läuft.

Wenn der Cache also mit etwa 100 MHz arbeitet, kann der Prozessor Anweisungen in einem Zyklus daraus abrufen? Dies bedeutet, dass der Cache bereits mehr als eine Anweisung aus dem Speicher bei 4 Zyklen / Anweisung gespeichert hat, bevor der Prozessor überhaupt mit dem Abrufen von Anweisungen beginnt?
Aber wenn der Cache auch 4 Zyklen benötigt, um eine Anweisung aus dem Speicher zu holen, wie ist es am Ende nützlich? Wenn es 4 Anweisungen gibt, dauert es 16 Zyklen, um in den Cache zu kopieren, obwohl der Prozessor eine Anweisung in einem Zyklus aus dem Cache abrufen kann.
Richtig. Der Vorteil gilt, wenn Sie dieselben Anweisungen das nächste Mal ausführen, wenn sie sich noch im Cache befinden und in einem Zyklus abgerufen werden können. Es gibt auch einige Arten von Speicher, bei denen das Abrufen (z. B.) 4 Zyklen dauert - aber Sie erhalten 4 oder mehr Anweisungen auf einmal zurück. Welche dem Cache hinzugefügt werden können.
"aber Sie erhalten 4 oder mehr Anweisungen auf einmal zurück" - Nennt man das Burst-Modus oder so? :-) @pjc50
Ja, genau das - DRAM-Burst-Modus.

Mit den Worten von Pater Ted ist der Befehls-Cache klein, aber der Speicher ist weit entfernt.

Der 25-MHz-Speicher benötigt mindestens vier Zyklen des 100-MHz-Prozessors. Der Befehls-Cache macht den Zugriff auf den Hauptspeicher nicht wirklich schneller, liefert aber Werte sofort und nicht verzögert zurück. Dies hat den Vorteil, dass der Prozessor beim zweiten und nachfolgenden Mal versucht, auf eine bestimmte Adresse zuzugreifen. Zum Beispiel beim Ausführen einer Schleife.

Also, wenn es ein Programm ohne Schleife ist? Wenn das Programm gerade sequentiell von oben nach unten ausgeführt wird. Wird es keinen Vorteil geben, den Cache zu verwenden?
@MeenieLeis richtig, aber wie viele Programme werden in der Praxis einfach nacheinander ohne Verzweigungen oder Schleifen ausgeführt? Nur sehr wenige, die etwas Nützliches tun.