Wie kann die Anzahl der Taktzyklen, die zum Ausführen eines Befehls in einem Pipeline-Prozessor erforderlich sind, geringer sein als die Pipeline-Latenz?

Ich bin kein Neuling in der Computerarchitektur, aber ich habe nur akademische Erfahrung mit der Implementierung von Mikroarchitekturen.

Ich habe das viele Male gehört und gelesen, aber nie wirklich die Mühe gemacht, die Aussage zu verstehen: Einige Anweisungen werden in 1 oder 2 Taktzyklen abgeschlossen, während komplexere Anweisungen sagen, dass Ganzzahlen oder Gleitkomma in 2, 4, 6 Taktzyklen usw. abgeschlossen sind oder geladen / gespeichert werden 80-100 Taktzyklen wegen langsamem Speicher.

Jetzt bin ich sicher, dass die meisten Prozessoren, sei es eingebettet oder Desktop, nur wenige Stufen von Pipelines haben, sagen wir von 5 Stufen bis zu 30 Stufen. Daher sollte die Latenz für jeden Befehl gleich der Pipeline-Tiefe oder der Anzahl der Pipeline-Stufen sein. Außerdem kann der Durchsatz eines Skalarprozessors mit einer einzigen Pipeline maximal 1 IPC (Anweisungen pro Zyklus) betragen. Aber wie können einige Befehle in 1, 2 oder 4 Taktzyklen für einen Prozessor mit 10-stufiger oder 12-stufiger Pipeline beendet werden? Kann mir das jemand erklären?

PS: Das einzige, was ich verstehen kann, ist, dass einige Phasen möglicherweise als Multi-Cycle-Phase markiert sind, wie dies normalerweise während STA und Timing Closure der Fall ist. Und dass sie versuchen zu sagen, dass die Ausführung von Anweisungen in dieser bestimmten Multi-Zyklus-Phase 1 cc, 2 cc, 4 cc usw. dauert?

Eine bestimmte Anweisung „verwendet“ nur die Pipeline-Stufe, die sie benötigt, die anderen werden „übersprungen“. Es würde keinen Sinn machen, Operanden aus dem Speicher und ALU-Stufen in einem Register-zu-Register-Bewegungsbefehl abzurufen (= darauf zu warten)!
Wo haben Sie Ihre zitierte Aussage gelesen? Es klingt für mich nach etwas, das über eine frühere Generation von Prozessoren (z. B. 6800 / 8086-Ära) gesagt werden könnte, bevor Pipeline-Architekturen üblich wurden. Bei einer Pipeline-Architektur würden Sie eher etwas sagen wie "der Prozessor hat einen Durchsatz von 1 (oder 2) Zyklen pro Anweisung".
@WoutervanOoijen: Ja, absolut richtig. Daher haben einige Anweisungen möglicherweise eine höhere Latenz und einige eine niedrigere.

Antworten (3)

Im Allgemeinen wird die Befehlsausführungszeit nicht vom Eintritt in die Pipeline bis zum Verlassen gemessen, sondern von dem Zeitpunkt, zu dem er einen beliebigen Punkt in der Pipeline passiert, bis zu dem Zeitpunkt, zu dem der nächste Befehl diesen Punkt passiert. Wenn kein Befehl mehr als z. B. 20 Zyklen benötigt, um seinen Weg durch die Pipeline zu finden, ergibt das Messen der Zeit, die eine Befehlssequenz zum Durchlaufen eines beliebigen Zustands benötigt, ein Ergebnis, das innerhalb von 20 Zyklen der tatsächlichen Zeit liegt, die zum Ausführen der gesamten Sequenz erforderlich ist Anfang bis Ende. Da Programmierer im Allgemeinen viel weniger an der Zeit zum Ausführen einer einzelnen Anweisung interessiert sind als an der Zeit, die zum Ausführen von Sequenzen mit vielen Anweisungen (oft Tausend, wenn nicht mehr) erforderlich ist,

"Das Messen der Zeit, die eine Folge von Anweisungen benötigt, um einen willkürlichen Zustand zu durchlaufen, ergibt ein Ergebnis, das innerhalb von 20 Zyklen der tatsächlichen Zeit liegt, die erforderlich ist, um die gesamte Folge von Anfang bis Ende auszuführen." Wäre die Zeit zum Ausführen einer beliebigen Sequenz nicht innerhalb von "20 plus der Anzahl der insns in der Sequenz" Zyklen, vorausgesetzt, ein insn tritt pro Zyklus in die Pipeline ein?
Wenn jeder Befehl die gleiche Folge von 20 Zuständen durchläuft, dann wäre die gemessene Zeit genau 20 Zyklen kürzer als die tatsächliche Zeit. Wenn die gemessene Zeit 1000 ist, wäre die tatsächliche Zeit 1020. Der Grund, warum ich "innerhalb" gesagt habe, ist, um die Möglichkeit zu berücksichtigen, dass eine Pipeline 8 Stufen hätte, aber während der Verarbeitung für insgesamt 12 Zyklen anhalten könnte. Keine Anweisung würde mehr als 20 Zyklen benötigen, um durch die Pipeline zu gelangen, aber die Gesamtzeit könnte irgendwo zwischen (Messung + 8) und (Messung + 20) liegen. In allen Fällen wäre sie jedoch "innerhalb von 20".

Die Länge der Pipeline ist nur die Verzögerung zwischen Eingang und Ausgang.

Zyklen für die Fertigstellung ist die Zeit, die pro Vorgang benötigt wird.

Das ist nicht dasselbe, das eine ist "Verzögerung", das andere ist "Geschwindigkeit". Es ist also durchaus möglich, eine Pipeline und mehrere Zyklen pro Befehl in jedem Verhältnis zu haben.

Angenommen, Sie haben eine 5-stufige Pipeline und benötigen 3 Zyklen pro Anweisung. Dies bedeutet, dass die Einheit in den nächsten zwei Zyklen nach dem Anlegen einer Eingabe nicht bereit ist, neue Eingaben zu akzeptieren. Hinzu kommt eine Verzögerung von 5 Zyklen durch die Pipeline. Daher dauert es 8 Zyklen vom Anlegen der Eingabe, bis das Ergebnis verfügbar ist. Aber hinsichtlich des Durchsatzes werden nur 3 Zyklen pro Operation benötigt. Dh obwohl das erste Ergebnis nicht vollständig ist, kann im 3. Zyklus eine neue Eingabe akzeptiert werden und die Berechnung wird gestartet (und das Ergebnis wird 8 Zyklen später erhalten).

Mit einer Pipeline erledigen Sie Dinge parallel (auf Kosten der Verzögerung), die Sie sonst seriell erledigen müssten (mehr Zyklen pro Operation).

Ich verstehe die meisten Ihrer Punkte. Aber ich kann Ihren Kommentar nicht verstehen: "brauche 3 Zyklen pro Anweisung" - meinst du durchschnittliche IPC? Und auch der Kommentar: "3 Zyklen pro Vorgang" - Sie meinen, die Ausführung des tatsächlichen Vorgangs in einer bestimmten Phase erfordert 3 Zyklen?
Ich meine mit 3 Zyklen/Anweisung einen IPC von 1/3. Oder in der Zeit, die 3000 Zyklen entspricht, können 1000 Befehle ausgeführt werden. Ich denke, die Antwort auf Ihre Frage lautet ja.

Eine Anweisung zu haben, die alle Pipeline-Stufen (Fetch -> Decode -> ...) in ein oder zwei Taktzyklen durchlaufen kann, scheint mir unmöglich. Die "Ausführungszeit", wie Sie sie zitiert haben, ist wahrscheinlich eine Art Slang.

Die beste Vermutung, die ich machen kann, ohne den gesamten Kontext der Aussage sehen zu können, die Sie verwirrt, ist, dass diese Zahlen das "Hängen" der Pipeline darstellen, wenn eine Anweisung ausgeführt wird. Anders ausgedrückt stellt diese Zahl den theoretischen Durchsatz der Pipeline dar, wenn nur die Befehle dieser Art ausgeführt würden.

Zum Beispiel:

  • Wenn die einzigen Befehle, die der Pipeline zugeführt werden, Move Between Registers sein könnten, wäre der Durchsatz der Pipeline gleich 1 – bei jedem Taktzyklus wird ein Befehl abgeschlossen.
  • Wenn die einzige Anweisung, die der Pipeline zugeführt wird, Laden aus dem Speicher sein könnte, wäre der Durchsatz der Pipeline gleich 1 100 (unter der Annahme, dass dieser Befehl die Pipeline für 100 Taktzyklen anhält).

In modernen Multi-Pipeline-CPUs hat die rohe "Befehlsausführungszeit" allein keinen großen Nutzen. Der Einsatz von Multi-Level-Caching, Out-of-Order-Ausführung, Predictive Branching und vielem mehr verkompliziert die Analyse und mildert die Strafe für das Blockieren einer einzelnen Pipeline. Manchmal kann diese Strafe auf Null reduziert werden.

Ja, die Quelle dieses Blockierens der Pipeline ist die Tatsache, dass einige Befehle "Mehrfachzyklus"-Stufen haben können. Die Verwendung von „Mehrfachzyklus“ in diesem Zusammenhang ist jedoch nicht immer gleichbedeutend mit der Verwendung von „Mehrfachzyklus“ im Zusammenhang mit STA-Werkzeugen. Die Pipeline-Multi-Cycle-Stufe kann eine kombinatorische Stufe sein, die wenige Taktzyklen benötigt (in diesem Fall sollte sie für STA-Tools auch als Multi-Cycle definiert werden), oder sie kann eine sequentielle Stufe sein, die mehr als einen einzelnen Taktzyklus benötigt abgeschlossen (in diesem Fall muss es immer noch das Timing als einzelne Zyklusstufe erfüllen).

Stellen Sie sich eine 10-stufige Pipeline mit einem 32-Bit-Gleitkomma-Addierbefehl FPADD Dest, Src1, Src2 vor. Der FPADD-Befehl durchläuft verschiedene Stufen (Fetch, Decode, ..) und benötigt in jeder dieser Stufen 1 cc, bevor er die Exec-Stufe erreicht. Die eigentliche Addition erfolgt in der Exec-Stufe, wo es 4 Taktzyklen dauert, um diese Operation durchzuführen. Dies könnte auf zwei Arten geschehen: 1: Die FP-Addiereinheit selbst ist mit 4 Pipeline-Registern in einer Pipeline angeordnet. 2: Wenn es sich um einen rein kombinatorischen Pfad handelt, wird er als Mehrzykluspfad mit 4 Zyklen markiert. Insgesamt erfordert FP ADD immer noch mindestens 10 + 4 = 14 Zyklen (LATENZ), um aus der Pipeline zu kommen.
Wenn wir 101 unabhängige FPADD-Befehle ausführen, würde dies 14 + 100 * 1 = 114 Taktzyklen dauern. Dies ergibt IPC (Durchsatz oder Abschlussrate) = 101/114 = 0,88. Wenn also jemand die Aussage macht, dass "jede FP-ADD-Operation 4 cc benötigt", ist dies nur für die tatsächliche FP-Operation sinnvoll, die in der Exec-Phase stattfindet. Weder Latenz noch Befehlsdurchsatz haben damit etwas zu tun. Ist es nicht?
@nurabha, wenn jede Exec-Stufe die Pipeline für 3 zusätzliche Taktzyklen blockiert, wie kommt es dann, dass der Durchsatz bei 1 liegt? Ich glaube, dass die Ausführung von 101 solcher Anweisungen dauern wird 14 + 100 4 = 414 Taktzyklen.
Bitte korrigieren Sie mich, wenn ich falsch liege. Ich denke, dass 3-Zyklus-Stalls nur dann von der Exec-Stufe verursacht werden, wenn der FP-Addierer eine nicht-pipelined-Einheit ist, dh es ist eine kombinatorische Einheit mit einer Verzögerung von 4 cc (Mehrfachzyklus). Wenn jedoch der FP-Addierer selbst mit 4 Pipeline-Registern gepipelinet ist, würden in der Exec-Stufe keine Verzögerungen auftreten, da 4 Operandenpaare in der Exec-Stufe zusammen im Flug sein können? Also ist Ihre Antwort für den 1. Fall richtig und meine Antwort ist für den 2. Fall richtig?
@Vasily: Mit deinen 414 Taktzyklen. VPI ~ 4,15. Erst jetzt macht die Aussage "Jede FP-Add-Operation benötigt 4 cc" Sinn.
@nurabha, was Sie beschreiben, ist keine einzelne "Multi-Cycle" -Phase der Pipeline, sondern eine längere Pipeline, in der die Ausführungsphase in mehrere Pipeline-Phasen aufgeteilt ist. Es gibt einen entscheidenden Unterschied: Die "Mehrfachzyklus"-Stufe kann keine neuen Daten akzeptieren, bevor die Ausführung des vorherigen Befehls abgeschlossen ist, wodurch Verzögerungen hinzugefügt werden. Eine einzelne Stufe, die in mehrere Pipelinestufen aufgeteilt ist, fügt keine Verzögerungen hinzu. Allerdings erhalten nur allgemeine Vorgänge mehrere Pipeline-Stufen. Es ist verschwenderisch, der Pipeline 5 Stufen hinzuzufügen, da dies für einen einzelnen Befehl erforderlich ist.