Funktionsweise des Prozessors

Hallo!

Die Leistung eines Prozessors hängt stark von der Freuquenz ab, mit der er getaktet ist. Sie gibt an, wieviele Rechnungen er pro Zeit schafft.
Doch habe ich auch immer wieder von Problemen bei der Prozessorarchitektur gehhört, die auftreten, weil immer mehr Transistoren pro Fläche verbaut werden müssen. Die Transistoren müssen also kleiner werden und dadurch kann es Kurzschlüsse durch die Isolierung geben.

Doch was ist nun für eine Leistungssteigerung des Prozessors verantwortlich? Ist es die höhere Taktfrequenz oder das Verbauen von mehr Transistoren?
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?

Gruß
Paul

Moien

Die Leistung eines Prozessors hängt stark von der Freuquenz
ab, mit der er getaktet ist. Sie gibt an, wieviele Rechnungen
er pro Zeit schafft.

Da fängt es schon an, das ist so erstmal falsch. Die Frequenz gibt an wieviele Schritte er pro Sekunde macht. Wieviel Rechnungen er pro Schritt macht steht auf einem anderen Blatt.

Oder als Beispiel: ein 4 GHz P4 ist deutlich langsamer als ein 3GHz Core 2 Duo.

Doch was ist nun für eine Leistungssteigerung des Prozessors
verantwortlich? Ist es die höhere Taktfrequenz oder das
Verbauen von mehr Transistoren?

Das klevere Verschalten der Transistoren macht die Leistung. Sie müssen viel Arbeit pro Schritt aber auch viele Schritte pro Sekunde machen.

Wozu benötigt man eigentlich soviele Transistoren?

Speicher. Die Caches brauchen enorm viel 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.

Ja, aber nur 1 Bit. Du brauchst aber 32 Bit. Und dann läuft der klassische Halbaddierer nicht mehr mit 1 GHz. Dann sind nämlich die Signalwege zu lang.

Wozu brauch man
dann in einem Prozessor mehr als vier Transistoren?

Irgendwas muss noch steuern was gerade gemacht werden soll. Nicht jedes Programm will immer nur addieren.

cu

Hallo!

Danke für deine schnelle Antwort!

Wieviel
Rechnungen er pro Schritt macht steht auf einem anderen Blatt.

Wieviele Rechnungen macht er denn ca. pro Schritt? 10? 100? 1000?

Oder als Beispiel: ein 4 GHz P4 ist deutlich langsamer als ein
3GHz Core 2 Duo.

Ja; das zweite sind ja auch fast zwei Prozessoren.

Ja, aber nur 1 Bit. Du brauchst aber 32 Bit.

Achso; dann bräuchte man ja mind. 32 Halbaddierer.

Nicht jedes Programm will immer nur addieren.

Lässt sich nicht jede Operation des Prozessors in Additionen zerlegen? Macht er wirklich etwas anderes als addieren?
Hätte man, wenn man eine Maschine baut, die 32 Millionen Additionen pro Sekunde durchführen kann, ein Äquivalent zu einem Prozessor mit 1 MHz und 32 bit?

Moien

Wieviel
Rechnungen er pro Schritt macht steht auf einem anderen Blatt.

Wieviele Rechnungen macht er denn ca. pro Schritt? 10? 100?
1000?

Hängt davon ab welche Befehle man reinstopft. Wenn man SSE & Co einsetzt kommen Cores 2 auf ~5 pro Takt. Netburst lag unter 2.

Oder als Beispiel: ein 4 GHz P4 ist deutlich langsamer als ein
3GHz Core 2 Duo.

Ja; das zweite sind ja auch fast zwei Prozessoren.

Jeder einzelne Kern ist schneller. Bei SMP-fähigen Programmen liegt zwischen P4 4GHz und C2D 3GHz etwa der Faktor 2.5.

Nicht jedes Programm will immer nur addieren.

Lässt sich nicht jede Operation des Prozessors in Additionen
zerlegen?

Ein Core 2 braucht 1/2-1/3 Takt eine Multiplikation von 2 64Bit Float-Zahlen (wegen der Pipeline hat das ganze aber Latenz). Umgebaut aus 32Bit Integer und eine Addition pro Takt braucht sowas über 1000 Takte.

Hätte man, wenn man eine Maschine baut, die 32 Millionen
Additionen pro Sekunde durchführen kann, ein Äquivalent zu
einem Prozessor mit 1 MHz und 32 bit?

Nicht wirklich.

cu

Hallo Fragewurm,

Lässt sich nicht jede Operation des Prozessors in Additionen
zerlegen? Macht er wirklich etwas anderes als addieren?

Zuerst sind da noch die einfachen logischen Funktionen:
NOT, OR, AND, …

Dann willst du auch abhängig von Werten unterschiedliche Berechnungen anstellen, also brauchst du noch bedingte Sprünge.

Multiplikation und Division könnte man noch als fortlaufende Addition/Subtraktion programmieren, aber wenn du dann 1’000’000 x 1’000’000 rechnen willst, brauchst du dazu 1’000’000 Operationen …

Schiebebefehle beschleunigen dann die Multiplikation/Division ganz erheblich !

Das ist nur ein kleiner Teil des grundlegenden Befehlssatzes.

MfG Peter(TOO)

irgendwie drückt sich mir hier der schein auf, dass du mit einem prozessor einen addierer meinst…

wenn du eine maschine hast die 32 millionen additionen pro sekunde macht, dann hast du ziemlich viele addierte zahlen pro sekunde, was allerdings niemand benutzen könnte.

eine cpu muss ja mehr können als ‚+‘

die geschwindigkeit einer cpu hängt zwar auch vom takt ab, aber ein doch nich unerheblicher teil kommt von der architektur der cpu. parallelisierung und effektive verarbeitungsweisen spielen hier ne große rolle.

willst du mit deinem addierer 4 zahlen addieren, dann addierst du erst 2, dann auf das ergebnis noch eine und dann noch eine, macht 3 additionen. hast du mehrere addierer, dann addierst du im ersten schritt zahl1 und zahl2 während zeitgleich zahl3 und zahl4 addiert werden. im zweiten schritt addierst du die ergebnisse zusammen und schon hast du einen schritt gespart. das ma auf eine sekunde hochgerechnet… is klar was ich meine? ist zwar n doofes beispiel, aber im prinzip triffts das.

das ist auch der grund warum man sich nicht einfach irgendeine cpu nimmt und damit bestimmte arbeiten ausführt, sondern die cpu je nach einsatzgebiet wählt. ein guter dsp, der für besondere anwendungen ausgelegt ist, kann zum beispiel sehr schnell faltungen ausführen und ist somit die beste wahl für irgendwelche signalverarbeitungen, kann dafür aber andere sachen garnicht.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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