# Hyper-Threading

Hyper-Threading Technology (kurz HTT, üblicherweise nur Hyper-Threading und dann HT genannt) ist eine spezielle Implementierung von hardwareseitigem Multithreading in Intel-Prozessoren, die auch von AMD übernommen wurde. Durch mehrere vollständige Registersätze und ein komplexes Steuerwerk werden intern parallel arbeitende Pipeline-Stufen zwei parallelen Befehls- und Datenströmen zugeteilt. Hyper-Threading entspricht konzeptuell dem Simultaneous Multithreading (SMT).
Zu beachten: Der Prozessorkern kann sowohl einen einzelnen Thread (zweiter Thread abgeschaltet) als auch zwei verschiedene Threads parallel bearbeiten, benötigt im letzteren Fall somit jeweils eigene Seitentabellen. Diese Threads können auch von einem einzigen Prozess stammen und somit im selben Prozesskontext rechnen.

## Konzept

Hinter Hyper-Threading steht die Idee, die Rechenwerke eines Prozessors besser auszulasten, indem zwei Threads sich die Ressourcen teilen, die für einen vollständigen Kern notwendig wären. Dabei kann ein Thread die Ressourcen verwenden, die der andere im Moment nicht belegt – insbesondere ALU-Komponenten und FPU; auch Pipeline-Lücken, die zum Beispiel entstehen können, wenn ein Prozess oder Thread durch einen Cache-Miss auf den Arbeitsspeicher warten muss. Hier kann dann mittels Hyper-Threading solange der zweite Prozess oder Thread rechnen und somit parallel laufen. Softwareseitig verhält sich eine CPU mit Hyper-Threading ähnlich wie ein Symmetrisches Multiprozessorsystem (SMP) – die Aufteilung der hereinkommenden Daten auf den freien Raum erzeugen zwei logische Prozessoren (im HT-Jargon siblings genannt), die vom Betriebssystem mittels klassischer Multiprocessing-Verfahren verwaltet werden können. Auch wenn ein SMP-fähiges Betriebssystem somit theoretisch ohne Anpassung mit HT umgehen kann, ist ein angepasstes Betriebssystem sinnvoll, da ansonsten nicht die volle Performance ausgenutzt werden und es in Einzelfällen sogar zu einer Leistungsreduzierung kommen kann.
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. 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 weiteren Threads müssen vorhanden sein, jedoch keine zusätzlichen Rechenwerke.
Die logischen Prozessoren sind gleichwertig; aufgrund der gemeinsam zu verwendenden Recheneinheiten können sie sich gegenseitig behindern, wodurch die Gesamtrechenleistung deutlich unter der doppelten Einzelleistung liegt. Wird eine der beiden Thread-Ausführungseinheiten abgeschaltet, so kann die andere gänzlich ungestört mit voller Geschwindigkeit rechnen. Das Betriebssystem sollte daher rechenintensive Threads explizit einem Kern zuweisen, der keinen weiteren Thread bearbeitet (und die zweite Ausführungseinheit abschalten). Die mögliche Rechenleistung eines Prozessors mit $n$ HT-fähigen Kernen (mit jeweils zwei logischen Prozessoren) liegt im Allgemeinen deutlich unter der eines Prozessors mit $2n$ „vollwertigen“ Kernen.
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

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
### Hardware

Zu finden ist Hyper-Threading bei Intel-Prozessoren in neueren Modellen der Pentium-4-Reihe und deren Derivaten, bei Xeon ab der Netburst-Familie, bei vielen Core-i-Modellen sowie einigen Atom-Prozessoren. Auch die Mehrkernprozessoren von AMD wie Athlon 64 X2, Opteron und neuer geben sich per Flag als Hyper-Threading-fähig aus, obwohl sie es entweder nicht sind oder etwas anders aufgebaut sind (näher an SMT). Bei diversen Mehrkernprozessoren von Intel wie zum Beispiel Pentium D oder Core 2 Duo ist, je nach Ausführung, Hyper-Threading nicht vorhanden, aber trotzdem das entsprechende Prozessorflag gesetzt.
Hyperthreading kann in der Regel im BIOS oder UEFI abgeschaltet werden, was vor allem im Workstation- und Serverbereich genutzt wird, damit die verbleibenden CPU-Kerne auch jeweils die volle mögliche Rechenleistung erbringen. Dies reduziert zwar im Allgemeinen die Rechenleistung des Gesamtsystems bei vielen Threads, erhöht sie jedoch bei Softwarekonstellationen, die weniger oder gleich viele Threads einsetzen als die verbleibende Kern-Anzahl.

### Software

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 sich die zwei Threads auf einem Prozessorkern die verfügbaren Ressourcen teilen und somit jeweils langsamer ausgeführt werden, als ein einziger Thread auf dem Kern. Die Ausführungsgeschwindigkeit eines Threads auf einem logischen Prozessor ist erheblich davon abhängig, wie günstig sein Ressourcenbedarf zum Bedarf des anderen Threads passt. Daher müssen z. B. Threads mit harten Echtzeitanforderungen fest einem Kern ohne zweiten Thread zugeordnet werden, oder das Hyperthreading muss abgeschaltet werden. Bei der Einführung der Hyperthreading-Technologie warb Intel mit einer Leistungssteigerung pro zusätzlichem logischen Prozessor von bis zu 33 %. Dies ist vermutlich der Idealfall, im Alltag bringt ein CPU-Kern aus zwei HT-siblings eher Leistungswerte von ca. 120–125 % im Vergleich zu einem einfachen, vollwertigen CPU-Kern.
Hyper-Threading ist erheblich kostengünstiger zu realisieren als zwei vollwertige Kerne. Es hebt bei korrekter Implementierung insbesondere im Betriebssystem die Effizienz des Prozessors in Softwareumgebungen, die viele Threads gleichzeitig ausführen, und bewahrt dennoch die Fähigkeit, bei wenigen Threads eine hohe Single-Thread-Performance zu erreichen. Die Prozessorkerne können recht „breit“ werden – es bietet sich an, Recheneinheiten, die bei einem HT-siblings-Paar im statistischen Mittel häufig zugleich benötigt werden, tatsächlich doppelt in den CPU-Kern einzubauen, um gegenseitiges Behindern zu reduzieren. Dies erhöht die Leistung pro Thread. Erzeugt eine Software mehr Threads als Kerne, so sinkt im Allgemeinen die Rechenleistung, da das Betriebssystem häufig den Thread-Kontext umladen muss. Moderne Betriebssysteme versuchen, einen Thread auch nach einer Unterbrechung wieder demselben CPU-Kern zuzuweisen, auf dem er zuvor ausgeführt wurde. Dies kann stark beschleunigend wirken, wenn notwendige Speicherbereiche zur Ausführung dieses Threads sich noch im zugehörigen Prozessorcache befinden und daher nicht nachgeladen werden müssen.
Betriebssysteme mit Unterstützung für Hyper-Threading sind unter anderem Windows-Betriebssysteme ab Windows XP, macOS, 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.
Compiler, die Hyper-Threading-freundlichen Code 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 dem Prozessor mehr als zwei fordernde Threads anbieten, büßt die Mehrheit der Spiele Anfang 2011 bei aktiviertem Hyper-Threading auf einem Vierkernprozessor sogar geringfügig an Performance ein, da sie dem Prozessor kaum mehr als vier Threads anbieten, gleichzeitig aber der Verwaltungsaufwand innerhalb des Prozessors aufgrund von Hyper-Threading steigt. Spätestens seit 2009 gibt es allerdings auch Ausnahmen wie Anno 1404, die dem Prozessor mehr als vier fordernde Threads anbieten, so dass auch Vierkerner von Hyper-Threading profitierten.