CPU (Hyper)Threads Gedanken

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.530
Huhu

In den letzten Tage gingen mir ein paar Fragen durch den Kopf.

Ich kenne die Grundthematik von Cores und Threads und weiss was der Unterschied ist, bzw. wie die CPU ein Thread abarbeitet etc. Auch von der Programmierersicht her.
Threads wurden ursprünglich ja bei den CPUs eingeführt, dass man "Multitasking" betreiben kann. Da früher eine CPU nur ein Thread hatte. Mit dem ersten "dual core" war es dann ein Kern und 2 Threads. So war es möglich, mehrere Tasks "gleichzeitig" abzuarbeiten.
Dabei wird aber ja eigentlich einfach so schnell zwschen den Threads hin und her gewechselt, dass es sich anfühlt, als wäre es Multitasking. Heute ist das natürlich anders mit mehreren Kernen. Aber die Thematik bezüglich Threads bei Prozessoren ist ja nach wie vor die gleiche.

Doch etwas verstehe ich irgendwie nicht bezülich "Leistungszuwachs" mit Hyper Threading.

Szenario:
Cinema4D Benchmark (Cinebench) habe ich als Testapp genommen.
Wenn ich Hyperthreading aus mache, habe ich weniger Punkte als wenn ich es anhabe. Das macht doch aber irgendwie keinen Sinn. Schlussendlich sind ja auch nur 8 Cores da, die die Threads abarbeiten. Es müsste ja wenn dann sogar schlechter sein, da das Management der Threads dazu kommt, weil mehr Threads. (Gut macht sicher keinen grossen unterschied)

Ich meine in Spielen ist es oft besser, ohne Hyper Threading zu zocken, da viele Spiele mit mehr Threads nicht klarkommen und dann ein Thread auf 100% ist. Sieht man ja oft im Forum: "Meine CPU tröttelt bei 12.5% auslastung rum und habe nur 15fps..."
Wenn man also Hyper Threading deaktiviert, steht einem bei so einem Fall theoretisch doppelt soviel Leistung zur Verfügung oder?

Aber wieso habe ich dann mit Hyper Threading in 3D softwares mehr Leistung? Gibt es da noch andere Vorteile die ich nicht sehe/kenne? Evtl. wegen der Architektur oder so?
Die CPU kann ja wegen Hyper Threading nicht einfach schneller abreiten.
Anders rum wenn eine Software Threading nutzt, kann es von mehreren Kernen abgearbeitet werden. Um da Verwechslungen vorzubeugen^^

Oder war das quasi "Zufall"?
Ständig Hyper Threading ein und ausschalten ist etwas doof^^


Danke für die Beantwortung :)

Grüess
Dom
 
Zuletzt bearbeitet:
Nein, du verstehst weder was Threading oder Hyperthreading ist.

Eine superskalare CPU arbeitet Befehle in einem Fließband ab. Wie beim Fließband im Gegensatz zu einem Handwerksbetrieb macht jede Station (CPUs haben so von ca. 6 bis 25 Stationen) nur einen kleinen Teil der Arbeit. Jetzt ist es aber so daß es sehr oft "stalls" der Pipeline gibt, weil die vorhergehende Station die Daten nicht schnell genug liefert oder auf den Hauptspeicher gewartet werden muss, oder eine Sprungvorhersage daneben ging, etc. Und dann kommt HT ins Spiel: statt nix zu tun wird der Kontext umgeschaltet und der "virtuelle Kern" genutz statt dem normalen. HT ist also eine Technik um die Effizienz zu erhöhen. Das Management ist automatisch und völlig transparent.
Auch dein Cinema4D hat solche Stalls, und da man dann was anderes machen kann statt nichts zu tun und warten: eben Thread 4-8 der Anwendung ausführen, wirds durch HT schneller.

Dein Beispiel mit 12.5% ist auch völlig daneben. Und HT ausschalten bringt schon lange nix mehr.
 
Threads != Hyperthreading

Dieser erste Dual Core Kram ist auch Schwachsinn. Schon mal in Taskmanager geschaut. Windows erlaubt 10k Threads pro Applikation.
 
Naja Threading ist klar. Damit musste ich beim programmieren schon oft auseinandersetzen. Mein Fehler war wohl eher zu denken, dass Hyper Threading quasi ein Thread ist, aber wie schon geahnt, sind da doch noch andere Dinge die da mitspielen bei Hyperthreading.

Das Beispiel mit den 12.5% war ja genau in bezug auf die salls gedacht. Also das warten bis etwas anderes abgearbeitet ist, bevor ein Thread weiter bearbeitet werden kann, was bei Spielen die nicht auf Multithreading tauglich sind zu problemen führen kann.

In Win 7 war das noch extreme. Bei win 8 und win 10 haben sie die Lastaufteilung deutlich besser hinbekommen.

Also dann habe ich nun glaube ich den Vorteil von HT begriffen.
Anstelle dass ein "stall" dann einen ganzen Core blockiert, kann durch HT dann in dieser Zeit ein anderer Task (in einer andern Pipe) berechnet werden, solange Thread 0 vom Kern quasi blockiert ist.

Aber der Kern, bzw. Thread 0 von dem Kern könnte ja auch einfach einen anderen Task/Thread abarbeiten, solange sein ursprünglicher blockiert ist? Aber wahrscheindlich geht das mit dem "virtuellen Kern", also HT deutlich einfacher von der hand, nehme ich mal an.


Danke, irgendwie habe ich mich da in der falschen Spur festgefressen^^

EDIT:
BeiNacht schrieb:
Threads != Hyperthreading

Jap genau da hatte ich den Denkfehler'^^



Lg
Dom
 
Ich dachte dies auch, weil mein Laptop quasi 2x1,9Ghz hat. Folglich dachte ich, dass sich die Leistung quasi halbiert. Sprich 4x0,95Ghz statt 2x1,9Ghz. Das ist aber Quatsch. Jedenfalls ist die Leistung mit HT spürbar höher, aber ein echter Quadcore hat eben noch mehr Dampf. (Bay-trail, Braswell, Atom ausgenommen). Das sieht man daran, dass die AMD's Quads an die Core i3 vorbei ziehen. Ich bin von der HT-Technik auch fasziniert, dass eben auch Anwendungen, die nur ein Kern nutzen mit aktiviertem HT ein Hauch schneller sind und die Technik gut nutzen. Wer mit einem Bay Trail Quad Firefox nutzt, weiß was ich meine. Ein i3 chillt dabei. Zumal steigt trotz gleichem Takt der Stromverbrauch kaum. Intel Pentium Haswell 2x1,7 GHz versus Core i3 4005U gleicher Takt und TDP bei 15W. Oder AMD Quad 95W vs Core i3 mit 54W.

Gleiches bei mein Cousin. Sandy Bridge und Haswell sind Leistungstechnisch nicht weit auseinander. Ich habe den i5 2500 4x 3,5Ghz und er 4x4,0 Ghz und HT. Sein Prozessor ist in der Videobearbeitung und beim Codieren doch um einiges flotter. Nicht nur um 10-20%. Habe kein Bench gemacht aber es waren sicherlich 40-80% Mehrleistung.

Man kann etwa sagen, dass wie eine halbe Verdopplung der Kerne ist. Als wären es 3 bzw 6 Kerne.

Lass das lieber an ;)
 
Zuletzt bearbeitet:
In der Praxis ist es so:
Wenn ein Programm sehr stark in Hinblick auf Multi-Threading optimiert ist, gewinnt man circa 30% an Leistung. Mehr als das wird es allerdings selten. Bei schlecht optimierten Anwendungen sind es dann vielleicht noch 10% Gewinn, bei Anwendungen, die eh nur einen Kern nutzen, verliert man womöglich sogar Leistung (wenn auch nicht viel).

Will heißen:
Eine HT-Fähige-CPU mit 4 Kernen, leistet, eine passende Anwendung vorausgesetzt, in einem Takt dieselbe Arbeit wie eine Nicht-HT-Fähige-CPU mit "5,2 Kernen".
Klar klingt 4Cores/8Threads erst mal verlockend und nach einer hunderprozentigen Steigerung, das ist aber eher Marketing, tatsächlich sollte es eher lauten 4Cores/5,2Core-Performance.
 
Na das ist doch eine ordentlich Steigerung. Also kann man sagen ,dass ein Core i3 mit 2x1,7GHz so schnell wie ein Pentium mit 2x 1,9-2,2 Ghz schnell ist. Immerhin. Das bei gleichem Verbrauch.
 
HominiLupus schrieb:
Und HT ausschalten bringt schon lange nix mehr.

Das kommt immer auf den Einzelfall an. Die Grafik-Engine von Civ5 müllt z.B. gerne drei Threads mit Auslastungen so um 30% zu. Das ist natürlich etwas schneller als wenn nur ein Thread sie Grafik berechnet. Steigerungsfaktor vielleicht 10%, also z.B. 120 stat 110 fps also völlig uninteressant. Der eine Thread, auf den es ankommt und die KI-Züge berechnet, wird aber im Falle des i3 durch diese sinnlose Grafikrechenarbeit auf drei Threads ausgebremst. Schaltest Du beim i3 Hyperthreading ab wächst die Leistung des entscheidenden Threads und verkürzt sich die Rechenzeit für den Rundenwechsel.
 
Das ist halt das Problem von HT: Die Gesamtleistung steigt meist an, aber die einzelnen Threads verlieren teilweise recht deutlich an Leistung. Ist natürlich Gift, wenn alles an einem Thread hängt.

Die CPU kann ja wegen Hyper Threading nicht einfach schneller abreiten.
Aber effizienter. Wenn Thread 0 auf Kern 0 gerade auf den Speicher wartet, kann Thread 1 auf Kern 0 ein paar FPU-Berechnungen durchführen, und wenn Thread 0 gerade mal selbst eine FPU-Pipeline beansprucht, den Rest seiner Arbeit aber in den Integer-Einheiten erledigt, hat Thread 1 immer noch die zweite FPU zur Verfügung.

Die zur Verfügung stehende Rohleistung ist bei HT-losen CPUs dieselbe wie bei CPUs mit HT, in der Praxis ist es nur fast unmöglich, diese abzurufen. Merkt man spätestens dann, wenn man irgendwas in Assembler optimieren will und sich Gedanken darüber machen muss, wie man die Arbeit am Sinnvollsten auf die zur Verfügung stehenden Pipelines verteilen kann.
 
Viking, jap gut verständlich erklärt.

Aber eben, dann bleibt mein Problem zumindest bei Supreme Commander. Da ist nähmlich ein Thread bei 80-90% und der rest tumelt bei 10% rum. Da spürt man das sehr schnell. Wenn ich da HT aus mache, läuft es deutlich runder. Auch zeigt das der interne CPU Test.
Mit HT zwischen 176-232, ohne HT (immer) 154 Score. (Tiefer = besser, Schlechtester Wert ist 450)

Dieser Core Maximizer den es zu SC gibt, bringt irgendwie nicht so viel, zumindest bei Win 10 nicht mehr. In Win7 wurde die last nachher relativ gut auf alle Threads verteilt.

Auch in BF4, was ja eigentlich gut optimiert ist auf mehrkerne, merke ich nen starken unterschied, wenn man ins CPU limit läuft. Die tiefst FPS sind mit HT bei 32 FPS. Durchschnitt ist bei 107fps.
Ohne HT sind die tiefsten FPS die ich in 30min erreiche 54 und es ist gefühlt immer smooth.

Ach man, ist doch beschiessen xD
 
Zuletzt bearbeitet:
Hab da noch Vorlesungsfolien dazu...
HT funktioniert eigentlich nur, weil bei Multithreading die CPUs auch nicht 100% ausgelastet werden, es gibt Zeitfenster wo sie warten müssen. HT sorgt dann dafür, falls die Software überhaupt gescheit implementiert wurde, dass diese Kerne in der Zeit dann doch was tun.

Stichwort: Pipeline Stalls

Problem bisher (sequentielle Ausführung):
Bei Pipeline-Stalls, z.B. wegen Daten-Abhängigkeiten oder Warten auf den Speicher (s. nächste Vorlesung) sind viele Funktionseinheiten nicht ausgelastet
Idee (Intel-proprietär):
Dann sofort einen Befehl aus einem anderen Thread ausführen
-Keine Datenabhängigkeit
-Bei Superskalarität auch parallel möglich
Erforderlich:
-Zweiter Registersatz (Status)
Erscheint dem Betriebssystem wie ein zweiter Kern
ermöglicht nebenläufige und zeitweise parallele Ausführung von zwei Threads (gleicher Adressraum!)
sind aber nur ungenutzte Ressourcen des ersten Kerns
...

Anders gesagt: umso mieser das Threading eingebaut wurde, umso mehr bringt HT. Und umgekehrt.
Wenn die Software gar keine Threads mag, dann mag sie HT noch weniger.
Deswegen lässt sich nicht pauschal sagen ob HT gut oder schlecht ist...normalerweise führt es zu keiner Verlangsamung, aber gibt halt besonders miesen Code wo es doch der Fall ist.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben