Donnerstag, 4. Juni 2009

Warum Quadcores nichts bringen

Eine oft gestellte Frage ist die, warum ein Quadcore-Prozessor gegenüber einen Dualcore kaum bis gar keinen Mehrwert hat, wogegen dieser doch gegenüber einem Singlecore so einen riesigen Vorteil hat. Der Grund ist so einfach wie erschreckend: Der Quadcore bremst sich selbst!

Hierfür muss man zunächst einmal verstehen, dass ein Programm, um auf mehreren Prozessorkernen laufen zu können, aufgeteilt werden muss. Und genau hier liegt das Problem, denn einer dieser Teile, genannt Threads, ist immer das Hauptprogramm, welches einen vollen Prozessorkern braucht. Der Einfachheit halber werde ich die "benötigte Rechenzeit eines Threads" einmal in MHz angeben; in der Praxis ist dieser Wert aber bestenfalls für identische Prozessoren so schön proportional.

Betrachten wir also einmal den Fall, eines Programmes, dass genau einen Kern nutzt. Hinzu kommt grundsätzlich das Betriebssystem selbst, dass wir einmal mit einem Gegenwert von 300MHz ansetzen, bestehend aus vielen kleinen Threads. Verwenden wir hierfür nun einen 2GHz-Singlecore, bleiben also nach Abzug des Betriebssystems nur noch 1,7GHz für das Programm übrig. Tauschen wir den Singlecore gegen einen gleich schnell getakteten Dualcore aus, hat das Programm hingegen 2GHz zur Verfügung und läuft daher schneller. Kern 2: 300MHz Bedarf.

Lagern wir aus diesem Programm jetzt einen Teil, der unabhängig von der Ablaufgeschwindigkeit sein soll, aus - im Falle eines Spiels etwa die KI. Diese braucht beispielsweise weitere 500MHz. In der Summe werden also 800MHz fest verbraucht. Ergebnis: Auf dem Singlecore hat das Programm noch 1,2; auf dem Dualcore aber immer noch 2 GHz zur Verfügung. Kern 2: 800MHz Bedarf.

Noch komplizierter wird die Sache, wenn wir einen dritten Thread für die Grafik nehmen. Dieser hat einen Rechenbedarf, der von dem Haupt-Thread abhängt und 1:3 beträgt. Nehmen wir den 2GHz-Singlecore, bekommt das Hauptprogramm nur noch 900MHz und der Grafik-Thread 300MHz ab. Auf dem Dualcore dagegen sind es immer noch 2GHz für das Hauptprogramm und 333MHz für den Grafik-Thread. Kern 2: 1,033GHz Bedarf.

Nun machen wir also die Grafik komplexer und das Verhältnis wird auf 1:2 geändert. Auf dem Singlecore wird die Sache mit nur noch langsam dünn, denn nur noch 800MHz bleiben dem Hauptprogramm (und 400MHz der Grafik). Auf dem Dualcore aber sidn es 2GHz für den Haupt- und 1GHz für den Grafik-Thread. Mit insgesamt 1,8GHz ist Kern 2 fast ausgelastet.

Nun mal eine bessere KI her. Die neue will statt 500 jetzt 1000MHz. Was macht der Singlecore? 466MHz für das Hauptprogramm... Gut, das können wir knicken. Der Dualcore hat aber auch ein Problem: Das Hauptprogramm könnte zwar 2GHz nutzen, doch dann müsste die Grafik 1GHz haben. Auf Kern 2 sind aber nur noch 700MHz! Also gibt's nur 1,4GHz für den Haupt-Thread. Oder umsortieren: Hauptprogramm+viel System auf 1 (1800+200), KI+Grafik+bissl System auf 2(1000+900+100). Macht 1,8GHz für's Hauptprogramm. Was machen, um wieder auf 2GHz zu kommen? Nochn Kern! Kern 1: 2GHz Hauptprogramm, Kern 2: KI (1GHz), System (300MHz), Kern 3: Grafik (1GHz).

Doll, aber da langweilen sich doch jetzt die Kerne 2 und 3. Geht das auch anders? Was passiert denn, wenn wir doch nur 2 Kerne nehmen; die aber mit 2,5GHz? Gute Idee: Auf Kern 2 sind jetzt für die Grafik 1,2GHz. Hurra, das Hauptprogramm läuft sogar schneller! Viel schneller! 2,4GHz für dieses. Bereits mit 2x 2,3GHz wären wir wieder bei den 2GHz für's Hauptprogramm.

Kann man den Effekt jetzt auch umdrehen? Also ganz viele langsame? 4x 1,5GHz und man muss nicht mehr zwischen Grafik und KI/System rechnen. 1,5GHz Grafik also.... eh, ne... wasn das? 750MHz Grafik und 1,5GHz Hauptprogramm :( War nix - wir sind langsamer, als der Dualcore mit 2GHz. Mitm 1,8GHz-Quadcore passt's dann gegenüber dem 2GHz-Dual.

Und is dann auch der 1,5GHz-Dualcore auch langsamer als der 2GHz-Singlecore? Der Singlecore hätte 466MHz für das Hauptprogramm über. Aber der Dualcore? Der muss umsortieren. 500MHz Platz für die Grafik auf Kern 2, denn das System ist jetzt mit auf der 1, wo sich 1GHz für das Hauptprogramm ergeben. Tatsächlich wäre erst ein Dualcore mit 1GHz so langsam wie der 2GHz-Dualcore: Kern 1 mit der KI, Kern 2 mit Hauptprogramm, Grafik und System, welches hier im Summe zufällig ebenfalls genau 1GHz ergeben - das das so sauber aufgeht, ist allerdings Zufall!


Das ganze ist jetzt zugegeben etwas flappsig formuliert, zeigt aber das Problem auf: Es dauert ewig, bis mehr Neben- als Hauptaktivität erzeugt ist. Danach wird erstmal der Hauptthread minimal eingebremst: keinere Nebenthreads verschieben sich auf den Kern des Hauptthreads, wo sie nur Halb so viel "Schaden anrichten". Erst, wenn in diesem Falle der KI-Thread mehr als einen halben Kern braucht, wird's übel, da nun auch das Wegschieben von allem anderen der Grafik nicht mehr genug Raum lässt und dadurch in unsem Beispiel der Haupt-Thread gleich doppelt so stark gebremst wird. In der Praxis sind die Abhängigkeiten der Threads voneinander weitaus komplexer als in diesem Beispiel genannt. Umso schwächer die Dominanz des Haupt-Threads ist, umso stärker ist der Nutzen eines Prozessors mit mehr als zwei Kernen; in Rendering-Programmen ist beispielsweise meist der Haupt-Thread winzig, verteilt aber die Arbeit an eine vorzugsweise der Zahl der Prozessorkerne entsprechende Anzahl an identischen Threads.

Im Gegensatz dazu bringt ein Dualcore _immer_ zumindest einen kleinen Leistungszuwachs, da das aktive Programm einen Kern komplett - ohne das System - für sich selbst hat. Auch dieser Effekt ist naturgemäß umso größer, umso mehr der Singlecore durch das System selbst ausgelastet wird.

Nochmal abschließend die wichtigsten Zahlen aus dem Beispiel:
  • 1 GHz Dualcore: 266 MHz für den Haupt-Thread
  • 1,5 GHz Singlecore: 133 MHz dafür
  • 2 GHz Singlecore: 466 MHz dafür
  • 1,5 GHz Dualcore: 1 GHz dafür
  • 1,5 GHz Quadcore: 1,5 GHz dafür
  • 2 GHz Dualcore: 1,8 GHz dafür
  • 1,8 GHz Quadcore: 1,8 GHz dafür
  • 2,3GHz Dualcore: 2 GHz dafür
  • 2 GHz Quadcore: 2GHz dafür
  • 2,5 GHz Dualcore: 2,4 GHz dafür
Kleines Gimmik am Rande: Jetzt takten wir die Sache mal asymetrisch (!). Also Kern 1 2GHz; alle weiteren 1,5GHz...

Dualcore: System+KI+Grafik auf 1, Haupt auf 2. Damit 1,4GHz für den letzteren.
Quadcore: Haupt auf 1, System+KI auf 2, Grafik auf 3. Damit 2GHz für den Haupt-Thread.


...Sprich: beide CPUs sind _exakt_ so schnell, als wenn alle Kerne auf 2GHz wären. Genau diese Technik beherrscht übrigens der Core i7 von intel: Dort kann ein Kern automatisch auf Kosten eines anderen übertaktet werden. Zumindest einen Teil dieses Effekts bieten AMDs Phenom-CPUs: Hier wird ebenfalls automatisch die Taktfrequenz aller 4 Kerne unabhängig geregelt werden. Im Gegensatz zum i7 müsste man hier aber wirklich einen "2GHz-Phenom" kaufen, um den oben genannten Effekt zu bekommen - auf der Stromrechnung aber immer noch besser als 4x 2GHz...

Ganz am Ende noch ein ganz wichtiger Punkt: Zu der Verwaltung der Prozessorkerne gehört auf *jedem* Kern ein Thread pro "Nachbarkern"! Aus diesem Grunde ist ein unbenutzter Kern sogar kontraproduktiv.

Keine Kommentare: