Unterrichtspipelining
Taktzyklus Instrument. Nein. | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
1 | WENN | ICH WÜRDE | EX | Mem | Wb | ||
2 | WENN | ICH WÜRDE | EX | Mem | Wb | ||
3 | WENN | ICH WÜRDE | EX | Mem | Wb | ||
4 | WENN | ICH WÜRDE | EX | Mem | |||
5 | WENN | ICH WÜRDE | EX | ||||
(If = Befehlsabrufen, ID = Anweisungsdecodieren, Ex = Execute, Mem = Speicherzugriff, WB = Register zurückschreiben). Im vierten Taktzyklus (die grüne Spalte) befindet sich die früheste Anweisung in der MEM -Bühne, und die neueste Anweisung hat die Pipeline noch nicht eingegeben. |
Im Informatik, Unterrichtspipelining ist eine Technik zur Implementierung Parallelität auf Befehlsebene Innerhalb eines einzelnen Prozessors. Pipelining -Versuche, jeden Teil des Prozessors mit einigen Anweisungen zu beschäftigen, indem Sie eingehende Teilen teilen Anweisungen in eine Reihe sequentieller Schritte (das gleichnamige "Pipeline") von verschiedenen durchgeführt Prozessoreinheiten mit verschiedenen Teilen von Anweisungen, die parallel verarbeitet wurden.
Konzept und Motivation
In einem pipelierten Computer fließen Anweisungen durch die Zentrale Verarbeitungseinheit (CPU) in Stufen. Zum Beispiel könnte es eine Stufe für jeden Schritt des Von Neumann -Zyklus: Abrufen Sie die Anweisung ab, holen Sie die Operanden, machen Sie die Anweisung, schreiben Sie die Ergebnisse. Ein Pipeled -Computer hat nach jeder Phase normalerweise "Pipeline Register". Diese speichern Informationen aus der Anweisung und Berechnungen, damit die Logik -Tore der nächsten Stufe kann den nächsten Schritt ausführen.
Mit dieser Anordnung können die CPU in jedem Taktzyklus eine Anweisung abschließen. Es ist üblich, dass gleichmäßige Stufen an einer Kante der Quadratwellenuhr arbeiten, während ungerade Stufen am anderen Kante arbeiten. Dies erlaubt mehr Zentralprozessor Durchsatz als ein Multycle -Computer bei einem gegebenen Taktfrequenz, kann aber zunehmen Latenz aufgrund des zusätzlichen Aufwand des Pipelining -Prozesses selbst. Auch wenn die elektronische Logik eine feste maximale Geschwindigkeit aufweist, kann ein Pipel -Computer schneller oder langsamer gemacht werden, indem die Anzahl der Stufen in der Pipeline variiert. Mit mehr Phasen arbeitet jede Stufe weniger Arbeit, und so hat die Bühne weniger Verzögerungen von der Logik -Tore und könnte mit einer höheren Taktrate laufen.
Ein Computermodell des Computers ist häufig am wirtschaftlichsten, wenn die Kosten als Logik -Tore pro Anweisung pro Sekunde gemessen werden. In jedem Moment befindet sich eine Anweisung nur in einer Pipeline -Stufe, und im Durchschnitt ist eine Pipeline -Stufe weniger kostspielig als ein Multycle -Computer. Außerdem wird die meisten Pipelined -Computer -Logik die meiste Zeit verwendet. Im Gegensatz dazu haben Computer außerhalb der Reihenfolge normalerweise große Mengen an Leerlauflogik zu einem bestimmten Zeitpunkt. Ähnliche Berechnungen zeigen normalerweise, dass ein Pipeline -Computer weniger Energie pro Anweisung verwendet.
Ein pipelierter Computer ist jedoch normalerweise komplexer und teurer als ein vergleichbarer Multycle -Computer. Es hat in der Regel mehr Logik -Tore, Register und eine komplexere Steuereinheit. In einer ähnlichen Weise kann es mehr Gesamtenergie verbrauchen, während weniger Energie pro Anweisung verwendet wird. Ohne Reihenfolge kann CPUs normalerweise mehr Anweisungen pro Sekunde erstellen, da sie mehrere Anweisungen gleichzeitig erstellen können.
In einem pipelierten Computer arrangiert die Steuereinheit den Fluss, um als Programmbefehle zu starten, fortzufahren und anzuhalten. Die Anweisungsdaten werden normalerweise in Pipeline -Registern von einer Stufe zur nächsten übergeben, mit einer etwas getrennten Kontrolllogik für jede Phase. Die Steuereinheit versichert auch, dass die Anweisung in jeder Stufe den Betrieb von Anweisungen in anderen Phasen nicht schadet. Wenn beispielsweise zwei Stufen dieselben Daten verwenden müssen, stellt die Steuerlogik sicher, dass die Verwendungen in der richtigen Reihenfolge durchgeführt werden.
Beim effizienten Betrieb hat ein Pipeline -Computer in jeder Phase eine Anweisung. Es arbeitet dann gleichzeitig an all diesen Anweisungen. Für jeden Zyklus seiner Uhr kann es ungefähr einen Anweisungen beenden. Wenn ein Programm jedoch zu einer anderen Anweisungssequenz wechselt, muss die Pipeline manchmal die Daten in Bearbeitung und neu starten. Dies wird als "Stand" bezeichnet.
Ein Großteil des Designs eines pipelierten Computers verhindert Störungen zwischen den Stufen und reduziert die Stände.
Anzahl der Schritte
Die Anzahl der abhängigen Schritte variiert mit der Maschinenarchitektur. Zum Beispiel:
- Die 1956–61 IBM Stretch Das Projekt schlug vor, dass die Begriffe abrufen, dekodieren und ausführen, die gemeinsam geworden sind.
- Das Klassische RISC -Pipeline umfaßt:
- Anweisungen abrufen
- Befehlskodierung und registrieren Sie sich Fetch
- Ausführen
- Speicherzugriff
- Registrieren Sie sich zurück
- Das Atmel Avr und die PIC -Mikrocontroller Jeder hat eine zweistufige Pipeline.
- Viele Designs umfassen Pipelines bis zu 7, 10 und sogar 20 Stufen (wie in der Intel Pentium 4).
- Der spätere "Prescott" und "Zedernmühle" NetBurst Kerne von Intel, verwendet in den letzten Pentium 4 -Modellen und ihre Pentium d und Xeon Derivate haben eine lange 31-stufige Pipeline.
- Der Xelerated X10Q -Netzwerkprozessor verfügt über eine Pipeline von mehr als tausend Stufen lang, obwohl in diesem Fall 200 dieser Stadien unabhängige CPUs mit individuell programmierten Anweisungen darstellen. Die verbleibenden Stufen werden verwendet, um Zugriffe auf Speicher- und On-Chip-Funktionseinheiten zu koordinieren.[1][2]
Wenn die Pipeline "tiefer" gemacht wird (mit einer größeren Anzahl abhängiger Schritte), kann ein bestimmter Schritt mit einfacheren Schaltkreisen implementiert werden, wodurch der Prozessoruhr schneller ausgeführt werden kann.[3] Solche Pipelines können genannt werden Superpipelines.[4]
Ein Prozessor soll sein vollständig pipeline Wenn es in jedem Zyklus eine Anweisung abrufen kann. Wenn einige Anweisungen oder Bedingungen Verzögerungen erfordern, die das Abholen neuer Anweisungen hemmen, ist der Prozessor nicht vollständig pipeliniert.
Geschichte
Die wegweisenden Verwendungen von Pipelining waren in der ILLIAC II Projekt und die IBM Stretch Projekt, obwohl eine einfache Version früher in der verwendet wurde Z1 im Jahr 1939 und die Z3 in 1941.[5]
Pipelining begann in den späten 1970er Jahren in ernsthaft Supercomputer wie Vektorprozessoren und Array -Prozessoren. Einer der frühen Supercomputer war die von Control Data Corporation erstellte Cyber -Serie. Sein Hauptarchitekt, Seymour Crayspäter leitete Cray Research. Cray entwickelte die XMP -Linie von Supercomputern unter Verwendung von Pipelining für Multiplikations- und Add/Subtrahierfunktionen. Später fügten Star Technologies Parallelität hinzu (mehrere pipelierte Funktionen, die parallel funktionieren), die von Roger Chen entwickelt wurden. 1984 fügte Star Technologies den von James Bradley entwickelten Pipelined Divide Circuit hinzu. Mitte der 1980er Jahre wurde Pipelining von vielen verschiedenen Unternehmen auf der ganzen Welt verwendet.
Das Pipelining war nicht auf Supercomputer beschränkt. 1976 die Amdahl CorporationDie Generalzweck-Mainframe der 470-Serie hatte eine 7-Stufen-Pipeline und einen patentierten Branchenvorhersagekreis.
Gefahren
Das Modell der sequentiellen Ausführung geht davon aus, dass jede Anweisung vor Beginn des nächsten abgeschlossen ist. Diese Annahme gilt nicht auf einen pipelierten Prozessor. Eine Situation, in der das erwartete Ergebnis problematisch ist als a Gefahr. Stellen Sie sich die folgenden zwei Registeranweisungen für einen hypothetischen Prozessor vor:
1: Fügen Sie 1 zu R5 2 hinzu: Kopieren Sie R5 zu R6
Wenn der Prozessor die 5 Schritte in der ersten Abbildung (die "grundlegende fünfstufige Pipeline" zu Beginn des Artikels) enthält, wird Anweisung 1 zum Zeitpunkt abgerufen t1 und seine Ausführung wäre abgeschlossen bei t5. Anweisung 2 würde abgerufen werden t2 und wäre abgeschlossen bei t6. Der erste Anweis t5. Die zweite Anweisung kann jedoch die Nummer von R5 (zu kopieren auf R6) in seinem zweiten Schritt (Anweisungsdecoding und Registrierungsförder) zum Zeitpunkt erhalten t3. Es scheint, dass die erste Anweisung den Wert bis dahin nicht erhöht hätte. Der obige Code ruft eine Gefahr auf.
Schreiben von Computerprogrammen in a zusammengestellt Die Sprache kann diese Bedenken nicht aussprechen, da der Compiler so ausgelegt sein könnte, dass Maschinencode erzeugt wird, der Gefahren vermeidet.
Problemumgehungen
In einigen frühen DSP- und RISC -Prozessoren empfiehlt die Dokumentation den Programmierern, solche Abhängigkeiten in angrenzenden und nahezu benachbarten Anweisungen zu vermeiden (genannt Verzögerung von Slots) oder erklärt, dass der zweite Befehl eher einen alten Wert als den gewünschten Wert verwendet (im obigen Beispiel kann der Prozessor den nichtkrementierten Wert konterkunden kopieren) oder erklärt, dass der von ihm verwendete Wert nicht definiert ist. Der Programmierer hat möglicherweise nicht verwandte Arbeiten, die der Prozessor in der Zwischenzeit ausführen kann. Oder um die korrekten Ergebnisse sicherzustellen, kann der Programmierer einfügen NOPS in den Code und negiert teilweise die Vorteile des Pipelinierens.
Lösungen
Pipeline -Prozessoren verwenden üblicherweise drei Techniken, um wie erwartet zu arbeiten, wenn der Programmierer davon ausgeht, dass jede Anweisung vor Beginn des nächsten abgeschlossen ist:
- Die Pipeline könnte Stalloder stellen Sie die Planung neuer Anweisungen ein, bis die erforderlichen Werte verfügbar sind. Dies führt zu leeren Slots in der Pipeline oder zu Bläschen, in denen keine Arbeit ausgeführt wird.
- Ein zusätzlicher Datenpfad kann hinzugefügt werden, der einen berechneten Wert an eine zukünftige Anweisung an anderer Stelle in der Pipeline vor dem erstellten Anweisungen weiterleitet Operanden weiterleiten.[6][7]
- Der Prozessor kann andere Anweisungen lokalisieren, die nicht von den aktuellen abhängig sind und die sofort ohne Gefahren ausgeführt werden können, eine Optimierung, die als bekannt ist Ausführende Ausführung.
Geäst
Ein Zweig aus der normalen Anweisungssequenz beinhaltet häufig eine Gefahr. Sofern der Prozessor den Zweig nicht in einem Zeitzyklus auswirken kann, wird die Pipeline weiter nacheinander abrufen. Solche Anweisungen können nicht wirksam werden, da der Programmierer die Kontrolle über einen anderen Teil des Programms umgeleitet hat.
Ein bedingter Zweig ist noch problematischer. Der Prozessor kann abhängig von einer Berechnung, die noch nicht aufgetreten ist, verzweigen oder nicht. Verschiedene Prozessoren können nachlassen, können versuchen Zweigvorhersageund kann möglicherweise beginnen, zwei verschiedene Programmsequenzen auszuführen (eifrige Ausführung), jeder Annahme, dass der Zweig genommen wird oder nicht, wird alle Arbeiten verworfen, die sich auf die falsche Vermutung beziehen.[a]
Ein Prozessor mit einer Implementierung der Zweigvorhersage, die normalerweise korrekte Vorhersagen macht, kann die Leistungsstrafe durch Verzweigungen minimieren. Wenn jedoch Zweige schlecht vorhergesagt werden, kann es für den Prozessor mehr Arbeit schaffen, wie z. Spülung aus der Pipeline Der falsche Codepfad, der vor der Wiederaufnahme der Ausführung am richtigen Ort begonnen hat.
Programme, die für einen pipelierten Prozessor geschrieben wurden, vermeiden absichtlich Verzweigungen, um den möglichen Geschwindigkeitsverlust zu minimieren. Zum Beispiel kann der Programmierer den üblichen Fall mit sequentieller Ausführung und nur beim Erkennen ungewöhnlicher Fälle verarbeiten. Verwendung von Programmen wie z. B. GCOV analysieren Codeabdeckung Lassen Sie den Programmierer messen, wie oft bestimmte Zweige tatsächlich ausgeführt werden, und erhalten Einblicke, um den Code zu optimieren. In einigen Fällen kann ein Programmierer sowohl den üblichen Fall als auch den ungewöhnlichen Fall mit damit bewältigen Zweigfreier Code.
Besondere Situationen
- Selbstmodifizierende Programme
- Die Technik von selbstmodifizierender Code Kann bei einem Pipeline -Prozessor problematisch sein. In dieser Technik besteht eine der Auswirkungen eines Programms darin, seine eigenen bevorstehenden Anweisungen zu ändern. Wenn der Prozessor eine hat BefehlscacheDie ursprüngliche Anweisung wurde möglicherweise bereits in a kopiert worden Eingabewarteschlange vorab und die Änderung wird nicht wirksam. Einige Prozessoren wie die Zilog Z280 Kann ihre On-Chip-Cache-Erinnerungen für Daten nur für Daten oder als Teil ihres gewöhnlichen Speicheradresses konfigurieren und solche Schwierigkeiten bei selbstmodifizierenden Anweisungen vermeiden.
- Ununterbrochene Anweisungen
- Eine Anweisung kann ununterbrochen sein, um ihre zu gewährleisten Atomizität, wie beispielsweise wenn es zwei Gegenstände tauscht. Ein sequentieller Prozessor erlaubt es Interrupts Zwischen Anweisungen, aber einem Pipelining -Prozessor überlappt die Anweisungen, sodass die Ausführung einer ununterbrochenen Anweisung auch Teile der gewöhnlichen Anweisungen ununterbrochen macht. Das Cyrix Coma -Fehler möchten aufhängen Ein Single-Core-System mit einer unendlichen Schleife, in der sich immer eine ununterbrochene Anweisung in der Pipeline befand.
Entwurfsüberlegungen
- Geschwindigkeit
- Das Pipelining hält alle Teile des Prozessors besetzt und erhöht die Menge an nützlicher Arbeit, die der Prozessor in einer bestimmten Zeit leisten kann. Die Pipelinierung verkürzt typischerweise die Zykluszeit des Prozessors und erhöht den Durchsatz von Anweisungen. Der Geschwindigkeitsvorteil wird insofern verringert, in dem die Ausführung begegnet Gefahren Dies erfordern, dass die Ausführung unter seine ideale Rate verlangsamt. Ein nicht pipelinierter Prozessor führt jeweils nur eine einzige Anweisung aus. Der Beginn der nächsten Anweisung verzögert sich nicht auf Gefahren, sondern bedingungslos.
- Die Notwendigkeit eines Pipeline -Prozessors, alle Arbeiten in modulare Schritte zu organisieren, kann die Vervielfältigung von Registern erfordern, was die Latenz einiger Anweisungen erhöht.
- Wirtschaft
- Durch die Vereinfachung jedes abhängigen Schritts kann das Pipelining komplexe Operationen wirtschaftlicher ermöglichen als das Hinzufügen komplexer Schaltkreise, z. B. für numerische Berechnungen. Ein Prozessor, der mit Pipelining eine erhöhte Geschwindigkeit ablehnt, kann jedoch einfacher und billiger hergestellt werden.
- Vorhersagbarkeit
- Im Vergleich zu Umgebungen, in denen der Programmierer Gefahren vermeiden oder umgehen muss, kann die Verwendung eines nicht pipelierten Prozessors das Programmierer und die Ausbildung von Programmierern erleichtern. Der nicht pipelinierte Prozessor erleichtert es auch einfacher, den genauen Zeitpunkt einer bestimmten Anweisungssequenz vorherzusagen.
Illustriertes Beispiel
Rechts befindet sich eine generische Pipeline mit vier Stufen: abrufen, dekodieren, ausführen und schreiben. Das oberste Graukasten ist die Liste der Anweisungen, die darauf warten, ausgeführt zu werden, das untere Graufeld ist die Liste der Anweisungen, in denen ihre Ausführung abgeschlossen ist, und in der mittleren weißen Box ist die Pipeline.
Die Ausführung ist wie folgt:

Uhr | Ausführung |
---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
Pipeline Blase

Ein Pipelined -Prozessor kann mit Gefahren umgehen, indem er eine Blase in der Pipeline blockiert und erstellt, was zu einem oder mehreren Zyklen führt, in denen nichts Nützliches passiert.
In der Illustration rechts in Zyklus 3 kann der Prozessor die lila Anweisung nicht dekodieren, möglicherweise weil der Prozessor feststellt, dass die Dekodierung von den Ergebnissen abhängt, die durch die Ausführung der grünen Anweisung erzeugt werden. Die grüne Anweisung kann in die Ausführungsstufe und dann wie geplant zur Schreibbühne fortgesetzt werden, aber die lila Anweisung wird für einen Zyklus in der Fetch-Stufe ins Stocken geraten. Die blaue Anweisung, die während des Zyklus 3 abgerufen werden sollte, ist für einen Zyklus zum Blockieren, ebenso wie die rote Anweisung danach.
Aufgrund der Blase (die blauen Ovale in der Abbildung) ist die Decodes-Schaltung des Prozessors während des Zyklus 3 im Leerlauf. Die Ausführungsschaltung ist während des Zyklus 4 im Leerlauf und seine Schreibschaltung ist während des Zyklus 5 im Leerlauf.
Wenn sich die Blase aus der Pipeline (in Zyklus 6) bewegt, wird die normale Ausführung wiederholt. Aber jetzt ist jetzt alles ein Zyklus zu spät. Es werden 8 Zyklen (Zyklus 1 bis 8) statt 7 benötigt, um die vier in Farben gezeigten Anweisungen vollständig auszuführen.[b]
Siehe auch
Anmerkungen
- ^ Frühe pipelinierte Prozessoren ohne diese Heuristiken wie die Pa-risc Prozessor von Hewlett Packard, befasste sich mit Gefahren, indem er einfach den Programmierer warnte; In diesem Fall würde eine oder mehrere Anweisungen nach dem Zweig ausgeführt, unabhängig davon, ob die Filiale entnommen wurde oder nicht. Dies könnte nützlich sein; Nach dem Berechnen einer Zahl in einem Register könnte beispielsweise eine bedingte Filiale in das Register geladen werden. Ein Wert, der für nachfolgende Berechnungen sowohl im Zweig als auch im Fall Nicht-Branch nützlicher ist.
- ^ Beachten Sie jedoch, dass der Prozessor auch mit der Blase immer noch in diesem Fall in der Lage ist, die Anweisungsabfolge viel schneller zu durchlaufen als ein nicht pipelierter Prozessor.
Verweise
- ^ Glkolowsky, Peter (18. August 2003). "Xelerateds Xtraordinary NPU - Der erste 40 -GB -Paketprozessor der Welt hat 200 CPUs". Mikroprozessorbericht. 18 (8): 12–14. Abgerufen 20. März 2017.
- ^ https://www.eetimes.com/xelerated-brings-programmable-40-gbits-technology-the-mainstream-ethernet/#
- ^ John Paul Shen, Mikko H. Lipasti (2004). Modernes Prozessordesign. McGraw-Hill Professional. ISBN 9780070570641.
- ^ Sunggu Lee (2000). Design von Computern und anderen komplexen digitalen Geräten. Prentice Hall. ISBN 9780130402677.
- ^ Rojas, Raúl (April - Juni 1997). "Konrad Zuuss Erbe: Die Architektur des Z1 und Z3" (PDF). IEEE Annals of the History of Computing. 19 (2): 5–16. doi:10.1109/85.586067. Archiviert (PDF) vom Original am 2022-07-03. Abgerufen 2022-07-03. (12 Seiten)
- ^ "CMSC 411 Vortrag 19, Pipelining -Datenweiterleitung". Universität von Maryland Baltimore County Informatik und Elektrotechnik Abteilung. Abgerufen 2020-01-22.
- ^ "High Performance Computing, Notizen der Klasse 11". hpc.serc.iisc.ernet.in. September 2000. archiviert von das Original Am 2013-12-27. Abgerufen 2014-02-08.