tl; dr
Kürzere Pipelines bedeuten schnellere Taktraten, können aber den Durchsatz verringern. Siehe auch die Antworten 2 und 3 unten (ich verspreche, sie sind kurz).
Längere Version:
Hier sind einige Dinge zu beachten:
- Nicht alle Anweisungen nehmen die gleiche Zeit in Anspruch
- Nicht alle Anweisungen hängen davon ab, was unmittelbar (oder sogar zehn oder zwanzig) zurückliegende Anweisungen ausgeführt wurden
Eine sehr vereinfachte Pipeline (was in modernen Intel-Chips passiert, ist unkompliziert) besteht aus mehreren Phasen:
Abrufen -> Decodieren -> Speicherzugriff -> Ausführen -> Zurückschreiben -> Programmzähleraktualisierung
Zu jedem -> fallen Zeitkosten an. Außerdem bewegt sich mit jedem Tick (Taktzyklus) alles von einer Stufe zur nächsten, sodass Ihre langsamste Stufe zur Geschwindigkeit für ALLE Stufen wird (es zahlt sich wirklich aus, wenn sie so lang wie möglich sind).
Angenommen, Sie haben 5 Anweisungen und möchten diese ausführen (Bild aus Wikipedia, hier wird das PC-Update nicht durchgeführt). Es würde so aussehen:
Obwohl jeder Befehl 5 Taktzyklen benötigt, wird in jedem Zyklus ein fertiger Befehl aus der Pipeline ausgegeben. Wenn die Zeit für jede Stufe 40 ns und für die Zwischenbits 15 ns beträgt (unter Verwendung der obigen Pipeline mit sechs Stufen), dauert es 40 · 6 + 5 · 15 = 315 ns, um den ersten Befehl auszugeben.
Im Gegensatz dazu würde es nur 240 ns dauern, bis ich die erste Anweisung herausbekomme, wenn ich die Pipeline vollständig eliminieren würde (aber alles andere gleich belasse). (Dieser Geschwindigkeitsunterschied, mit dem die "erste" Anweisung ausgegeben wird, wird als Latenz bezeichnet. Er ist im Allgemeinen weniger wichtig als der Durchsatz, dh die Anzahl der Anweisungen pro Sekunde.)
Der wirkliche Unterschied ist jedoch, dass im Pipeline-Beispiel alle 60 ns ein neues Instrument erstellt wird (nach dem ersten). In der nicht-Pipeline dauert es jedes Mal 240. Dies zeigt, dass Pipelines den Durchsatz gut verbessern können.
Wenn ich noch einen Schritt weiter gehe, scheint es, dass ich in der Speicherzugriffsphase eine Additionseinheit benötige (um Adressberechnungen durchzuführen). Das heißt, wenn es eine Anweisung gibt, die die Mem-Stufe in diesem Zyklus nicht verwendet, kann ich eine weitere Addition durchführen. Auf diese Weise kann ich zwei Ausführungsphasen (eine davon befindet sich in der Speicherzugriffsphase) auf einem Prozessor in einem einzigen Tick ausführen (die Planung ist ein Albtraum, aber lasst uns nicht dorthin gehen. Zusätzlich benötigt die PC-Aktualisierungsphase auch eine Zusatzeinheit in der Fall eines Sprungs, so kann ich drei Additionsausführungszustände in einem Tick ausführen). Durch die Verwendung einer Pipeline können zwei (oder mehr) Anweisungen unterschiedliche Phasen (oder Sprungphasen usw.) verwenden, wodurch wertvolle Zeit gespart wird.
Beachten Sie, dass zu diesem Zweck Prozessoren viel "Magie" ausführen ( nicht ordnungsgemäße Ausführung , Verzweigungsvorhersage und vieles mehr), dass jedoch mehrere Anweisungen schneller ausgegeben werden können als ohne Pipeline (beachten Sie, dass dies auch für Pipelines gilt) sind sehr schwer zu handhaben und verursachen höhere Kosten, wenn Sie nur zwischen den Phasen warten. Die Kehrseite ist, dass Sie, wenn Sie die Pipeline zu lang machen, eine verrückte Taktrate erhalten können, aber einen Großteil der ursprünglichen Vorteile verlieren können (derselbe Logiktyp kann an mehreren Stellen vorhanden sein und gleichzeitig verwendet werden) ).
Antwort 2:
SIMD (Single Instruction Multiple Data) -Prozessoren (wie die meisten GPUs) arbeiten viel an vielen Informationen, benötigen dafür jedoch mehr Zeit. Das Einlesen aller Werte dauert länger (bedeutet einen langsameren Takt, obwohl dies dadurch ausgeglichen wird, dass der Bus in gewissem Maße breiter ist), aber Sie können viel mehr Anweisungen gleichzeitig ausführen (effektivere Anweisungen pro Zyklus).
Antwort # 3:
Weil Sie den Zykluszähler "betrügen" und künstlich verlängern können, so dass Sie zwei Anweisungen pro Zyklus ausführen können (halbieren Sie einfach die Taktrate). Es ist auch möglich, nur alle zwei Ticks etwas zu tun, anstatt nur einen (mit einer doppelten Taktrate, aber ohne Änderung der Anweisungen pro Sekunde).