Unterschied zwischen Mikrooperationen in RISC- und CISC-Prozessoren

Ich habe gelesen, dass die modernen Intel-Prozessoren die CISC-Anweisungen oben verwenden, die am Back-End in RISC-ähnliche einfachere Anweisungen in Form von Mikrooperationen umgewandelt werden.

Wenn Intel Micro-Ops also RISC-ähnliche einfache Hardware-Level-Steuerungen sind, was machen dann die ARM Micro-Operations?

Da ARM-Anweisungen bereits ziemlich RISC-ähnlich sind, wie würde ihre Mikrooperationsform aussehen?

+1 Diese Frage hat eine einfache, offensichtliche (und richtige) Antwort, aber das macht sie nicht zu einer schlechten Frage oder einem zu schließenden Kandidaten.
ARM hat eine festverdrahtete Steuereinheit.

Antworten (3)

Alle Mikroprozessoren, ja alle synchronen Digitalschaltungen arbeiten in einer sogenannten "Register Transfer Level". Grundsätzlich lädt jeder Mikroprozessor nur Werte aus verschiedenen Quellen in Register. Diese Quellen können Speicher, andere Register oder die ALU (Artihmitical-Logical Unit, ein Rechner im Prozessor) sein. Einige der Register sind einfache Register innerhalb des Prozessors, einige Register können Spezialfunktionsregister sein, die sich rund um die CPU befinden, in „Peripheriegeräten“ wie E/A-Ports, Speicherverwaltungseinheit, Unterbrechungseinheit, dies und das.

In diesem Modell sind "Anweisungen" grundlegende Sequenzen von Registerübertragungen. Normalerweise ist es nicht sinnvoll, dem Programmierer die Möglichkeit zu geben, jeden Registertransfer einzeln zu steuern, da nicht alle möglichen Registertransferkombinationen sinnvoll sind, so dass es hinsichtlich des Speicherverbrauchs verschwenderisch wäre, dem Programmierer zu erlauben, sie alle auszudrücken. Im Grunde deklariert also jeder Prozessor eine Reihe von Sätzen von Registerübertragungen, die der Programmierer dem Prozessor auffordern kann, und diese werden als "Anweisungen" bezeichnet.

Beispielsweise könnte ADD A, B, C eine Operation sein, bei der die Summe der Register A und B in Register C platziert wird. Intern wären das drei Registerübertragungen: Laden Sie den linken Eingang des Addierers von A, laden Sie dann den rechten Eingang des Addierers von B Lade C vom Addiererausgang. Zusätzlich führt der Prozessor die notwendigen Übertragungen durch, um das Speicheradressenregister vom Programmzähler zu laden, das Befehlsregister vom Speicherdatenbus zu laden und schließlich den Programmzähler vom Programmzähler-Inkrementierer zu laden.

Der 8086 verwendete eine interne ROM-Nachschlagetabelle, um zu sehen, welche Registerübertragungen jede Anweisung ausführen. Der Inhalt dieses ROM war von den Designern der 8086-CPU ziemlich frei programmierbar, sodass sie Befehlssequenzen wählten, die dem Programmierer nützlich erschienen, anstatt Sequenzen zu wählen, die von der Maschine einfach und schnell auszuführen wären. Denken Sie daran, dass damals die meiste Software in Assemblersprache geschrieben wurde, also war es sinnvoll, dies für den Programmierer so einfach wie möglich zu machen. Später entwarf Intel 80286, in dem sie, wie es jetzt aussieht, einen kritischen Fehler machten. Sie hatten noch etwas ungenutzten Mikrocode-Speicher übrig und dachten, dass sie ihn genauso gut mit etwas füllen könnten, und kamen mit einer Reihe von Anweisungen, nur um den Mikrocode zu füllen. Das hat sie am Ende gebissen, da all diese zusätzlichen Anweisungen von den 386, 486,

ARM ist ein viel neueres Prozessordesign als der 8086, und die ARM-Leute haben einen anderen Designweg eingeschlagen. Zu dieser Zeit waren Computer weit verbreitet und es gab viele Compiler. Anstatt also einen Befehlssatz zu entwerfen, der für den Programmierer angenehm ist, wählten sie einen Befehlssatz, der für die Maschine schnell auszuführen und für den Compiler effizient ist, um Code zu generieren. Und für eine Weile unterschieden sich X86 und ARM in der Art und Weise, wie sie Anweisungen ausführen.

Dann vergeht die Zeit und CPUs werden immer komplexer. Und auch Mikroprozessoren werden mit Computern und nicht mit Bleistift und Papier entworfen. Niemand verwendet mehr Mikrocode, alle Prozessoren haben eine fest verdrahtete (reine Logik) Ausführungssteuereinheit. Alle haben mehrere ganzzahlige Berechnungseinheiten und mehrere Datenbusse. Alle übersetzen ihre eingehenden Anweisungen, planen sie um und verteilen sie an die Verarbeitungseinheiten. Sogar alte RISC-Befehlssätze werden in neue RISC-Operationssätze übersetzt. Die alte Frage RISC versus CISC existiert also nicht mehr wirklich. Wir sind wieder zurück auf der Ebene der Registerübertragung, Programmierer bitten die CPUs, Operationen auszuführen, und die CPUs übersetzen sie in Registerübertragungen. Und ob diese Übersetzung von einem Mikrocode-ROM oder festverdrahteter digitaler Logik durchgeführt wird, ist wirklich nicht mehr so ​​​​interessant.

"Niemand verwendet mehr Microcode ... Ich verwende einen x86-Prozessor und erhalte häufig Microcode-Updates. Daher halte ich diese Aussage für falsch.
Shashank, ja, nun, die Welt hat sich wieder einmal verändert. Heutzutage gibt es so viele verschiedene Arten der Programmierbarkeit (FPGA-Fabric usw.), dass die Aussage in "Niemand verwendet mehr Microcode-ROM" geändert werden sollte, was immer noch zumindest einigermaßen wahr wäre. Aber ja, die Umprogrammierbarkeit wird immer mehr eingeführt, insbesondere in Opcode-Übersetzungseinheiten. Insofern kommen die alten Zeiten wieder zurück. Jemand, der an die zirkuläre Zeit glaubt, sollte glücklich sein ...

Die Idee, dass „in modernem x86 ein RISC vorhanden ist“, ist ziemlich irreführend. Ich habe den Eindruck, dass es zuerst von Intel als Marketingtrick erzählt wurde, als sie den i486 herausbrachten, der der erste x86 mit Pipeline war und viele Befehle in einem Zyklus ausführen konnte, wie zeitgenössische RISC-CPUs.

Das Problem ist, dass es bei RISC und CISC um Befehlssätze geht (die für den Assembly-Programmierer sichtbar sind), nicht um interne Mikroarchitektur. x86 wurden als mikrocodiert (8086), Pipeline (80486), OoO mit Mikrooperationen (PentiumPro), VLIW (Transmeta) ... entworfen.

Zurück zur Frage.

Die Mikrooperationen bilden nicht wirklich einen Befehlssatz, sie ähneln eher den Signalen, die eine Pipeline durchlaufen, Lese- und Schreibregister auswählen, ALU-Operationen ...

Die meisten ARM-Befehle können in einem Schritt ausgeführt werden, während viele x86-Befehle in eine Folge von 2 oder mehr Mikrooperationen geknackt werden müssen, aber es gibt kaum einen Unterschied.

In OoO-CPUs werden Teile dieser Informationen in FIFOs und Puffern als Reservierungswarteschlangen, Neuordnungspuffer ... gespeichert. Diese Teile der Anweisungen sind zwischen ARMs und x86s im Prinzip sicherlich ziemlich ähnlich, aber es gibt kein "RISC im Inneren".

Die Idee der RISC-in-CISC-Implementierung begann mit Micro-Ops. Ich glaube, ich habe die Broschüre noch irgendwo auf Lager. Es bezieht sich auf die Micro-Ops-Architektur – die CPU-Designer können eine schnelle RISC-CPU entwerfen und dann einen Übersetzer hinzufügen (Intel nannte es die „Crack“-Stufe), um die CISC-Anweisungen in einen gleichwertigen Satz von RISC-Anweisungen für die Kern-CPU umzuwandeln ausführen.

Die ARMs verwenden keine Micro-Ops!!

ARM verwendet Micro-Ops. Was es nicht verwendet, ist Mikrocode. Eine festverdrahtete Steuereinheit hat keinen Mikrocode, aber das schließt die Möglichkeit von Mikrooperationen nicht aus. In ARM werden Anweisungen durch eine festverdrahtete Steuerung in Mikrobefehle dekodiert.
@Kraken: Obwohl die Möglichkeit besteht, bezweifle ich stark, dass eine ARM-Variante Micro-Ops verwendet. Das liegt daran, dass jeder ARM-Befehl bereits ein Micro-Op ist. Was einige ARM-Chips stattdessen haben, ist das Gegenteil von Micro-Ops - Daumenanweisungen werden zu einer äquivalenten gewöhnlichen Anweisung ERWEITERT. Befehlsdecodierung in Signale ist genau das: Decodierung. Zu diesem Zeitpunkt ist es keine "Operation" mehr - es sind nur Signale. Einige CPUs speichern die decodierten Signale in einem Zwischenregister (z. B. dem sowjetischen Elbrus), aber dieses decodierte Signal ähnelt eher einem VLIW-Befehl als einem Mikrobefehl.
@slebetman Das macht natürlich Sinn. Aber vor einiger Zeit habe ich dieses Dokument über einen Cortex-Prozessor gelesen, der Mikrooperationen für komplexe Funktionalitäten hat. Deshalb habe ich diese Frage gestellt. Vielleicht verwenden sie den Begriff, um sich auf etwas anderes zu beziehen ...
@Kraken: In solchen Fällen handelt es sich tatsächlich um Micro-Ops. Tut mir leid, das war mir nicht bewusst. Was passiert ist, dass einige Funktionalitäten wie die Quadratwurzel nicht direkt in der Hardware implementiert sind, um Platz zu sparen. Die Anweisungen lösen stattdessen Traps/Interrupts aus. Von dort aus hat der Designer zwei Möglichkeiten: entweder eine Reihe von Anweisungen einzufügen, die das gewünschte Ergebnis in den Anweisungsstrom (Micro-Ops) berechnen, oder einfach die Falle zu dokumentieren und OS-Programmierer/Compiler-Autoren die Funktion in Software implementieren zu lassen ( Emulation).