Hinter den Kulissen der x86-Pipeline

Wir haben oft gehört, dass moderne x86-Prozessoren x86-Anweisungen nicht wirklich ausführen. Stattdessen dekodieren sie sie in RISC-Anweisungen, die einfacher zu planen, weiterzuleiten und auszuführen sind. Aber wir haben diese Aussage nie wirklich untersucht, um herauszufinden, ob sie wahr ist. [Fanael] hat es jedoch getan, und die Ergebnisse sind sehr interessant.

Die Nachricht beginnt mit einer sehr einfachen Schleife, die vier Anweisungen enthält. In einem typischen RISC-Prozessor – RISC-V – erfordert dieselbe Schleife sechs Anweisungen. Eine moderne CPU kann jedoch wahrscheinlich viel mehr, als nur blind einen Befehlssatz in einen anderen umzuwandeln.

Der Grund dafür ist, dass CPUs darauf abzielen, die Anzahl der in einem Taktzyklus ausgeführten Operationen (im Durchschnitt) zu erhöhen. Es gibt viele Möglichkeiten, die Anweisungen pro Takt zu maximieren. Eine Möglichkeit hierfür ist das Pipelining, bei dem Sie Anweisungen in mehreren Phasen ausführen. Sie können beispielsweise eine Anweisung laden, während Sie eine zweite Anweisung dekodieren und eine dritte ausführen.

Es gibt jedoch ein Problem. Angenommen, Sie addieren drei Zahlen und erhöhen dann in einer Schleife einen Zähler, und die drei Zahlen hängen nicht vom Zähler ab. In einer typischen Pipeline müssen Sie warten, bis die Ergänzungen abgeschlossen sind, bevor Sie den Zähler erhöhen und die Schleife fortsetzen können. Bei einem Pipeline-Ausfall könnte die CPU jedoch herausfinden, dass sie die Inkrementierung parallel zu den Hinzufügungen durchführen kann. Um den Parallelbetrieb weiter zu verbessern, kann das Umbenennen von Registern es dem Prozessor ermöglichen, die Ergebnisse in einem temporären Register abzulegen, das Sie später festschreiben oder löschen können.

Der P6 von 1995 war der erste x86, der eine Out-of-Order-Ausführung durchführte. Dieser Prozessor wandelt tatsächlich x86-Anweisungen in RISC-Anweisungen um. Allerdings verfügte der Pentium M über eine Fusion von Mikrooperationen, die es dem Prozessor ermöglichte, bestimmte Operationen als Paare zu behandeln, und jede nachfolgende Architektur entfernte sich immer weiter vom P6-Modell.

Es ist ein interessanter Blick hinter die Kulissen. Moderne Computer sind intern sehr kompliziert. Wenn Sie einen detaillierten Überblick über das Pipelining wünschen, können wir Ihnen ebenfalls helfen.

Hinter den Kulissen der x86-Pipeline

Wir haben oft gehört, dass moderne x86-Prozessoren x86-Anweisungen nicht wirklich ausführen. Stattdessen dekodieren sie sie in RISC-Anweisungen, die einfacher zu planen, weiterzuleiten und auszuführen sind. Aber wir haben diese Aussage nie wirklich untersucht, um herauszufinden, ob sie wahr ist. [Fanael] hat es jedoch getan, und die Ergebnisse sind sehr interessant.

Die Nachricht beginnt mit einer sehr einfachen Schleife, die vier Anweisungen enthält. In einem typischen RISC-Prozessor – RISC-V – erfordert dieselbe Schleife sechs Anweisungen. Eine moderne CPU kann jedoch wahrscheinlich viel mehr, als nur blind einen Befehlssatz in einen anderen umzuwandeln.

Der Grund dafür ist, dass CPUs darauf abzielen, die Anzahl der in einem Taktzyklus ausgeführten Operationen (im Durchschnitt) zu erhöhen. Es gibt viele Möglichkeiten, die Anweisungen pro Takt zu maximieren. Eine Möglichkeit hierfür ist das Pipelining, bei dem Sie Anweisungen in mehreren Phasen ausführen. Sie können beispielsweise eine Anweisung laden, während Sie eine zweite Anweisung dekodieren und eine dritte ausführen.

Es gibt jedoch ein Problem. Angenommen, Sie addieren drei Zahlen und erhöhen dann in einer Schleife einen Zähler, und die drei Zahlen hängen nicht vom Zähler ab. In einer typischen Pipeline müssen Sie warten, bis die Ergänzungen abgeschlossen sind, bevor Sie den Zähler erhöhen und die Schleife fortsetzen können. Bei einem Pipeline-Ausfall könnte die CPU jedoch herausfinden, dass sie die Inkrementierung parallel zu den Hinzufügungen durchführen kann. Um den Parallelbetrieb weiter zu verbessern, kann das Umbenennen von Registern es dem Prozessor ermöglichen, die Ergebnisse in einem temporären Register abzulegen, das Sie später festschreiben oder löschen können.

Der P6 von 1995 war der erste x86, der eine Out-of-Order-Ausführung durchführte. Dieser Prozessor wandelt tatsächlich x86-Anweisungen in RISC-Anweisungen um. Allerdings verfügte der Pentium M über eine Fusion von Mikrooperationen, die es dem Prozessor ermöglichte, bestimmte Operationen als Paare zu behandeln, und jede nachfolgende Architektur entfernte sich immer weiter vom P6-Modell.

Es ist ein interessanter Blick hinter die Kulissen. Moderne Computer sind intern sehr kompliziert. Wenn Sie einen detaillierten Überblick über das Pipelining wünschen, können wir Ihnen ebenfalls helfen.

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow