Wie genau funktioniert Hyperthreading?

PhoenixEX

Freizeitschrauber(in)
Hey Leute,


ich habe eine Frage, die mich etwas länger beschäftigt, die ich allerdings nie so ganz verstanden habe
Thema: HYPERTHREADING

Bsp: ein Xeon E3 1231v3 hat 4Kerne
Durch Hyperthreading hätte ich "visuell" 8Kerne

1.)Frage
Wie bitte geht das?
Wie kann man 8 Kerne nutzen, wenn doch nur 4 eingebaut sind?

2.)Frage
Hyper-Threading: Wichtig für einen zukunftstauglichen Intel-PC? Leserbrief der Woche
Laut diesem Artikel "könnte" manche Spiele bei einem 4Kernen sogar abgremst werden?
Aber warum?
Bei eine i3 rentiert es sich, bei einem Xeon oder i5 oder i7 nicht
Verstehe die Logik nicht
Danke
Einfache und ausführliche Antworten wären sehr hilfreich
 
So wie ich das verstanden habe,
ist das wie ein Fließband, hier ein Beispiel mit 10 Metern Länge:

Stelle dir vor, du arbeitest bei der Post, und es ist Weihnachten (Hochbetrieb).
Dort haben sie ein Fließband, was 10 Meter lang ist.
Jede Sekunde muss 1 Paket auf das Band gelegt werden (10 Sekunden = 10 Pakete).

Du arbeitest jetzt aber nicht nur an Weihnachten mit 10 Kartons,
sondern zum Beispiel nur mit 5 Kartons in 10 Sekunden.

Hier setzt HT ein:
es wird versucht, zwischendrin 5 Pakete zu füllen, dass in 10 Sekunden wieder 10 Pakete auf das Band gelegt werden.
 
Zuletzt bearbeitet:
Du arbeitest jetzt aber nicht nur an Weihnachten mit 10 Kartons,
sondern zum Beispiel nur mit 5 Kartons in 10 Sekunden.

Hier setzt HT ein:
es wird versucht, zwischendrin 5 Pakete zu füllen, dass in 10 Sekunden wieder 10 Pakete auf das Band gelegt werden.

zwischendrin ? :what:
 
Ich habe das letztens auch in der Uni gefragt und mein Prof hat es mir in etwa so erklärt:
Man hat verschiedene zu verarbeitende Daten. Ein Teil sind integer, ein Teil sind float usw. was man nun versucht, ist alle Daten des selben Typs einem bestimmt auf einen bestimmten Kern abzuwälzen.

Irgendwie kommen mir Zweifel auf ob er überhaupt ahnung hat wovon er da redet :D ich muss sagen, dass mein Vertrauen in unsere Professoren immer weiter sinkt :D
 
Verdammt ich hatte das ganze an der Fachhochschule aber ich find meine Unterlagen nich mehr :wall:

Wenn ich mich richtig erinnere dann musst du dir das so vorstellen: In der Regel arbeitet ein Kern einen Prozess/Thread ab. Es kommen Daten zum Kern welche dann eben nacheinander abgearbeitet werden. Nun passiert es aber immer wieder mal das der Kern kurz auf den Arbeitsspeicher warten muss bevor neue Daten ankommen. Durch Hyperthreading wird in dieser kurzen Wartezeit einfach schnell ein anderer Prozess dazwischen geworfen den der Kern dann abarbeitet. Da ein Kern ansich immer nur ein Prozess/Thread zur Zeit bearbeiten kann, wirkt es also als ob dort nun ein zweiter Kern am werkeln ist. Daher auch die Bezeichnung z.B. 4 Kerne 8 Threads.

Ohne Hyperthreading würde der Kern bei jedem Prozess den sie grad bearbeitet auch immer auf diese neuen Daten warten. Mit Hyperthreading bekommt sie in diesen Wartezeiten eben einen anderen Prozess vorgesetzt den sie dann bearbeitet bis die Daten vom ersten Prozess ankommen.

Ich hoff ich erinnere mich so noch richtig :ugly:


Laut diesem Artikel "könnte" manche Spiele bei einem 4Kernen sogar abgremst werden?
Aber warum?
Bei eine i3 rentiert es sich, bei einem Xeon oder i5 oder i7 nicht
Weil viele Spiele nichtmal mehr als 4 Kerne unterstützen. Beim I3 hättest du mit HT 4 Threads. Bei einem I7 / Xeon hättest du 8+ je nachdem welche CPU es ist. Viele Games kommen mit so vielen Kernen nicht klar bzw können nichts mit HT anfangen.
 
Im Prinzip kann 1 Kern die Rechenaufgaben von 2 Threads übernehmen, wenn sich die Daten nicht gegenseitig im Weg sind.

z.B. Kern 1 bearbeitet Thread 1: A + B = C und ein 2. Thread steht an und sagt, hast du grad Zeit für D * E = F. Dann stellt der Scheduler das hinten an, und führt es aus, während für den 1. Thread auf Daten aus dem Cache / RAM gewartet wird oder sonstwas.
Nach dem gleichen Prinzip werden beim Pipelining auch Befehle vorgezogen.

Da es sehr viele Wartezeiten in der CPU gibt, können beinahe 2 Threads ohne Zeitverzug bearbeitet werden, da sie sich typischerweise in ihrem Adressbereich nicht überschneiden. Aber halt nicht ganz.
Bei Videokonvertierungsaufgaben erreicht man auch eine fast 100% Verbesserung der Leistung. In Spielen nicht wirklich, da diese zum einen grottig Mehrkern-optimiert sind und zum anderen diverse Abhängigkeiten zwischen der "Pace" der Threads bestehen. (z.B. wird immer ein Frame "zu Ende" gerechnet, bevor der nächste dran kommt)

AMD hat in den Modulen 2 echte Integer ALUs aber einen schrottigen Fetcher und Scheduler in den FX. Deshalb taugt deren "Marketing-8-Kern-Märchen" nur auf dem Papier etwas. Die Probleme hatte Intel bei der ersten Generation HT (Pentium 4 so um 2005 herum) auch.

Die Aufgabe der Thread-Verteilung übernimmt das BS, nicht die Spiele oder Programme. Ob etwas aus der HT-Warteschlange "dran kommt", entscheidet aber eine Logik in der CPU. Also an beiden haben die Spiele keinen Anteil.

Ob ein Spiel mit oder ohne HT schneller ist, ist eine Verkettung von Zusammenhängen, die nicht pauschalisierbar ist. Der L3-Cache kann für diese bestimmten 8 Threads (da sind dann meistensBS-Aufgaben auf der B-Linie) einfach zu klein sein, und es wird mehr aus dem RAM geladen. Oder ein Spiel-Thread wurde auf den falschen Kern zugewiesen. Oder der Wartealgorithmus trifft zufällig "schlecht" Immerhin könnten 8 Threads mit der Prio hoch ausgeführt werden, das Spiel müsste ggfs. auf die Ausführung der B-Linie warten, bevor es wieder "dran ist". Auf 4 echten Kernen hätte das Spiele immer "hoch" und wäre sofort dran, der "Störprozess" würde dann in einer echten Leerlaufphase durchgeführt.

Also zur Frage 2: Während heutige Spiele mit 2 Kernen meistens langsamer sind als mit 4, bringt HT immer noch, "dass anstehende Befehle früher abgearbeitet werden können". Bei 4+4 Kernen kommt es genauso zu gegenseitig bedingten Wartezeiten wie mit 2, aber die Komplikationen können überwiegen.
 
@Cinnayum: Das nur das BS die Threadverteilung übernimmt stimmt jetzt nicht komplett, denn um soetwas zu erreichen, müssen die Spiele (-> Dementsprechend dei Engine) erstmal parallelisierbar Programmiert sein. Bestes Negativbeispiel ist hier World of Tanks, das Kern 2 als Mainthread und den letzten Kern als PhysX Thread benutzt.

Und das 8+ Kerne nichts bringen, zeigt dann, dass die Spiele nicht ausreichend Parallelisiert sind.
 
Verdammt ich hatte das ganze an der Fachhochschule aber ich find meine Unterlagen nich mehr :wall:

Wenn ich mich richtig erinnere dann musst du dir das so vorstellen: In der Regel arbeitet ein Kern einen Prozess/Thread ab. Es kommen Daten zum Kern welche dann eben nacheinander abgearbeitet werden. Nun passiert es aber immer wieder mal das der Kern kurz auf den Arbeitsspeicher warten muss bevor neue Daten ankommen. Durch Hyperthreading wird in dieser kurzen Wartezeit einfach schnell ein anderer Prozess dazwischen geworfen den der Kern dann abarbeitet.

Richtig, theoretisch können die Zeitscheiben effizienter genutzt werden. Praktisch klappt das nicht immer!
Was hast du denn studiert auf der FH?
 
Ah genau, das mit den Zeitscheiben hat mir noch gefehlt:

Ein Kern / Thread ist wie ein Fließband mit gleicher Geschwindigkeit, das mit Paketen gefüllt werden kann
(Befehls-Pipeline).

Zwischen den Paketen gibt es ungenutzte Zeit-Lücken:
In die werden Pakete aufgefüllt. Die aufgefüllten Lücken sind der zusätzliche Thread pro Kern.

Der zusätzliche Thread (Hyperthread) ist aber nicht zeitgleich / parallel, man denkt es nur,
da es im Nano-Sekundenbereich geht.

Bei echten 8 Kernen gibt es 8 zeitgleiche, unabhängige Fließbänder (Threads).
 
Zuletzt bearbeitet:
Ui, da hast du dir ja eine Frage ausgedacht :D

Um Hyper-Threading komplett zu verstehen, müsstest du ungefähr 4 verschiedene Informatik-Module studieren ...

Entsprechend schwierig ist es, das jetzt hier zusammenzufassen.


Die Grundidee ist es, das Problem auszunutzen, dass man es nach wie vor nicht schafft, ein perfektes CPU-Scheduling zu entwickeln.

Da beginnt auch direkt das erste Problem von HT, nämlich dass es wirkungsloser wird, je besser der Betriebssystemkern ist. Deswegen ist Hyper-Threading zum Beispiel bei Linux häufig keine gute Idee, da dessen Kernel in Bezug auf Scheduling-Strategien um Generationen vor dem von Windows liegt (auf Apple gehe ich jetzt mal nicht ein, dessen entfernte Verwandtschaft zu Linux verkompliziert das Thema).

Die Grundidee ist also, bei einem schlecht performanden Betriebssystem dessen "Fehler" auszunutzen. Solche Fehler sind (auf der niedrigsten Ebene) eine schlechte Verteilung der abzuarbeitenden Aufgaben an die Prozessorkerne (wobei hier auch wiederum die höheren Softwareebenen Einfluss haben) und vor allem ein schlechtes Speichermanagement.

Um das nun zu verstehen, müssen wir einen kurzen Blick auf Speicher im Computer allgemein werfen:
Der tatsächlich "rechnende" Teil im Prozessor ist die sogenannte Arithmetisch-Logische Einheit (arithmetic logic unit), kurz ALU. Diese kann aller-simpelste Berechnungen durchführen, wie Additionen (arithmetic), Negation und Konjunktion (logic). Falls du bereits etwas über diskrete Mathematik weist, so fällt dir gleich auf, dass diese ein funktional vollständiges System bilden, was bedeutet dass sich daraus jede beliebige mathematische Operation herleiten lässt. Dies passiert mittlerweile auch direkt in der ALU, üblicherweise kann die ALU auch direkt subtrahieren, dividieren (mit Ausnahme von Intel :D ), vergleichen, und einige Sachen wie zB Bitshifts durchführen.

Nun erinnern wir uns mal an unsere Grundschulzeit im Mathe-Unterricht: Das schwierigste beim Kopfrechnen ist es, sich seine vorherigen Ergebnisse zu merken.

Das Problem hat auch die ALU, deshalb braucht ein Prozessor Speicher. In erster Linie kommen da ihr Register, danach (mittlerweile 3 Level) Cache-Speicher, welche direkt mit auf der Prozessorplatine verbaut sind, danach kommt der Arbeitsspeicher und schlussendlich nicht-flüchtiger Speicher in Form von Laufwerken (welcher aber nur im allerschlimmsten Fall für aktuelle Rechnungen genutzt wird).

Da die ALUs mittlerweile extrem schnell rechnen können, brauchen sie einen entsprechend schnellen Speicher. Die Register arbeiten mittlerweile im Bereich von unter einer Zehntel-Nanosekunde, die Level 1 und 2 Caches im einstelligen Nanosekundenbereich.
So schneller Speicher ist entsprechend teuer und schwierig zu bauen, weshalb er nur sehr klein ist. Es lässt sich sagen, dass Speicher, je weiter er von der ALU entfernt ist, exponentiell langsamer, größer und billiger wird.

Folglich hat man also das Problem, dass man diesen Speicher effizient nutzen muss, und hier kommen wir langsam zurück auf unser Thema.
Die Verwaltung dieses Speichers ist eine der grundlegenden Aufgaben des Betriebssystems, und es gibt eine recht komplexe Wissenschaft, die versucht diese Nutzung zu optimieren.

Das Ziel ist dabei, dass die ALU immer genau das zur Verfügung stehen hat, was sie in dem Moment braucht, da sie ansonsten eine Pause machen muss um auf die richten Daten im Speicher zu warten. Dazu kommt, dass der Wechsel von Daten zwischen den Speicherebenen jeweils etwas Zeit braucht und gut geplant werden muss.

Da es praktisch nicht möglich ist, einen perfekten Algorithmus für diese Verwaltung zu schreiben und verschiedene Betriebssystem bisher unterschiedlich viel Erfolg hatten, ist Intel auf die Idee gekommen, dass es einfach zu jeder ALU zwei Speichersysteme gibt, die als separate Threads behandelt werden. Und immer, wenn der eine gerade wegen eines Performance-Fehlers eine kurze Pause machen muss, da sein Speicher nicht bereit ist, schaltet eine zusätzliche Steuereinheit die ALU auf den anderen Speicher-Satz um.


Da sehen wir auch gleich, warum Hyper-Threading nie wirklich so funtkioniert wie zwei Kerne: Es kann immer nur einer der beiden Threads arbeiten, und nur eventuelle Wartezeiten der ALU kann man dadurch verkleinern.
Jetztendlich wird also, logisch betrachtet, der eine Kern besser ausgenutzt, indem man dem Betriebssystem vorgaukelt, es wären zwei.


Man könnte das jetzt noch endlos vertiefen ... aber ich glaube, für einen Anfänger in dem Thema war das schon so sehr erschlagend :D

Ich hoffe, es hat dir trotzdem ein wenig geholfen :)




Einen kleinen Nachtrag kann ich mir doch nicht verkneifen:

Der Unterschied zu AMDs Modul-Technologie, und weshalb man diese (im gegensatz zu Intel) beinahe als separate Kerne ernst nehmen kann:
Bei AMD wird nicht nur der Speicher mehrfach verbaut, sonder auch Teile der ALU gibt es doppelt. Der tatsächliche Kern sieht also (makaber gesagt) aus, wie ein siamesischer Zwilling, es gibt einige Dinge wirklich zweimal, ein paar andere "Abteilungen" , von denen AMD der Meinung ist, dass sie meist weniger stark ausgelastet werden, sind nur einmal vorhanden.

PCGH hat da mal einen schönen Test gemacht:
http://www.pcgameshardware.de/CPU-Hardware-154106/Specials/CPU-Multitasking-Test-1075340/

Hier sieht man recht gut, wie Intels CPUs viel Leistung haben, aber sobald mehr als die Hälfte der Kerne voll belastet wird, bricht der Performance-Zuwachs pro Kern stark ein. Bei AMD liegt er weiterhin fast auf dem Niveau von echten Kernen.
Man sieht auch, dass SMT doch einiges bringt, aber den Effekt nicht neutralisieren kann.


Wo wir beim Thema sind: Ich habe seit einer Woche einen wunderschönen FX 8350 auf dem Schreibtisch liegen ... aber ich will meinen X6 nicht rausschmeißen :D Ein echter Hexacore ist doch irgendwie was besonderes ... :D
 
Zuletzt bearbeitet:
Und man darf nicht vergessen, dass ein 8350 die Vorteile von 8 keinen nicht besonders gut nutzen kann, da es ja noch irgendwelche Performance Probleme mit der gleitkommastelle gibt.
Aber da ich hiervon nur wenig, eher gar keine Ahnung habe wäre ein kurze Erklärung super :daummen: :P
 
Ja, AMD hat relativ wenig Fließkomma-Addierwerke verwendet. Das liegt daran, dass ein Modul zwei Sätze Integer-Addierwerke hat, aber nur in einfacher Ausführung die Addierwerke (etc) für Gleitkommazahlen.

Das ist ein Pokerspiel ... jetztendlich kommt es auf den individuellen Einsatz an, und was für Zahlen dort in welchen Mengen verwendet werden. So wie es aktuell aussieht, geht ihre Rechnung aber auf, die meisten Benchmarks bescheinigen den Modulen die Leistung von nahezu zwei echten Kernen.
Nur für einige eher wissenschaftliche Aufgabenbereiche ist das sehr unpassend. Aber wie wir wissen, ist Intel dort auch nicht gerade beliebt :D
Gleitkommadarstellung gemäß dem IEEE754 ist nunmal eine sehr "spezielle" Art und Weise, eine Zahl zu speichern ... :ugly:

Außerdem ist die Modultechnologie auch bei sehr gutem Scheduling noch sinnvoll, deutlich mehr als Intels HyperThreading.
Der einzige Nachteil daran ist, dass man eben wirklich physisch mehr Hardware hat und dadurch Materialpreise, Stromverbrauch und Abwärme höher sind. Aber das ist ja immer so, wenn man wirklich physisch mehr Hardware für mehr Leistung haben will.
 
Zuletzt bearbeitet:
Wenn ich so an AMDs CPU Geschichte zurückdenke, dann war deren float-Leistung noch nie so wirklich der "Burner". Und ich habe eigentlich seit dem Athlon (Sockel A) immer AMDs besessen :D
 
Bei Intel ist 2+ 2= 3.999998456 :lol:


Wie schon gesagt, der IEEE754 Standard ist sehr speziell. Für viele Sachen ist er unglaublich nützlich, aber gleichzeitig ist er totaler Mist :D
 
Ach, der FDIV Bug :D Das ist aber auch schon wieder ne Weile her ;-)

Das war auch nur einer der Witze darüber, wirkliche Probleme treten eigentlich nur bei der Division auf.
Außerdem ist von der Ungenauigkeit der Gleitkommaarithmetik AMD genauso betroffen wie Intel.

Das Problem besteht aber weiterhin, Zahlen nach Darstellung des IEEE754 sind nicht immer exakt richtig.

Mittlerweile hat man nur die Probleme behoben, da man in den meisten Fällen sowieso nur ein Ergebnis auf wenige Nachkommastellen gerundet haben möchte.

Und weil eben auch noch andere Zahlendarstellungen verwendet werden, wie zB Integer. Die sind exakt, sind aber eben auch immer ganze Zahlen.



Edit:
Als kleines Beispiel:
Es gibt eine Definitionslücke zwischen
0.100000001490116119384765625 und
0.0999999940395355224609375 . Trotz der so exakten Darstellbarkeit ist dort also eine so "große" Lücke drin (Ungenauigkeit von 10^-9 bei einer Darstellung bis 10^-28 ist relativ "groß")
 
Zuletzt bearbeitet:
Ich finde das Thema sehr interessant! Bis zur Hälfte des Textes von Stryker konnte ich noch folgen, dann hab ich nur noch Bahnhof verstanden. Ich glaube man kann so was auch nicht mal eben an einem Beispiel erklären, da für ist das alles zu komplex. Aber cool das es hier Leute gibt die sich trotzdem die Mühe machen.
 
Fast alles verstanden und überwältigend.
Kann mich auch nur bedanken für diesen Thread.
Ziemlich viele nützliche Informationen :daumen:
 
Zurück