Wieviel und was kann eine moderne CPU berechnen?

.mojo

Fleet Admiral
Registriert
Nov. 2004
Beiträge
13.023
Diese Frage beschäftigt mich schon etwas länger, aber konkrete Zahlen dazu finde ich nie. Immer nur abstrakte Konzepte.
Mich würde einfach mal interessieren wie oft zb ein i7 7700K 2 Zahlen miteinander addieren kann in einer Sekunde.
JEtzt sind mir GigaFLOPS und MIPS natürlich bekannt, aber was genau ist denn eine floating point operation und was schafft ein i7 mit einer instruktion für was braucht er mehr?

2*3 wird wohl schneller gehen als 314532453456645767567,6763467634 * 23434432345,65787
Wo ist da die Grenze was noch mit einem mal geht (da Multiplikationen als mehrfache additionen behandelt werden brauchen diese wohl ein vielfaches an zeit?)
Eine 64bit CPU hat 64bit Register. Heißt das dann also dass die Addition von 2 Zahlen kleiner als 64bit mit einem Cycle geht (sofern ein i7 für eine Addition nur einen cycle braucht)? Angenommen man würde keine Zahlen aus dem Speicher lesen sondern immer und immer nur wieder die beiden selben Zahlen im Register lassen und sie immer und immer wieder addieren lassen, dann könnte ein i7 mit 3Ghz und 8 Kernen diese Operation also 24 Milliarden mal pro Sekunde berechnen?

Wie gesagt, ich finde es schwierig da konkretes herauszufinden.
 
2 Zahlen von wo addieren?
Register zu Register: 1 Operation pro Takt und Kern, wahrscheinlic pro Thread.
Haupspeicherzelle zu Hauptspeicherzelle die nicht im Cache ist: ~500 Takte pro Thread.
verschiedene Cache Zuständer und Register: alles Möglichkeiten dazwischen.
SIMD (SSE): 8 Operationen pro Kern pro Takt afaik.

Damit siehst du: es gibt nix Konkretes weil es nicht existiert. Hängt von zuviel ab. Bin mir nicht mal sicher ob die CPU nicht "dual issue" ist. Oder ob das dann mit HT verrechnet werden muss. Sieh z.B. https://en.wikichip.org/wiki/intel/microarchitectures/skylake#Scheduler die Tabellen an. ADD gehört zu den ALU Befehlen und die CPU hat 2 ALUs: Port 5 und 6. Die können normalerweise gleichzeitig arbeiten...

2*3 geht wenn beides floats oder doubles sind genauso schnell wie dein 314532453456645767567,6763467634 * 23434432345,65787 und die CPU hat IIRC einen Hardwaremultiplikator. Wenn 2*3 in normalen x86 Registern ist und eine Ganzzahl, dann ist 2*3 schneller als deine zwei großen Gleitkommazahlen.
 
Zuletzt bearbeitet:
Seitdem die CPU-Cores nicht mehr direkt angesprochen werden sondern von den vorgeschalteten Einheiten effizient ausgelastet werden ist es allgemein schwer Aussagen zu treffen wie viele Cycles es braucht bis ein Ergebnis rauskommt bzw wie viele Cycles vergehen bis die nächste Berechnung starten kann. Spätestens wenn SMT dazukommt wirds dann noch unvorhersehbarer.

Entscheidend ist aber, dass kein sinnvolles Program auf dieser Welt nur mit den Zahlen in den Registern irgendwas sinnvolles erreichen kann. Bei der x86 Architektur gibt es eine lächerlich geringe Anzahl an Registern, das ist zwar mit der 64bit Erweiterung deutlich mehr geworden, aber wenn ich an so manchen Mikrocontroller denke muss man bei x86 echt oft auf Stack oder Speicher pushen^^

LG KeyKon
 
HominiLupus:
naja, fangen wir doch einfach mal mit meiner Frage am Ende an

Angenommen man würde keine Zahlen aus dem Speicher lesen sondern immer und immer nur wieder die beiden selben Zahlen im Register lassen und sie immer und immer wieder addieren lassen, dann könnte ein i7 mit 3Ghz und 8 Kernen diese Operation also 24 Milliarden mal pro Sekunde berechnen?

also in dem Fall eine Addition pro Takt (sofern die beiden Zahlen eben in die 64bit Register passen), korrekt?
Ergänzung ()

KeyKon schrieb:
Entscheidend ist aber, dass kein sinnvolles Program auf dieser Welt nur mit den Zahlen in den Registern irgendwas sinnvolles erreichen kann.
Das ist mir bewußt.
ICh würde dennoch gern wissen wieviel eine CPU theoretisch schafft.
Eben einfach der raw troughput von additionen zweier zahlen mit max 64 bit ohne sie erst einlesen zu müssen.
 
Zuletzt bearbeitet:
.mojo schrieb:
Eben einfach der raw troughput von additionen zweier zahlen mit max 64 bit ohne sie erst einlesen zu müssen.

Dann ist es so wie HominiLupus schreibt, Endloscode ohne Interrupts und Sprünge der immer ein Register auf das anderen Addiert kostet im Endeffekt einen Cycle. Wobei du dann ein Problem mit dem Programm an sich bekommst weil es ohne eine Schleife riesig wäre obwohl die ganze Zeit das gleiche passiert.
Is halt so als ob du selber im Kopf so schnell du kannst Null und Null addierst, es stellt dich vor keine Herausforderung und du schaffst es so schnell wie du denken kannst, aber es ist absolut unnütz^^

LG KeYKon
 
Zuletzt bearbeitet:
Eine Addition zweier Register braucht afaik im Befehlssatz 2 Bytes.
3GHz bedeutet mind. 3 Milliarden Operationen/s, 6 Milliarden falls dual issue.

2 Bytes mal 3 Milliarden: 6 Gigabyte großes Programm. Sportlich :)
Und das ist nur für eine Sekunde... In der Realität dauert natürlich das starten des Prozesses schon länger.
 
"2 Zahlen immer wieder miteinander addieren"? ist doch nix anderes als eine permanente Verdopplung, oder? Also so wie beim Schachspiel 1 Reiskorn auf dem ersten Feld, dann 2, 4, 8, 16 etcpp. am ende des Schachbrettes sind es dann 2^63 = 9.223.372.036.854.775.808 (9,2 Trillionen Reiskörner), hat auf meinem Business i5 keine Sekunde gedauert. Dein i7 sollte also kaum ausgelastet sein.
 
Ok, nach den Infos von Nolag schafft ein i7 6950X 10 Kerne * 3.5 Ghz * 4 = 140 Milliarden mal pro Sekunde die addition zweier 64bit großen Zahlen - theoretisch und raw. HT kommt dann nicht mehr oben drauf?
Find ich ziemlich beeindruckend für ein fingernagelgroßes Stück Silizium :D
 
Also wenn man jetzt einfach die Maximale Floating Point Performance einer CPU berechnen möchte (und da bei alles ausnutzt, was sie so kann) dann funktioniert das nach folgender Formel für die meisten Intelrechner:

P_peak = SIMD-Breite * #SIMD-Einheiten * FMA * Takt * #(echter)Kerne

Beispiel:

Intel i7-4700 (Haswell)

Unterstützt AVX => SIMD-Breite = 4 (double precision) 8 (single precision)
Hat 2 AVX Ports => #SIMD-Einheiten = 2
Beide Ports unterstützen Fused-Multiply-Add => FMA 2
Takt => 3,4GHz
Kerne => 4

P_peak = 4*2*2*3,4*4 GFlop/s = 217,6 GFlop/s (double precision)

P_peak = 8*2*2*3,4*4 GFlop/s = 435,2 GFlop/s (single precision)
 
Zuletzt bearbeitet:
​ok danke auch dir.

Multiplikationen brauchen aber länger, das ist doch korrekt? Oder macht das keinen Unterschied?
 
Add / Sub / Mul brauchen ~1 cycle, wenn die pipeline gefüllt ist.
Div braucht wesentlich länger >20 cycle

HT Threads erhöhen die peak performance nicht per se, sie erhöhen nur die Auslastung der ALU Pipelines.
 
.mojo schrieb:
Multiplikationen brauchen aber länger, das ist doch korrekt? Oder macht das keinen Unterschied?
Kommt wieder darauf an, was die Anwendung macht. Zwei Kenngrößen sind da relevant, der Durchsatz und die Latenz.

Der Durchsatz ist entscheidend, wenn du Zahlen ohne Store-to-Load-Abhängigkeiten miteinander verrechnest, die Latenz ist entscheidend, wenn solche Abhängigkeiten existieren. Angenommen, deine CPU hat eine einzige Integer-Multiplikationseinheit mit einem Durchsatz von einer Multiplikation pro Takt und einer Latenz von drei Takten. Die Zahlen habe ich mir jetzt aus dem Finger gesogen, sind aber durchaus in einem realistischen Bereich.

Code:
1: x = a * b; // Beginnt bei Takt 1
2: y = b * c; // Beginnt bei Takt 2
3: z = x * y; // Beginnt bei Takt 5 (!)

Operation 1 wird bei Takt 3 fertig, Operation 2 wird bei Takt 4 fertig, und weil Operation 3 beide Ergebnisse benötigt, kann diese erst bei Takt 5 anfangen zu rechnen. Aus dem Grunde müssen Anwendungen, die einen möglichst hohen Durchsatz erreichen wollen, auch entsprechend optimiert werden, um unnötige Datenabhängigkeiten nach Möglichkeit zu vermeiden.
 
  • Gefällt mir
Reaktionen: wildalfred
Zurück
Oben