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
Antworten:
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:
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).
quelle
[EBX+ECX*4+100]
Formatadressierung).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.
quelle
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.
quelle
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
MOVS
Befehl, 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. DerMOVS
Befehl 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.
quelle
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.
quelle
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.
[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.
quelle