Hyper-Threading

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Hyperthreading)
Wechseln zu: Navigation, Suche
Die Seiten Hyper-Threading und Simultaneous Multithreading überschneiden sich thematisch. Hilf mit, die Artikel besser voneinander abzugrenzen oder zusammenzuführen (→ Anleitung). Beteilige dich dazu an der betreffenden Redundanzdiskussion. Bitte entferne diesen Baustein erst nach vollständiger Abarbeitung der Redundanz und vergiss nicht, den betreffenden Eintrag auf der Redundanzdiskussionsseite mit {{Erledigt|1=~~~~}} zu markieren. Juri S. 13:22, 21. Mai 2011 (CEST)

Hyper-Threading Technology (kurz HTT, üblicherweise nur Hyper-Threading genannt) ist die Implementierung von hardwareseitigem Multithreading in Intel-Prozessoren. Durch mehrere vollständige Registersätze und ein komplexes Steuerwerk werden intern parallel arbeitende Pipeline-Stufen mehreren parallelen Befehls- und Datenströmen zugeteilt. Hyper-Threading ist damit Parallelverarbeitung auf der Ebene des Simultaneous Multithreadings (SMT).

Zu beachten: Der „eigentliche“ Prozessorkern und der Hyper-Threading-Kern können verschiedene Prozesse bearbeiten, benötigen somit jeweils eigene Seitentabellen und implementieren Multiprocessing. Dennoch können sie auch verschiedene Threads desselben Prozesses bearbeiten und somit im selben Prozesskontext rechnen.

Konzept[Bearbeiten]

Hyper-Threading Schema in Intel-Prozessoren

Hinter Hyper-Threading oder SMT allgemein steht die Idee, die Rechenwerke eines Prozessors besser auszulasten, indem man die Lücken in der Pipeline mit Befehlen eines anderen Threads möglichst gut auffüllt. Solche Lücken können zum Beispiel entstehen, wenn ein Prozess oder Thread durch einen Cache-Miss auf den Arbeitsspeicher warten muss. Hier kann dann mittels Hyper-Threading ein zweiter Prozess oder Thread „eingeschoben“ werden und somit parallel laufen. Softwareseitig verhält sich eine CPU mit Hyper-Threading wie ein Symmetrisches Multiprozessorsystem – die Aufteilung der hereinkommenden Daten auf den freien Raum erzeugt zwei logische Prozessoren (im HT-Jargon siblings genannt), die vom Betriebssystem mittels klassischer Multiprocessing-Verfahren verwaltet werden können. Ist das Betriebssystem also bereits (S)MP-fähig, bedarf es keiner Anpassung, um Hyper-Threading grundlegend nutzen zu können.

Insbesondere bei der NetBurst-Mikroarchitektur belastet ein typischer Thread nur etwa 35 % der Ausführungsressourcen. Hyper-Threading kann diese Auslastung erhöhen: Während bei nur einer laufenden (unoptimierten) Anwendung der Leistungsgewinn nur marginal und vom Anwender kaum wahrzunehmen ist, profitiert der Anwender bei mehreren gleichzeitig laufenden Anwendungen bzw. Threads von Hyper-Threading. Je stärker der einzelne Thread Ressourcen für sich in Anspruch nimmt, desto besser greift die Multi-Threading-Technologie im System, da dieses die Ressourcen auf die Threads aufteilt. Dem Leistungsgewinn steht ein vergleichsweise geringer Mehraufwand in der Logik des Prozessors gegenüber: Lediglich die Threading-Logik und zusätzliche Registersätze für die einzelnen Threads müssen vorhanden sein, die eigentlichen Recheneinheiten bleiben gleich.

Auch bei In-Order-Architekturen wie etwa dem Atom-Prozessor kann Hyper-Threading erhebliche Leistungsgewinne bringen. Da eine In-Order-Architektur keine Operationen innerhalb eines Threads vorziehen kann und somit alles innerhalb des Threads der Reihe nach abgearbeitet wird, kommt es häufig zu „Lücken“ in der Pipeline, die dann mit Operationen eines anderen Threads gefüllt werden können. Hier wirkt Hyper-Threading ähnlich wie out-of-order execution, allerdings lediglich auf Thread-Ebene. Die einzelnen Threads werden aufgrund der In-Order-Ausführung weiterhin nur langsam ausgeführt, Hyper-Threading erhöht also nicht die Single-Thread-, sondern die Multi-Thread-Leistung.

Aber auch bei modernen „breiten“ (vierfach superskalar) Mikroarchitekturen wie etwa Nehalem kann Hyper-Threading laut Aussage von Intel im Multitasking-Betrieb normale Programme um 10 bis 20 %, optimierte Programme um bis zu 33 % beschleunigen.

Funktionsweise[Bearbeiten]

Beim Hyper-Threading werden die CPU-Ressourcen in drei Kategorien eingeteilt:

  • replicated resources (replizierte Ressourcen): Diese werden von jedem Sibling unabhängig in eigener Kopie vorgehalten. Dazu zählen in jedem Fall der vollständige Registersatz inklusive Stackpointer und Programcounter.
  • partitioned resources (unterteilte Ressourcen): Diese werden durch Unterteilung zwischen den Siblings aufgeteilt, das heißt, sie sind zwar nur einmal vorhanden, aber einzelne Teile der Ressourcen lassen sich genau einem Sibling zuordnen. Zu diesen gehören die Instruction Queues, der Reorder Buffer und die Load/Store Buffer.
  • shared resources (geteilte Ressourcen): Alle übrigen Ressourcen gehören zu den geteilten Ressourcen und werden von beiden Siblings benutzt, meist dergestalt, dass sie nur von einem der Siblings gleichzeitig verwendet werden können. Hierzu zählen derzeit insbesondere die Arithmetisch-logische Einheit (ALU) und die Gleitkommaeinheit (FPU).

Unterstützung[Bearbeiten]

Hardware[Bearbeiten]

Zu finden ist Hyper-Threading bei Intel-Prozessoren in neueren Modellen der Pentium-4-Reihe und deren Derivaten, bei Intel Xeon ab der Netburst-Familie, bei vielen Core-i-Modellen sowie einigen Atom-Prozessoren. Auch die Mehrkernprozessoren von AMD wie AMD Athlon 64 X2, Opteron und neuer geben sich per Flag als Hyper-Threading-fähig aus, obwohl sie es nicht sind, dadurch können sie aber potenziell von HTT-optimierten Programmabläufen profitieren. Genauso verhält es sich auch mit diversen Mehrkernprozessoren von Intel wie dem Intel Pentium D oder Intel Core 2 Duo wo, je nach Ausführung, Hyperthreading nicht vorhanden ist, aber trotzdem das entsprechende Prozessorflag gesetzt ist.

Software[Bearbeiten]

Der Geschwindigkeitsvorteil von Hyper-Threading gegenüber dem klassischen Singlethreading ist nur nutzbar, wenn man ein SMP-fähiges Betriebssystem und Anwendungen einsetzt, die idealerweise auf Hyper-Threading oder allgemein auf Multithreading optimiert sind. Gegenüber klassischen Multiprozessorsystemen ist Hyper-Threading bei der reinen Leistung im Nachteil, da beide logischen Prozessoren sich die Ressourcen teilen müssen und dabei in Konflikt geraten können. Allerdings ist Hyper-Threading erheblich kostengünstiger zu realisieren. Außerdem hebt Hyper-Threading bei korrekter Implementierung die Effizienz des Prozessors in Softwareumgebungen, die unterschiedliche Threadingfähigkeit aufweisen, ohne dabei die Single-Thread-Performance aufzugeben. Die Prozessorkerne können recht „breit“ werden und es stehen alle Ressourcen (bis auf zusätzliche Register) den wenigen Threads zur Verfügung, was eine hohe Leistung pro Thread ermöglicht. Bietet die Software hingegen mehr Threads als Kerne an, können diese die breiten Kerne noch mehr auslasten und eine höhere Leistung erreichen.

Betriebssysteme mit Unterstützung für Hyper-Threading sind unter anderem Windows-Betriebssysteme ab Windows XP, Mac OS X, neuere Versionen von FreeBSD und anderen BSDs sowie Linux. Windows 2000 ist zwar kompatibel zu Hyper-Threading, profitiert aber selten davon, weil es nicht zwischen physischen und logischen Prozessoren unterscheidet (keine so genannte „SMT awareness“). Die Leistung kann wegen Effekten wie Cache-Thrashing sogar sinken. Das Betriebssystem Windows ist für Sechskerner mit Hyper-Threading erst ab Windows 7 uneingeschränkt empfehlenswert, da der Scheduler von Windows Vista und älter nicht optimal mit zwölf Threads, die durch Hyper-Threading generiert werden, umgehen kann.[1]

Compiler, die Code mit Hyper-Threading-Unterstützung erzeugen können, sind die Intel-Compiler und die GNU Compiler Collection. Hyper-Threading bringt jedoch nur für Anwendungen einen Geschwindigkeitsvorteil, deren Berechnungen parallelisierbar sind, das heißt die Berechnung eines Threads ist nicht abhängig vom Ergebnis eines anderen.

Ob Computerspiele von Hyper-Threading profitieren oder nicht, hängt in erster Linie davon ab, wie viele fordernde Threads die betreffenden Spiele dem Prozessor zur Verfügung stellen können und wie viele davon der Prozessor gleichzeitig abarbeiten kann. Während Dual-Core-CPUs mit aktuellen Spielen sehr gut von Hyper-Threading profitieren, da die meisten aktuellen Spiele mehr als zwei fordernde Threads dem Prozessor anbieten,[2] büßt die Mehrheit der Spiele Anfang 2011 sogar geringfügig an Performance bei aktiviertem Hyper-Threading auf einem Vierkernprozessor ein, da sie dem Prozessor kaum mehr als vier Threads anbieten, gleichzeitig aber der Verwaltungsaufwand innerhalb des Prozessors aufgrund von Hyper-Threading steigt.[3] Spätestens seit 2009 gibt es allerdings auch Ausnahmen wie Anno 1404, die mehr als vier fordernde Threads dem Prozessor anbieten, so dass auch Vierkerner von Hyper-Threading profitierten.[4] Bei Prozessoren mit sechs oder mehr Kernen bringt Hyper-Threading in aktuellen Spielen allerdings gar keinen Vorteil mehr.

Siehe auch[Bearbeiten]

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. Nico Ernst, golem.de: Test: Core i7 980X - sechs Kerne, aber selten schneller, Hyperthreading bremst unter Vista. 11. März 2010, abgerufen am 24. Oktober 2011.
  2. Volker Rißka: Test: Intel Core i3-2100/2120 - Geheimtipp für Spieler. Computerbase, 22. April 2011, abgerufen am 24. Oktober 2011.
  3. Volker Rißka: Test: Intel „Sandy Bridge“. Computerbase, 3. Januar 2011, abgerufen am 24. Oktober 2011.
  4. Marc Sauter, PC Games Hardware: Lynnfield im Test: Benchmarks des Intel Core i5-750 und Core i7-860 in Anno 1404. 31. Juli 2009, abgerufen am 5. November 2009: „Anhand des i7-920 mit aktiviertem respektive deaktiviertem Simultaneous Multi Threading verifizieren wir, dass Anno 1404 das erste Spiel ist, welches dank SMT schneller läuft - plus 8 Prozent.“