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