Hallo!
Wozu benötigt man eigentlich soviele Transistoren? Die
Erhöhung der Frequenz sollte doch reichen. Mit einem einzigen
Halbaddierer, der mit 1 GHz getaktet ist, kann man doch schon
1 Milliarde Additionen pro Sekunde vollziehen. Wozu brauch man
dann in einem Prozessor mehr als vier Transistoren?
Hallo?
Ist dir eigentlich klar, was so eine CPU überhaupt macht?
Sie arbeitet ein Programm ab!
Das bedeutet, es muss zuallerst mal einen Zeiger geben, an welcher Stelle wir uns im Programm überhaupt befinden. Und wenn wir nicht einfach linear arbeiten, sondern mit Schleifen und Sprüngen arbeiten (und das müssen wir, sonst läuft dein Additions-Programm bei 1 GHz schon nach wenigen Sekunden vor die Wand - weil der Arbeitsspeicher zu Ende geht), mussen auch Rücksprung-Adressen abgespeichert werden.
Im Übrigen gibt es keine einfache Addition:
-
Der Befehl wird zuerst aus dem Arbeitsspeicher geholt.
-
Dann wird der Befehl decodiert.
-
Dann wird der erste Operand aus dem Speicher, oder einem internen Register in die Rechenregister geschrieben.
-
Dann das gleiche mit dem zweiten Operanden.
-
Dann wird die Rechenorperation durchgeführt.
Und eine „simple“ Addition gibt es dabei gar nicht. Eine Addition ist eine logische XOR-Verknüpfung mit Überlaufkontrolle.
-
Je nach Operation werden dann Statusregister überprüft (Denn ohne würde 200 + 200 in einem 8-Bit-System 144 ergeben . . . also wird das Überlaufregister geprüft, bei Divisionen muss es eine Abfrage auf Division durch Null geben und und und).
-
Nach der Operation muss das Ergebniss zurückgeschrieben werden - sonst wird es mit dem nächsten Befehl einfach überschrieben.
-
Dann wird der Programmzähler eins hochgesetzt.
Und jetzt können wir erst den nächsten Befehl laden.
Jeder Befehl dauert viele Taktzyklen - bei sehr komplexen Operationen können das sogar weit über 100 Tatktzyklen sein. Selbst die allereinfachste 8-Bit-CPU kannst du nicht unter einigen tausend Transtoren bauen.
Und damit das ganze immer schneller geht, wird getrickst: statt einen Befehl nach dem anderen abzuarbeiten, läuft die Verarbeitung gleichzeitig: Während das Ergebniss unseren Befehls gerade zurückgeschrieben wird, wird der nächste gerade berechnet, für die übernächsten werden die Operanden geholt, der überübernächste wird gerade dekodiert und der überüberübernächste schon mal aus dem Speicher geholt. Das nennt sich Pipelining, und nur dadurch sieht es so aus, als wenn Befehle nur wenige oder gar nur Bruchteile von Taktzyklen dauern würden.
Das klappt natürlich nur, wenn die Befehl schön hinter einander kommen. Was sie eher selten sind, in jedem normalen Programm taucht alle paar Befehle eine Wenn-dann-sonst-Abfrage auf - und dann bricht die Pipeline natürlich zusammen, weill sie ja nicht weiss, wo es weitergeht.
Also bastelt man komplizierte „Branch-Prediction-Units“, die versuchen, vorherzusagen, wo es mit der höchsten Wahrscheinlichkeit weitergeht, und dann kann man dort spekualtiv schon mal weitermachen - was im Falle eine Irrtums zu heftigen Aufräumarbeiten führt, weill dann völlig falsche Zahlen rumliegen. Muss auch alles verwaltet werden, frisst richtig Transistoren.
Und dazu nimmst du jetzt noch spezialisierte Einheiten für die wirklch komplizierten Sachen wie Rechnen mit gebrochenen Zahlen (FPU), rechnen mit Matices (SSE 1, 2, 3), einen Cache, um die Geschwindigkeitsunterschiede zwischen CPU und RAM abzupuffern, dafür einen Cache-Kontroller und und und . . .
Und das alles mutiplizierst du jetz mit zwei oder noch mehr für Dual- oder höhere Cores und du bist bei mehren hundert Millionen oder gar Milliarden Transistoren . . .
/und das alles ist jetzt noch dramatisch vereinfacht!
lg, mabuse