Wie kann eine CPU mehr als eine Anweisung pro Zyklus liefern?

41

Die Anleitung von Wikipedia für eine Sekunde besagt, dass ein i7 3630QM ~ 110.000 MIPS bei einer Frequenz von 3,2 GHz liefert. es wäre (110 / 3.2 Anweisungen) / 4 Kern = ~ 8.6 Anweisungen pro Zyklus pro Kern ?! Wie kann ein einzelner Kern mehr als einen Befehl pro Zyklus liefern?

Nach meinem Verständnis sollte eine Pipeline nur ein Ergebnis pro Takt liefern können.

Das sind meine Gedanken:

  • Die interne Frequenz ist tatsächlich höher als 3,2 GHz
  • Einige Teile der CPU sind auf eine Weise asynchron, die ein bescheidener Mensch wie ich nicht verstehen kann
  • Es gibt mehrere gleichzeitige Pipelines pro Kern
  • Eine Pipeline kann mehr als ein Ergebnis pro Takt liefern, ein Befehl kann Pipelinestufen überspringen und es gibt mehrere Prefetcher, die aktualisiert werden müssen
  • Mir fehlt etwas
arbeite weniger
quelle
1
Es liefert 110.000 Dhrystone- MIPS, also sehe ich DMIPS, nicht MIPS, direkt - vielleicht könnte dies einen Unterschied machen? Siehe en.wikipedia.org/wiki/Dhrystone

Antworten:

44

Erstens, wie Keelans Kommentar und die Antwort von Turbo J zeigen, betrug die Messung 113.093 Dhrystone MIPS, nicht native MIPS.

Die Ivy Bridge-Mikroarchitektur des i7 3630QM kann nur 4 verschmolzene µops pro Zyklus festschreiben, obwohl mit der Ausführung von 6 µops pro Zyklus begonnen werden kann. (Die Anzahl der verschmolzenen µops in einer Codespur entspricht in etwa der Anzahl der Befehle. Einige komplexe Befehle werden in mehrere µops decodiert, die nicht verschmolzen sind, und einige Befehlspaare können zu einem einzigen µop verschmolzen werden, z. B. umgehend verglichen werden gefolgt von einem bedingten Sprung.)

Zwei Ihrer Spekulationen darüber, wie mehrere Anweisungen in einem einzigen Zyklus ausgeführt werden können, sind durchaus gültig und wurden in tatsächlichen Prozessoren verwendet. Ihre erste Vermutung, dass eine schnellere interne Uhr verwendet wird, wurde in den "Feuerball" -ALUs des ursprünglichen Pentium 4 verwendet. Diese ALUs wurden mit der doppelten Frequenz des restlichen Kerns getaktet, die bereits relativ hoch war.

(Dies wurde erreicht, indem eine gestaffelte ALU verwendet wurde, bei der die untere Hälfte einer Addition in einem Zyklus durchgeführt wurde, wodurch eine abhängige Operation die untere Hälfte des Ergebnisses im nächsten Zyklus verwenden konnte. Für Operationen wie Addition, X oder Linksverschiebung Da nur die untere Hälfte der Operanden benötigt wird, um die gesamte untere Hälfte des Ergebnisses zu erzeugen, ermöglicht eine solche Staffelung - auch als Breiten-Pipelining bezeichnet - die Latenz von Einzelzyklusergebnissen sowie den Durchsatz von Einzelzyklen.)

Eine etwas verwandte Technik, kaskadierte ALUs, wurde vom HyperSPARC verwendet. Der HyperSPARC hat die Ergebnisse von zwei ALUs in eine dritte ALU eingespeist. Dies ermöglichte die Ausführung von zwei unabhängigen und einer dritten abhängigen Operation in einem einzigen Zyklus.

Ihre Spekulation, dass "es mehrere Pipelines pro Kern gibt", ist die andere angewandte Technik. Diese Art der Konstruktion wird als superskalar bezeichnet und ist bei weitem das gebräuchlichste Mittel, um die Anzahl der in einem einzelnen Zyklus ausgeführten Operationen zu erhöhen.

Es gibt auch ein paar andere Möglichkeiten der Befehlsausführung, die es wert sein könnten, zur Kenntnis genommen zu werden. Einige Operationen können außerhalb der normalen Ausführungseinheiten effizienter ausgeführt werden. Die Technik der Verschiebungseliminierung nutzt die Verwendung des Umbenennens von Registern in Prozessoren außerhalb der Reihenfolge aus, um Verschiebungsoperationen während des Umbenennens von Registern durchzuführen; Der Schritt kopiert einfach die physikalische Registernummer von einer Position in der Umbenennungstabelle zu einem anderen (eine Register - Alias - Tabelle genannt). Dies erhöht nicht nur effektiv die Ausführungsbreite, sondern beseitigt auch eine Abhängigkeit. Diese Technik wurde schon früh mit dem Stack-basierten x87-Prozessor eingesetzt, wird aber mittlerweile in den Hochleistungs-x86-Prozessoren von Intel weitgehend eingesetzt. (Durch die Verwendung destruktiver Anweisungen mit zwei Operanden in x86 ist die Bewegungseliminierung hilfreicher als in einem typischen RISC.)

Eine Technik, die der Bewegungseliminierung ähnelt, ist die Behandlung von Registernullungsanweisungen während des Umbenennens. Durch Bereitstellen eines Registernamens, der den Nullwert bereitstellt, kann eine Registerlöschanweisung (wie xor oder subtrahieren, wobei beide Operanden dasselbe Register sind) diesen Namen einfach in die Umbenennungstabelle (RAT) einfügen.

Eine andere Technik, die von einigen x86-Prozessoren verwendet wird, reduziert die Kosten für Push- und Pop-Vorgänge. Normalerweise müsste ein Befehl, der den Stapelzeiger verwendet, einen vollständigen Zyklus auf einen vorherigen Push oder Pop warten, um den Wert für den Stapelzeiger zu aktualisieren. Indem man erkennt, dass Push and Pop dem Stapelzeiger nur einen kleinen Wert hinzufügt oder davon subtrahiert, kann man die Ergebnisse mehrerer Additionen / Unteraktionen parallel berechnen. Die Hauptverzögerung für die Addition ist die Übertragausbreitung, aber bei kleinen Werten haben die höherwertigen Bits des Basiswerts - in diesem Fall der Stapelzeiger - nur höchstens einen Übertrag. Dies ermöglicht es, eine Optimierung ähnlich der eines Carry-Select-Addierers auf mehrere Additionen kleiner Werte anzuwenden. Da der Stapelzeiger in der Regel nur durch Konstanten aktualisiert wird,

Es ist auch möglich, Anweisungen zu einer einzigen, komplexeren Operation zusammenzuführen. Während der umgekehrte Prozess des Aufteilens von Anweisungen in mehrere, einfachere Operationen eine alte Technik ist, kann das Zusammenführen von Anweisungen (von Intel als Makro-Op-Fusion bezeichnet) der Implementierung ermöglichen, Operationen zu unterstützen, die komplexer sind als diejenigen, die im Befehlssatz angegeben sind.

Theoretisch wurden andere Techniken vorgeschlagen. Kleine Konstanten ungleich Null könnten in der RAT unterstützt werden, und einige einfache Operationen, die solche kleinen Werte verwenden oder zuverlässig erzeugen, könnten frühzeitig behandelt werden. ("Physical Register Inlining" von Mikko H. Lipasti et al., 2004, schlug vor, die RAT als Mittel zur Reduzierung der Registeranzahl zu verwenden, die Idee könnte jedoch dahingehend erweitert werden, dass das Laden kleiner Sofort- und einfacher Operationen für kleine Zahlen unterstützt wird.)

Bei Trace-Caches (die Befehlsfolgen unter bestimmten Annahmen des Kontrollflusses speichern) kann es möglich sein, Operationen, die durch Verzweigungen getrennt sind, zusammenzuführen und Operationen zu entfernen, die nicht verwendete Ergebnisse im Trace ergeben. Das Zwischenspeichern der Optimierungen in einem Trace-Cache kann auch zur Durchführung von Optimierungen wie dem Zusammenführen von Befehlen anregen, die sich möglicherweise nicht lohnen, wenn sie bei jedem Abrufen des Befehlsstroms durchgeführt werden müssen.

Mithilfe der Wertevorhersage kann die Anzahl der Operationen erhöht werden, die parallel ausgeführt werden können, indem Abhängigkeiten entfernt werden. Ein schrittbasierter Wertevorhersager ähnelt der bereits erwähnten Pop / Push-Optimierung einer speziellen Stack-Engine. Es kann mehrere Hinzufügungen meistens parallel berechnen, wodurch die Serialisierung entfernt wird. Die allgemeine Idee der Wertvorhersage ist, dass mit einem vorhergesagten Wert abhängige Operationen ohne Verzögerung fortgesetzt werden können. (Die Vorhersage der Verzweigungsrichtung und des Ziels ist praktisch nur eine sehr eingeschränkte Form der Wertvorhersage, die das Abrufen folgender Befehle ermöglicht, die vom "Wert" der Verzweigung abhängen - genommen oder nicht - und von der nächsten Befehlsadresse, einem anderen Wert.)

Paul A. Clayton
quelle
genial! Vielen Dank für die wertvollen Informationen. Könnten Sie ein Buch vorschlagen, in dem ich all diese architektonischen Techniken lesen kann?
arbeitslos
@workless Wenn Sie über die Grundlagen des Pipelining und der superskalaren Ausführung von Fehlern (die in den meisten Lehrbüchern zur Computerarchitektur behandelt werden) hinausgehen, sind die besten Informationsquellen wahrscheinlich Beschreibungen spezifischer Prozessor-Mikroarchitekturen (wie der Artikel zu Haswell linked) in der Antwort von gnasher729 ) und wissenschaftliche Arbeiten (ISCA und MICRO [Konferenzen] haben im Allgemeinen gute Arbeiten; HPCA, PACT, ASPLOS und vielleicht auch einige andere haben einen guten Ruf). Andy Glew (vielleicht am berühmtesten für seine Arbeit am Pentium Pro) ...
Paul A. Clayton
1
... arbeitete an einem CompArch-Wiki, das fortgeschrittenere Konzepte präsentieren würde, aber der Fortschritt war langsam und es wurde anscheinend vor einiger Zeit gehackt und gibt daher nur eine Fehlermeldung aus ( semipublic.comp-arch.net/wiki ). Er beabsichtigt, das Wiki (der ursprüngliche Text wurde beibehalten) mit einer anderen Wiki-Software wiederherzustellen (er hatte einige Probleme mit der von ihm verwendeten Software und nutzt dies als Gelegenheit, um Verbesserungen vorzunehmen), aber "Es wird eine Weile dauern."
Paul A. Clayton
Ein gutes Beispiel für den Erfolg der superskalaren Architektur war das HyperThreading von Intel. Bei all diesen Optimierungen stellten die Ingenieure von Intel fest, dass etwa 30% der ALU die meiste Zeit ungenutzt waren, weil der Speicher nicht schnell genug einfließen kann Pipeline kann nicht effizient genug gefüllt werden. Mit HyperThreading erhalten Sie im idealen Szenario eine Menge Arbeit kostenlos. Es ist weit weniger als ein separater neuer Kern, aber es ist auch weitaus billiger (und es kann auch mit Mehrkern kombiniert werden).
Luaan
@ PaulA.Clayton - Zwei Captures dieser Seite sind auf Wayback. 20. Dezember 2013 und 14. Februar 2014 . Ich weiß nicht, ob diese Captures älter sind als die Probleme mit der Seite. Beim Versuch, diese Seiten auf Wayback zu besuchen, ist leider die Meldung " Schade. Der Rechner, auf dem diese Datei bereitgestellt wird, ist ausgefallen. Wir arbeiten daran. " .
Kevin Fegan
10

Ein wenig dunkle Magie passiert im Inneren moderner Prozessoren, aber Ihre Gedanken sind definitiv auf dem richtigen Weg.

Der Schlüssel zum Verständnis der Effizienz moderner Prozessoren liegt in der Erkenntnis, dass sie superskalar sind . Aus Wikipedia (Schwerpunkt meiner):

Eine superskalare CPU-Architektur implementiert eine Form von Parallelität, die als Parallelität auf Befehlsebene in einem einzelnen Prozessor bezeichnet wird. Dies ermöglicht einen schnelleren CPU-Durchsatz, als dies bei einer bestimmten Taktrate möglich wäre .

Wie Sie vermutet haben diese modernen Prozessoren mehrere Ausführungseinheiten pro Kern. Es ist interessant, Hyper-Threading in Betracht zu ziehen. Einige Teile der Pipeline sind dupliziert, andere nicht.

Die Ausführung außerhalb der Reihenfolge ist ebenfalls interessant zu lesen, beantwortet Ihre Frage jedoch nicht direkt. Es verringert jedoch die Anzahl der "verschwendeten" CPU-Zyklen.

Die Effizienz wird auch durch viele andere Faktoren beeinträchtigt, die zu einem Blockieren des Prozessors führen können, einschließlich (aber nicht ausschließlich):

  • Die Ergebnisse der vorherigen Anweisungen sind nicht verfügbar.
  • Cache verfehlt.
  • Die Code-Verzweigung, die bereits abgerufene Anweisungen ungültig machen würde (lesen Sie hier und hier über die Verzweigungsvorhersage ).

Moderne Compiler versuchen bei vielen der oben genannten Punkte zu helfen, der Prozessor übernimmt dann. Ein gutes Beispiel finden Sie in dieser Frage an einer anderen Stelle von Stackexchange, die einen wichtigen Unterschied zwischen zwei Befehlen hervorhebt, die (unter bestimmten Umständen) dasselbe tun können. Aufgrund der verwendeten Ausführungseinheit kann jedoch einer auf einigen Prozessoren "schneller" als der andere sein.

Eine vom Menschen lesbare Erklärung der modernen CPU-Pipeline finden Sie unter Eine Reise durch die CPU-Pipeline . Für eine etwas technischere Erklärung siehe das Microarchitecture Paper von Agner Fog .

David
quelle
Vielen Dank für die Erklärung und die sehr interessanten Links. Da Cell sehr interessant aussieht , freue ich mich darauf, mehr über CPU-Architekturen zu lernen ^ _ ^. "" Der x86 verwendet eine "Superpipeline" wie oben beschrieben. Die Cell-Familie verwendet einen "synergistischen" Ansatz, an dem neun Mini-CPUs beteiligt sind. Es ist wahr , dass jeder Mini-CPU eine meist in Ordnung Pipeline folgt, der Mini-CPUs verfügt über mehrere parallele superskalare Pipeline , anstatt eine einzige Pipeline „““.
workless
3

Was denkst du, ist passiert? Alle Ingenieure bei Intel, AMD und IBM haben gelesen, dass eine Pipeline nur ein Ergebnis pro Zyklus liefern kann. Oder haben sie das gelesen und gesagt: "Kann nicht mehr als ein Ergebnis pro Zyklus liefern? Das werden wir sehen!".

Für eine gute Einführung in die Haswell-Architektur können Sie beispielsweise diesem Link folgen: http://www.realworldtech.com/haswell-cpu/ oder Sie gehen einfach auf die Intel-Website und dort finden Sie einige Dokumentationen.

Jeder Kern des Haswell-Prozessors verfügt über eine große Anzahl von Ausführungseinheiten, die voneinander unabhängige Vorgänge ausführen können, sodass mehrere Vorgänge parallel ausgeführt werden können. Als nächstes verfügt der Haswell-Prozessor über mehrere Ausführungseinheiten, die Vektoroperationen mit einer Größe von bis zu 256 Bit verarbeiten. Eine Vektoroperation könnte beispielsweise vier Gleitkommaoperationen mit doppelter Genauigkeit oder acht Gleitkommaoperationen mit einfacher Genauigkeit in einer Vektoroperation ausführen. Und schließlich unterstützt der Haswell-Prozessor "Fused Multiply-Add", was bedeutet, dass die Berechnung von a-Zeiten b plus c nur eine einzige Operation ist.

Das theoretische Maximum, da Haswell zwei Einheiten hat, die in der Lage sind, Multiplikationen zu addieren, sind zwei Multiplikationsoperationen pro Zyklus, wobei jede Operation acht Multiplikationen mit einfacher Genauigkeit plus Additionen oder 32 Gleitkommaoperationen mit einfacher Genauigkeit ausführt.

Der 3630-Prozessor ist nicht in der aktuellen Preisliste von Intel enthalten, aber es gibt Modelle wie den 3740QM mit vier Kernen. Anstelle von 32 können Sie also 128 Gleitkommaoperationen pro Taktzyklus erhalten. Dies ist das theoretische Maximum. Die Hälfte davon im wirklichen Leben zu erreichen, ist eine Herausforderung, aber für geeignete Aufgaben nicht unmöglich. Es gibt andere Prozessoren mit bis zu 15 Kernen (für Preise, die nicht einmal die fanatischsten Gaming-Fanatiker bezahlen werden).

Sie haben also eine Kombination aus mehreren Multiplikatoren:

  1. Mehrere Kerne pro Prozessor.
  2. (Hyperthreading, das noch nicht erwähnt wurde, ermöglicht es Ihnen, sich den theoretischen Grenzen zu nähern.)
  3. Eine verschmolzene Multiplikations-Additions-Operation führt zwei arithmetische Operationen aus, die nur als eine zählen.
  4. 256-Bit-Vektoren für 8 Operationen, die nur als eine zählen.
  5. Zwei Vektorausführungseinheiten, die Fused-Multiply-Add verarbeiten können.

8.6 Operationen pro Zyklus sind nicht allzu schwer zu erreichen. Selbst 8,6 Operationen pro Zyklus pro Kern sind nicht allzu schwierig.

gnasher729
quelle
Ich frage mich, ob es praktisch oder vorteilhaft wäre, eine CPU mit einigen Kernen zu entwerfen, auf denen x86 lief, und mit einigen, die einen Befehlssatz lief, der für superskalares Verhalten optimiert wurde. Ich weiß, dass Intel und AMD einige erstaunliche Dinge tun, um die Einschränkungen im x86-Befehlssatz zu umgehen, aber in einigen Fällen würde ich denken, dass es hilfreich sein würde, einige Dinge zu kennen, die der aktuelle Befehlssatz nicht ausdrücken kann. Beispielsweise sollten unterschiedliche Versionen von ADDAnweisungen basierend darauf, ob der Überlauf nicht beeinträchtigt werden soll oder festgelegt werden soll, wenn ein Überlauf auftritt (und festgelegt werden, wenn dies nicht der Fall ist).
Superkatze
1
Ich bin traurig darüber, dass viele Sprachen heutzutage nicht mehr auf Überlauf achten. Ich weiß, dass Java ziemlich an semantischen Anforderungen festhält, aber in Sprachen wie C #, die sowohl Trapping- als auch Nicht-Trapping-Arithmetikoperatoren enthalten, ist der einzige gute Grund, warum ich keinen Überlauf fange, der, weil man ein Wrapping-Verhalten benötigt. Gegenwärtig kann die Überlaufprüfung eine erhebliche Geschwindigkeitsstrafe nach sich ziehen, aber wenn eine Maschinensprache mit der Idee entworfen würde, dass das Überlauf-Trapping nicht präzise sein muss, solange der Code sicherstellen kann, dass vor dem Betrieb keine Überläufe aufgetreten sind ...
supercat
... bestimmte kritische Punkte erreicht, sollte es möglich sein, den Overflow-Trapping-Overhead auf nahezu Null zu reduzieren. Wenn der Code eine Berechnung durchführt und dann einen Wert an einer Stelle speichert, die bei einem Überlauf der ersten Berechnung verlassen wird, sollte es nicht erforderlich sein, den Speicher zu verzögern, bis der Prozessor weiß, ob die erste Berechnung erfolgreich ist, der Prozessor jedoch derzeit keine Möglichkeit hat das zu wissen. Wenn Code einfach alle Vorgänge ausführen könnte, die sicher ausgeführt werden können, ob ein Überlauf aufgetreten ist oder nicht, und dann prüfen, ob bei einem dieser
Vorgänge
... das scheint zu helfen, Ausführungsabhängigkeiten zu reduzieren.
Supercat
2

Der Drystone-Benchmark stammt aus dem Jahr 1984, und die entsprechende nominelle 1-MIPS-VAX-Maschine ist in moderner Hinsicht nicht sehr effizient. Sogar ein Cortex M3 liefert 1,25 DMPIS / MHz.

Intel Core Architekturprozessoren können in der Tat mehrere Befehle parallel in einem einzigen Kern ausführen, da mehrere Recheneinheiten vorhanden sind.

Turbo J
quelle
1

Ich habe sehr viel von Ars Technicas Jon "Hannibal" Stokes hervorragenden und umfangreichen Artikeln zum Thema Mikroprozessorarchitektur gelernt. Die Artikel sind etwas veraltet (sie scheinen aus dem Jahr 2004 zu stammen), aber immer noch sehr aktuell.

Einige der Links zum nächsten Teil eines Artikels sind m-fehlerhaft. Sie können sie jedoch anscheinend selbst beheben, indem Sie die URL des ersten Teils und die fehlerhafte URL der nächsten Seite sorgfältig vergleichen (z. B. indem Sie etwas in die URL einfügen).

(Ja, dies ist eine verherrlichte Antwort, sorry, die Artikel sind zu gut, um sie nicht zu erwähnen.)

marcelm
quelle