ALU (Arithmetisch Logische Einheit) Frage.
-
Ich habe einmal eine ALU in einem Programm für Simulation digitaler Schaltungen gebaut.
Sie ist, meiner Meinung nach, das wichtigste Teil eines Prozessors.
Sie hat
- Eingänge für zwei Operanden mit gleicher Anzahl der Stellen,
- einen (mehrstelligen) Eingang für den Operator (z.B. Addition, UND-verknüpfung, und andere)
- einen Ausgang für das Ergebnis (gleiche Anzahl der Stellen wie bei den Eingängen) und
- einen Status Ausgang.
Meine ALU hat dabei gleichzeitig alle möglichen Operationen ausgeführt. Also gab es z.B. das Ergebnis für Addition, UND-Verknüpfung und anderer Operation. Mit einem Multiplexer konnte man dabei einen der Ergebnisse auswählen der dann auf den Ausgang der ALU führt.
Meine Frage ist:
Funktionieren die ALUs in modernen prozessoren genau so?
Ich habe ausgerechnet:
Wenn man 64 bit prozessor so gebaut hätte, wären in der ALU vor dem Multiplexer bei 16 möglichen Operationen unglaubliche 16*64 =1024 Leitungen.
Dabei wären ja z.B. bei einer UND-Verknüpfung alle anderen 15 Ergebnisse einfach verworfen.
-
@neoexpert sagte in ALU (Arithmetisch Logische Einheit) Frage.:
Wenn man 64 bit prozessor so gebaut hätte, wären in der ALU vor dem Multiplexer bei 16 möglichen Operationen unglaubliche 16*64 =1024 Leitungen.
Nope, eine 64-bitter ALU saugt sich 64 Bits rein, dann die nächsten 64 Bits und verrechnet diese. Es reichen 64 Datenleitungen. Sogar noch weniger, wenn sich die ALU ein Datenwort in mehreren Takten reinzieht.
-
Ne warte, eine ALU hat doch immer 2 Eingänge?
Der Ausgang von dieser wird dann an einen Register gelegt um Zwischenergebnisse zu speichern. Meist wird dieser dann an einen Eingang der ALU gekoppelt.
-
Immer voll geil wenn Leute die die Frage nichtmal verstanden haben schlaue Antworten geben.
-
Ich weiß nicht, wie das in aktuellen Prozessoren aussieht, aber mir scheinen 16 Operationen in einer ALU etwas viel.
Möchte man unterschiedliche Operationen zum gewissen Teil nicht auch separieren um Sachen wie Pipelining zu betreiben?
-
@schlangenmensch
Addition
Multiplikation
Division
UND
ODER
XOR
NOT
VERGLEICH
Links/Rechts - VerschiebungAllen für die 9 oberen braucht man mindestens 4 Steuerleitungen (MAX 16 Operationen)
-
Man muss den Multiplexer ja nicht klassisch als ein Teil aufbauen der "zum Schluss" alles zusammenmischt. Man könnte auch die Ausgangsleitungen bei den einzelnen Rechen- bzw. Logikeinheiten vorbeileiten und jede Einheit bekommt ein Steuerbit das eben steuert ob der Pegel hoch bzw. niedergezogen wird bei ner 1 auf der jeweiligen Leitung in ihrem Ergebnis.
Wenn du 16 Operationen unterstützt dann musst du die 4 Bit die Operation angeben natürlich erstmal auf 16 Leitungen de-multiplexen, aber das ist ja noch keine problematische Grössenordnung. Die 1024 Leitungen hast du in Summe natürlich trotzdem, aber irgendwo hast du die sowieso wenn es 16 verschiedene je 64 Bit breite Recheneinheiten in der ALU gibt.
Eine andere Möglichkeit wäre mehrere Operationen in eine Einheit zusammenzufassen. z.B. alle logischen Operationen lassen in eine etwas kompliziertere Einheit mit ein paar NOT und NAND Blöcken zusammenfassen. Ebenso wird man vermutlich Shift und Rotate kombinieren können und vermutlich noch etliche andere Operationen.
Wie sowas in aktuellen (oder auch älteren) Chips aber wirklich aussieht weiss ich nicht. Bzw. nichtmal ob das nicht Überlegungen bei denen ein echter Chip-Designer nur traurig den Kopf schüttelt. Dazu hab' ich von Digitalelektronik im allgemeinen und Chip-Design im speziellen einfach zu wenig Ahnung.
-
Einen Aspekt, der eben durch das bereits erwähnte pipelining vorausgesetzt wird, sind feed forward paths, also Datenpfade die von der Alu zurück in den input laufen, um stalls zu vermeiden, wenn das Ergebnis einer Instruktion von der nächsten gebraucht wird.
Einzelne Operationen aufzuteilen, also eine Multiplikation in zwei pipeline stages aufzuspalten, ist durchaus bereits vorgekommen. Allerdings hat das auch einen Performancedefizit mit sich gebracht.
Ob man eine ALU in separate Einheiten für jede Operation aufspaltet, ist eine wiederum andere Frage. In einem uniskalaren Prozessor, in dem jeder Chip nur eine Instruktion pro Zyklus ausgeführt wird, wäre so etwas sinnlos, aber in einem superskalaren Prozessor können damit functional hazards vermieden werden. Mit pipelining hat das nichts mehr zu tun.