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?
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.
Idealerweise möchten wir, dass Programme so schnell wie möglich ausgeführt werden. Aber das ist nicht kosteneffektiv. Eine typische Speicherhierarchie ist gezeigt.
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.
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.
Oldtimer