Warum können Sie nicht sowohl hohe Anweisungen pro Zyklus als auch hohe Taktgeschwindigkeit haben?

37

Der Megahertz-Mythos wurde aufgrund der Unterschiede zwischen dem INTEL 8086-Prozessor des PCs und dem Rockwell 6502-Prozessor von Apple zu einer Werbemaßnahme. Der 8086 lief mit 4,77 MHz, während der 6502 mit 1 MHz lief. Anweisungen für den 6502 erforderten jedoch weniger Zyklen. In der Tat so viel weniger, dass es schneller lief als der 8086. Warum benötigen einige Befehle weniger Zyklen? Und warum können die Anweisungen des 6502, die weniger Zyklen erfordern, nicht mit einem schnellen Prozessor des 8086 kombiniert werden?

Wikipedia Artikel für Anweisungen pro Zyklus (IPC) sagt

Faktoren, die den IPC regeln
Eine bestimmte Anzahl von Anweisungen pro Sekunde kann mit einem hohen IPC und einer niedrigen Taktrate erreicht werden ... oder mit einem niedrigen IPC und einer hohen Taktrate.

Warum können Sie nicht sowohl hohe Anweisungen pro Zyklus als auch hohe Taktgeschwindigkeit haben?

Vielleicht hat das damit zu tun, was ein Taktzyklus ist? Wikipedia erwähnt die Synchronisation von Schaltkreisen? Nicht sicher, was das heißt.

Oder hat das vielleicht damit zu tun, wie eine Pipeline funktioniert? Ich bin nicht sicher, warum sich Anweisungen in einer kurzen Pipeline von Anweisungen in einer langen Pipeline unterscheiden.

Jeder Einblick wäre toll! Ich versuche nur die Architektur hinter dem Mythos zu verstehen. Vielen Dank!

Verweise:

Anweisung pro Zyklus gegen erhöhte Zykluszahl

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle

Dobus
quelle
1
> Warum benötigen einige Anweisungen weniger Zyklen? RISC / CISC ( na ja , irgendwie ). Und warum können die Anweisungen des 6502, die weniger Zyklen erfordern, nicht mit einem schnellen Prozessor des 8086 kombiniert werden? Sie können und haben. Das Problem ist, dass es schwierig ist, alles aufzugeben und das nächste Modell von vorne zu beginnen, sobald Sie bereits eine Basis eingerichtet haben.
Synetech
@Synetech, Intel tat dies irgendwie, indem es Programmierern einen CISC-Befehlssatz vorstellte und diesen dann in RISCier-Befehle auf dem Chip
umwandelte
Nun, als ich sagte, dass die beiden kombiniert wurden, meinte ich damit ganz andere Chiphersteller. Ich habe keine Liste zur Hand, aber es gab andere (Nicht-Intel / AMD), die solche Dinge getan haben. (Die meisten Leute vergessen, dass es viele Chiphersteller gibt, da Intel und AMD jetzt den Desktop-Markt dominieren.)
Synetech

Antworten:

21

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:

  1. Nicht alle Anweisungen nehmen die gleiche Zeit in Anspruch
  2. 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:

Bildbeschreibung hier eingeben

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).

soandos
quelle
3
Kurze Pipelines bedeuten langsamere Taktraten! Pentium 4 hatte hohe Taktraten aufgrund langer Pipelines. Hier ist WP: "NetBurst unterschied sich von P6 (Pentium III, II usw.) durch eine sehr tiefe Anweisungs-Pipeline, um sehr hohe Taktraten zu erzielen." Der Punkt ist, dass Sie wenig pro Stufe tun, um hohe Geschwindigkeiten zu erreichen. Dies erwies sich jedoch als nicht praktikabel und Intel verlor aufgrund dessen enorm an Dynamik für AMD. Sie gingen zurück zur Pentium 3-Architektur und entwickelten "Core".
Stolsvik
@stolsvik, kannst du das erklären? Es macht für mich keinen Sinn (weniger Zwischenstufen bedeuten, dass alle anderen gleich sind, die Taktzyklen kürzer sind und eine höhere Taktgeschwindigkeit ergeben)
soandos
4
Pro Taktzyklus wird eine Pipeline-Stufe durchgeführt . Die gesamte Pipeline schreitet pro Takt um einen Schritt voran - indem unten neue Anweisungen abgerufen und oben fertige Anweisungen "ausgegeben" werden. Daher bestand die Idee bei Pentium4 darin, sehr kleine Schritte zu machen, die schnell ausgeführt werden konnten und hohe Taktraten ergaben, jedoch eine lange Pipeline erforderten. Der Anhaltspunkt für eine Pipeline (alle Prozessoren verwenden eine) ist, dass mehrere Anweisungen gleichzeitig verarbeitet werden. Eine lange Pipeline bedeutet, dass viele Anweisungen ausgeführt werden - und wenn eine Verzweigungsvorhersage fehlschlägt, müssen Sie die gesamte Pipe spülen.
Stolsvik
Für Ihre Antwort # 2 greift die CPU nur über den Cache auf die Daten zu (der Speicherzugriff ist normalerweise aus Sicht des Befehls transparent). Das Verlangsamen der Taktfrequenz hat keinen Einfluss darauf, wie lange es dauert, bis die Daten aus dem RAM kommen (wenn sie sich nicht im Cache befinden). Außerdem wirkt sich die Busbreite nur auf die Geschwindigkeit von SIMD-Vorgängen im Verhältnis zur Größe Ihrer Operanden aus (dh, ich kann 8 8-Bit-Operanden gleichzeitig auf einen 64-Bit-Bus laden, muss aber immer noch 8 64-Bit-Werte manuell laden wenn ich 64-Bit-Operanden habe).
Durchbruch
2
Auch für Antwort # 1, wenn Sie sagen "Wenn es eine Anweisung gibt, die die mem-Stufe dieses Zyklus nicht verwendet, dann kann ich eine weitere Addition machen", ist dies falsch. Die Ausführung außerhalb der Reihenfolge erfolgt auf Befehlsebene, nicht auf Mikrooperationsebene. Wenn ein Befehl zwei Ausführungen in der Pipeline erfordert, würde dies eine Blase in der Pipeline verursachen . Schließlich verfügt die x86-Architektur über eine separate ALU, um Speicheradressen während des Lese- / Schreibvorgangs im Arbeitsspeicher zu berechnen (ermöglicht die [EBX+ECX*4+100]Formatadressierung).
Durchbruch
8

Ich vereinfache das sehr, aber der wichtige Punkt, an den ich mich erinnern muss, ist, dass diese Begriffe Äpfel mit Orangen vergleichen. Ein "Zyklus" ist keine einheitliche Maßeinheit, die für alle Prozessoren gleich ist, wie eine "Sekunde" eine einheitliche Zeitmessung. Stattdessen stellt ein Zyklus eine bestimmte Arbeitseinheit dar, die etwas willkürlich definiert ist, aber durch die Komplexität des Pipeline-Designs und natürlich durch die Physik begrenzt wird.

In vielen Fällen können Sie mit viel Arbeit in einem Zyklus die gesamte Pipeline löschen. Wenn dies erfolgreich ist, bedeutet dies, dass Ihr nächster Zyklus nicht optimiert wird, da Sie die Pipeline erneut füllen müssen, was einige Zeit in Anspruch nehmen kann.

Ich könnte einen sehr simplen Prozessor entwerfen, der eine Stufe eines RISC-Befehls pro Zyklus verarbeitet, und wenn dies die Basis meiner CPU wäre, könnte ich wahrscheinlich sehr, sehr hohe Zyklen pro Sekunde erreichen, da die Komplexität dessen, was "a" ausmacht, verringert ist Zyklus".

Die Details fließen in eine Menge Physik und Elektrotechnik ein, die ich nicht wirklich verstehe, aber denken Sie daran, dass die Taktrate nicht durch einfaches Hinzufügen der Eingangsspannung zum Prozessor und das Hoffen auf das Beste erreicht wird. Zumindest ist das thermische Profil ein weiteres notwendiges Anliegen.

allquixotic
quelle
Dies beantwortet seine Frage nicht wirklich (was nichts damit zu tun hat, warum die Dinge nicht einfach beschleunigt werden können). Er fragt, wie viel mehr Zyklen! = Mehr Arbeit die ganze Zeit
soandos
Diese Antwort behebt jedoch ein Problem, das ich in den anderen Antworten nicht gesehen habe. Das heißt, es geht um die Einbeziehung bestimmter Befehlssätze, die Operationen mit weniger Taktzyklen abschließen, und um die Fähigkeit, Taktzyklen auf der Grundlage der langsamsten Befehlssätze zu messen, die möglicherweise vorhanden sind nicht so effizient sein. (Ich könnte mich sehr irren ... Ich finde Architektur faszinierend, aber ich werde mich in keiner Weise als Experte betrachten)
Stephen R
5

Hier ist eine sehr einfache (möglicherweise stark vereinfachte) Erklärung: Angenommen, Sie haben eine bestimmte Aufgabe zu erledigen, sagen wir, Sie müssen zwei 32-Bit-Zahlen hinzufügen. Sie können zwei Ansätze wählen. Sie können es in eine sehr große Anzahl von sehr kleinen Schritten aufteilen oder Sie können es in eine kleine Anzahl von sehr großen Schritten aufteilen.

Sie könnten zum Beispiel einfach "Addiere die beiden Zahlen" sagen. Jetzt hast du nur noch einen Schritt. Dieser Schritt besteht jedoch aus mehreren Teilen und dauert länger. Sie haben also hohe Anweisungen pro Zyklus - eine in diesem Fall. Aber Ihre Taktrate kann nicht hoch sein, weil Sie in diesem Zyklus viel zu tun haben.

Sie könnten alternativ sagen: "Holen Sie sich die erste Zahl in ein Register. Holen Sie sich dann die zweite Zahl. Fügen Sie dann die niederwertigsten Bits hinzu. Fügen Sie dann das zweitniedrigstwertige Bit mit dem Übertrag von vorher hinzu. Fügen Sie dann das drittniedrigste hinzu. Fügen Sie dann die höchstwertigen Bits hinzu. Wenn es einen Übertrag gab, setzen Sie das Überlauf-Flag. Schreiben Sie dann das Ergebnis in den Speicher. Jetzt haben Sie eine Vielzahl von Schritten. Aber jeder Schritt kann absurd schnell sein. Sie haben also nur wenige Anweisungen pro Zyklus (in diesem Fall etwa 1/36). Ihre Taktrate kann jedoch sehr hoch sein, da jeder Zyklus nur ein sehr kleines bisschen zu tun hat.

Um sowohl hohe Anweisungen pro Zyklus als auch eine hohe Taktgeschwindigkeit zu haben, müssten Sie eine komplexe Anweisung in eine sehr kleine Anzahl von sehr einfachen Schritten aufteilen. Dies ist jedoch nicht möglich, da die Anweisung komplex ist.

Die tatsächlichen spezifischen Kompromisse und Zyklusnummern unterscheiden sich erheblich, da moderne CPUs über Pipelines arbeiten und Anweisungen überlappen. Aber die Grundidee ist richtig.

David Schwartz
quelle
2

Sie können sowohl hohe Anweisungen pro Zyklus als auch eine hohe Taktgeschwindigkeit haben. Sie stoßen an Grenzen, wenn die Laufzeit der digitalen Schaltung die Impulsbreite eines einzelnen Taktzyklus überschreitet. Dies kann durch Erhöhen der CPU-Spannung überwunden werden. Es sollte jedoch beachtet werden, dass dies den Stromverbrauch (und damit die Wärmeabgabe) erhöht.

Wenn Sie also eine schnellere Taktrate wünschen, müssen Sie die Spannung erhöhen (die Elektronendriftgeschwindigkeit erhöhen ), um die Ausbreitungsverzögerung zu verringern. Wenn diese Verzögerung einen Taktzyklus überschreitet, verhält sich die CPU höchstwahrscheinlich nicht wie erwartet, und die darauf ausgeführte Software stürzt ab oder löst eine Ausnahme aus. Es gibt jedoch offensichtlich eine Grenze für die Spannung, die Sie durch einen Prozessor führen können, und dies wird durch das Design der CPU selbst bestimmt - hauptsächlich durch die Strombelastbarkeit der internen elektrischen Pfade.


Pipelining ermöglicht in einigen Fällen höhere Taktraten, da jeder Befehl in mehrere kleinere "Mikrooperationen" unterteilt ist. Diese Mikrooperationen sind sehr einfache Operationen, bei denen viel kleinere Schaltungen verwendet werden, die in einer Kette miteinander verbunden sind (im physikalischen Sinne ist die Ausbreitungsverzögerung durch eine bestimmte Untereinheit umso kürzer, je weniger Entfernung die Elektronen zurücklegen müssen).

Der zusätzliche Vorteil einer Pipeline-CPU besteht darin, dass Sie die Anzahl der pro Zeiteinheit ausgeführten Befehle auf Kosten eines komplexeren Entwurfs erheblich erhöhen können.

Warum einige Befehle mehr oder weniger Zyklen benötigen, hängt davon ab, welchen Befehl Sie ausführen. Beispielsweise gibt es im x86-Befehlssatz einen MOVSBefehl, der eine gesamte Zeichenfolge im Speicher von einem Ort an einen anderen verschieben kann. Natürlich können Sie eine lange Zeichenfolge nicht sofort kopieren, Sie können sie jedoch Wort für Wort kopieren und dabei mehrere Taktzyklen ausführen. Der MOVSBefehl benötigt daher eine variable Zeitdauer (abhängig von der Anzahl der zu kopierenden Zeichen).

Die Auswirkung von Operationen mit mehreren Zyklen ist bei einem RISC- Entwurf (dh ARM) weniger bemerkbar als bei einem CISC- Entwurf (dh x86). Dies liegt daran, dass RISC-basierte Entwürfe nur die am häufigsten verwendeten Elementaroperationen enthalten und viel einfacher in Pipelines zu verarbeiten sind, um einen Durchsatz von einem Befehl pro Zyklus zu erzielen.

Durchbruch
quelle
1

Wie lange Ihr Computer benötigt, um eine bestimmte Aufgabe zu erledigen, hängt nicht von der Taktrate des Computers ab. Es hängt davon ab, wie die Recheneinheiten entworfen und konstruiert sind.

Die Taktrate ist eigentlich eine (mehr oder weniger) willkürliche Entscheidung des CPU-Designers, manchmal aus guten Gründen (Effizienz), manchmal für schlechte (Werbung).

Angenommen, eine gegebene CPU verfügt über eine Mischung von Befehlen, deren Beendigung zwischen 1 und 100 Nanosekunden (ns) dauert. Sie können die Taktrate so einstellen, dass 1 "Tick" 100 ns (10 MHz) ist, was bedeutet, dass jeder Befehl in genau 1 Tick beendet wird. Wenn die Befehlsausführungszeiten jedoch gleichmäßig verteilt sind, bedeutet dies, dass Ihre Recheneinheiten 50% der Zeit im Leerlauf sind (die durchschnittliche Ausführungsgeschwindigkeit beträgt 50 ns, während die anderen 50 ns des Ticks im Leerlauf bleiben). Wenn Sie dagegen ein Häkchen von 10 ns festlegen, liegen die Anweisungen zwischen 1 und 10 Häkchen, aber die Einheit würde nie länger als 9 ns im Leerlauf sein, bevor die nächste Anweisung beginnt, und der durchschnittliche Leerlauf würde 5 ns betragen.

Während der Entwicklung wird eine CPU so ausgelegt, dass sie mit einer bestimmten Geschwindigkeit läuft, die davon abhängt, wie viel Arbeit die CPU tatsächlich leisten kann. Wenn Sie die Taktrate erhöhen oder verringern, ändern Sie nicht die Menge an Arbeit, die die CPU leisten kann, sondern nur den Wirkungsgrad.

(Und bevor Sie über das Übertakten von CPUs weinen: Dies bietet Ihnen zwei Vorteile, die zu echten Geschwindigkeitsgewinnen führen: Die schnelle Ausführung von Befehlen (die weniger als einen Zyklus dauern) führt zu schnelleren Ausführungszeiten, und alle Befehle haben weniger Leerlaufzeit. Beide Dies kann zwar die Arbeitsleistung Ihres Computers erhöhen, Sie werden jedoch feststellen, dass das Übertakten einer CPU um X% nicht immer einer um X% höheren Arbeitsleistung entspricht, wenn Sie sie als Benchmark verwenden.)

TL; DR

Eine CPU kann X-Arbeit in einer Sekunde erledigen. Wenn Sie H-Takt und I-IPC verwenden, haben wir I = X / H. Das Ändern von H ändert nicht X, aber es wirkt sich umgekehrt auf I aus.

Benjamin Chambers
quelle
1
Die Taktrate ist weit entfernt von einer willkürlichen Entscheidung. Es muss sorgfältig in Abhängigkeit von der CPU-Versorgungsspannung und den IC-Leiterbahnlängen ausgewählt werden (um übermäßige Ausbreitungsverzögerungen zu vermeiden).
Durchbruch
Ich denke, Sie haben die Tatsache übersehen, dass eine CPU ein synchroner digitaler Schaltkreis ist . Befehle benötigen keine X Nanosekunden (vorausgesetzt, Ihr Taktzyklus ist kürzer als die Laufzeit), alles geschieht mit einer steigenden oder fallenden Taktflanke - oder beidem. Befehle benötigen X Zyklen, keine X Zeiteinheiten. Ja, Sie können ändern, wie lange ein Zyklus dauert, aber die Unterscheidung ist, was wann passiert. Und schließlich hängt die Menge an Arbeit, die eine CPU in einer Sekunde leisten kann, von der Taktfrequenz ab, sodass Ihre Formel hier nicht wirklich überprüft wird.
cp2141
Eine CPU ist ein synchroner Zusammenschluss mehrerer asynchroner Einheiten. Clock-Ticks werden verwendet, um die Dinge in eine gute Linie zu bringen, aber sie bestimmen nicht, wie lange die Ausführung dauert ... Beispielsweise benötigt eine Ganzzahl-Addition eine bestimmte Zeit, die davon abhängt, wie weit der Strom durch die CPU fließen muss und wie schnell die Transistoren sind wechselt den Status. Das Ergebnis ist READ beim nächsten Takt, aber die eigentliche Berechnung wird während des gesamten Takts asynchron durchgeführt.
Benjamin Chambers
0

Man kann nicht sowohl hohe Befehle pro Zyklus als auch hohe Taktgeschwindigkeit haben, weil die Anforderungen widersprüchlich sind.

Man kann zeigen, dass der IPC in erster Näherung von der Komplexität (A) des Designs abhängt

IPC = a sqrt (A)

in der Erwägung, dass die maximale Frequenz (F), die mit der Konstruktionsskala erreicht werden kann, wie folgt lautet: [1]

F = 1 / {b + c sqrt (A)}

mit den Parametern a, b und c.

Eine Erhöhung der Komplexität des Muarch erhöht also den IPC auf Kosten der Verringerung der Arbeitsfrequenz, während eine Verringerung der Komplexität die Frequenz auf Kosten des IPC erhöht. Dies entspricht den beiden Extremfällen, die im Wikipedia-Artikel erwähnt wurden, aber die Wikipedia nennt die Namen nicht: Brainiac und Speed-Demon.

  • Brainiac-Design: Hoher IPC und niedrige Frequenz
  • Speed-Demon-Design: Hochfrequenz und niedriger IPC.

[1] Einige Autoren behaupten, der Ausdruck für die Frequenz sei stattdessen "1 / {b + c A}", aber in beiden Fällen verringert eine zunehmende Komplexität die maximal erreichbare Frequenz.

Juanrga
quelle