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
microprocessor
cpu
computer-architecture
arbeite weniger
quelle
quelle
Antworten:
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.)
quelle
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):
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):
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 .
quelle
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:
8.6 Operationen pro Zyklus sind nicht allzu schwer zu erreichen. Selbst 8,6 Operationen pro Zyklus pro Kern sind nicht allzu schwierig.
quelle
ADD
Anweisungen 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).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.
quelle
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.)
quelle