Hyper-Threading im Detail

07.03.2002 von Prof. Dr. Axel Sikora
PC-Prozessoren haben ein Problem: Sie langweilen sich meistens. Im Durchschnitt nutzen Pentium 4 und Xeon nur 35 Prozent ihrer Ressourcen. Intel macht deshalb mit Hyper-Threading aus einem Prozessor zwei.

Herkömmliche CPUs arbeiten die anstehenden Befehle im Wesentlichen sequenziell ab. Vor allem die Prozessoren der Intel-32-Bit-Architektur (IA-32) erreichen ihre Rechenleistung durch steigende Taktfrequenzen und eine immer längere Fließbandverarbeitung. So weist die Netburst-Architektur im Pentium 4 eine 20-stufige Pipeline auf, mit der Taktfrequenzen von bis zu 10 GHz möglich sein sollen. Beim Athlon XP/MP sind es immerhin 10 Integer- und 15 FPU-Pipeline-Stufen.

Ein erster Ansatz der Parallelisierung zeigt sich in superskalaren Architekturen. Hier verrichten in einem Mikroprozessor mehrere Ausführungs-Pipelines ihren Dienst. Der Pentium 4 hat beispielsweise drei Ganzzahl- und zwei Gleitkomma-Ausführungseinheiten, während der Athlon XP/MP mit jeweils drei arbeitet.

Reicht die mit diesen Techniken erzielte Rechenleistung nicht aus, können in Dualprozessor- (DP) oder Multiprozessor-Systemen (MP) mehrere CPUs parallel arbeiten. Diese Lösung ist insbesondere im Server- und Workstation-Bereich populär. Der maßgebliche Nachteil der Multiprozessor-Technik sind jedoch die hohen Kosten. Auf Grund der geringen Stückzahlen sind schon die Mainboards erheblich teurer als ihre Pendants für nur eine CPU. Dazu kommen eine aufwendigere und damit teurere Spannungsversorgung und natürlich die Kosten für den zweiten Prozessor.

Ineffiziente Prozessoren

Ein großer Teil der Prozessor-Ressourcen bleibt sowohl im Single- als auch im DP/MP-Betrieb ungenutzt. Intel gibt an, dass bei Anwendungen mit einer typischen Verteilung der Befehle bei der 32-Bit-Netburst-Architektur vom Pentium 4 und Xeon nur etwa 35 Prozent der Ressourcen eingesetzt werden. Dieses traurige Ergebnis ist den verschiedenen Engpässen der kontrollflussorientierten von-Neumann-Architektur zuzuschreiben.

Aber auch die durch das Amdahlsche Gesetz beschriebene Tatsache ist hierfür verantwortlich, dass sich ein Teil der Befehlsabläufe auf Grund von Datenabhängigkeiten nicht parallelisieren lässt. Dies gilt vor allem für die Parallelisierung auf Befehlsebene (Instruction Level Parallelism, ILP), wie sie im Rahmen von Pipeline- und superskalaren Systemen innerhalb eines Mikroprozessors realisiert werden.

Viel einfacher ist es, nebenläufige oder gänzlich unabhängige Vorgänge parallel abzuarbeiten. Die Verteilung der Prozesse oder Threads auf verschiedene Mikroprozessoren wird bereits seit einiger Zeit von Betriebssystemen unterstützt (Thread Level Parallelism - TLP). Die Effizienz der einzelnen CPUs steigt aber durch den Einsatz mehrerer Prozessoren auch nicht, wie im Bild "Standard-CPUs" der Vergleich zwischen "Superscalar" und "Multiprocessing" zeigt.

Prozesse und Threads

Bevor wir weiter auf Hyper-Threading eingehen, gilt es zunächst, die zu Grunde liegenden Begriffe und Hintergründe auf der Software-Seite zu definieren und zu erläutern. Unter einem Software-Prozess versteht man eine Instanz eines Programms in der Ausführung. Hierzu gehören insbesondere [1]:

Die Koordination zwischen den Prozessen eines Systems erfolgt einerseits dadurch, dass sie von sich aus bestimmte Zustände einnehmen. Andererseits kann ein spezieller Prozess hoher Priorität - ein Dispatcher - sie in definierte Zustände versetzen.

Prozesse sind mit einer Vielzahl von Zustandsinformationen verknüpft, die im Process Control Block (PCB) abgelegt werden. Deswegen eignen sie sich kaum, um nebenläufige Vorgänge innerhalb einer Anwendung zu realisieren. Ein Konzept, das hier Abhilfe schafft [2], ist der "leichtgewichtige" Prozess oder Handlungsfaden (Thread of Control). Einem solchen Thread ist nur ein minimaler Umfang von Kontextinformationen zugeordnet, die für den Ablauf wichtig sind: Prozessor-Register und -Zustand sowie Stack. Software, die solche Threads implementiert und verwaltet, bietet oft eine weitere Abstraktionsebene an. Auf ihr werden mehrere dieser Threads gruppiert und ihnen gemeinschaftlich die fehlenden Kontextelemente zugewiesen.

Ein Betriebssystem, das zu dieser Abstraktion beigetragen hat, ist der an der Carnegie-Mellon University entwickelte Mach-Kernel. Hier sind mehrere Threads zu einem Task zusammengefasst, der einen eigenen Adressraum besitzt. Bei Mach entspricht ein Task mit einem Thread einem Prozess bei Unix. Ein Thread ist somit ein sequenzieller Kontrollfluss, der nebenläufig zu weiteren im selben Adressbereich eines Tasks ausgeführt wird.

Threads

Der Einsatz von Threads bietet zwei wesentliche Vorteile:

In modernen Anwendungen ist die Aufteilung in unabhängige Prozesse und Threads zu beobachten:

Multi-Threading

Multi-Threaded-Prozessoren bieten eine Hardware-basierte Unterstützung für den effizienten Einsatz von Threads. Sie erlauben vor allem einen schnellen Wechsel zwischen den Threads desselben Tasks. Dafür besitzen Multi-Threaded-Prozessoren mehrere Registersätze, die jeweils den unterschiedlichen Threads zugeteilt werden. Ein Verteiler (Dispatch Unit) veranlasst das Umschalten zwischen den verschiedenen Threads. Insbesondere sind zu nennen:

Auf dem Intel Developer Forum im August 2001 (IDF Fall 2001) wurde die Hyper-Threading-Technologie als Multi-Threaded-Erweiterung der IA-32-Architektur vorgestellt. Der ursprüngliche Codename lautete Jackson-Technologie, auch die Bezeichnung Simultaneous Multi-Threading (SMT) ist verbreitet. Die Intel-Entwickler setzen bei der Hyper-Threading-Technologie auf ein Konzept, welches

Das Ziel von Hyper-Threading ist, dass die unterschiedlichen Pipelines eines Mikroprozessors durch unterschiedliche Threads zeitgleich - und damit wie getrennte Prozessoren - effizient genutzt werden.

Die auf mehreren Threads aufbauenden Programme und Betriebssysteme sehen den einen physischen Prozessor als mehrere logische Prozessoren (LP).

Hyper-Threading

Intel startet mit Hyper-Threading zunächst auf dem Xeon-Prozessor, der mit zwei logischen CPUs arbeitet.

Auf der Hardware-Seite lassen sich vier Gruppen in Abhängigkeit von der Nutzung durch die Threads unterscheiden:

Interner Ablauf

Das Betriebssystem verwaltet den einen Multi-Threaded-Prozessor mit den beiden logischen Prozessoren im Wesentlichen so wie zwei getrennte physische Prozessoren. Die nächsten auszuführenden Befehle der zwei Threads werden in die beiden Instruction Pointer (IP) gelegt und gelangen von dort zur Ausführung in die nächsten Stufen. Nach dem Abarbeiten der vorbereitenden Ausführungsschritte verteilt der Scheduler die unabhängigen Instruktionen auf die verfügbaren Ausführungseinheiten.

Die Arbeitsweise eines Hyper-Threading-Prozessors sieht beispielsweise so aus:

Systemaufbau

Intel legt größten Wert auf die Feststellung, dass die Hyper-Threading-Technologie lediglich geringe Veränderungen des Systemaufbaus zur Folge hat. So sind beim Mainboard-Layout keine besonderen Anforderungen zu verzeichnen, da der Footprint der Hyper-Threading-Prozessoren gegenüber den bisherigen CPUs unverändert geblieben ist.

Nur in der Systemverwaltung müssen einige Modifikationen vorgenommen werden. Diese betreffen die beiden Tabellen zum Verwalten der Prozessoren (MP Table) und der Interrupt-Controller (APIC Table). Dabei enthält die MP Table einen Eintrag für jeden physischen Prozessor, während die APIC Table jeweils einen Eintrag pro Interrupt Controller und somit pro logischem Prozessor aufweist. Diese Einträge werden unter Anleitung eines Bootstrap Processor (BSP) gesetzt, der den Startvorgang abwickelt. Lediglich bei einer richtigen und vollständigen Zuordnung der CPU-IDs zu den logischen und physischen Prozessoren ist ein zielgerichtetes Load Balancing und eine korrekte Verwaltung von ID-gebundenen Lizenzen möglich.

Zum Kennzeichnen der APICs hat Intel seit dem Xeon die Länge der IDs von 4 auf 8 Bit erhöht, wobei jeweils die letzten Bitstellen die logischen IDs darstellen. So lassen sich auch mehr als zwei logische Prozessoren in einem Gehäuse unterbringen.

Derzeit empfiehlt Intel den Einsatz von Hyper-Threading nur für Serveranwendungen. Deshalb ist die neue Technik bei Workstations werkseitig abgeschaltet. Im Idealfall lässt sich das durch die Änderung einer Option im Mainboard-BIOS ändern. Die Sperre ist im Zuge der Power-on-Configuration vergleichsweise einfach realisiert: Wenn während der Reset-Phase der Prozessor-Pin A31# gesetzt ist, wird Hyper-Threading abgeschaltet. Ein späteres Umschalten während des Betriebs per Software ist nicht möglich.

Ausblick

Das Augenmerk der Intel-Entwickler lag bei der Implementierung von Hyper-Threading auf einem möglichst geringen zusätzlichen Die-Flächenaufwand. Dieser beträgt weniger als fünf Prozent. Damit lässt sich ein Kostenvorteil gegenüber Multiprozessor-Systemen erreichen. Damit ließe sich mit der Hyper-Threading-Technologie ein wesentlicher Kostenvorteil gegenüber Multiprozessor-Systemen erreichen. Ob das jedoch auch gegenüber monolithischen Multiprozessor-Chips ausreicht, darf man bezweifeln.

Ein Großteil der Chipfläche moderner Mikroprozessoren ist für die Caches zu veranschlagen. Bei monolithischen Multiprozessor-Chips teilen sich zwei Prozessor-Kerne einen gemeinsamen Cache. Dadurch bleibt der zusätzliche Flächenaufwand dort im Rahmen von schätzungsweise 20 bis 30 Prozent. Hierfür erhält man aber zwei Mikroprozessoren mit komplett verdoppelten Ausführungseinheiten und ebenso gemeinsam genutzten Caches.

Allerdings sollte man die beiden Ansätze nicht zu stark als Konkurrenten betrachten. Mit den weiteren Fortschritten der Halbleitertechnologie erscheinen mittelfristig Systeme realisierbar, die mehrere Multi-Threading-Prozessoren monolithisch integrieren und beide Vorteile nutzen.

Hyper-Threading ist eher als Zugabe zu sehen denn als Ersatz für ein MP-System. Was die neue Technologie wirklich leistet, haben wir in der CeBIT-Ausgabe des tecCHANNEL-Magazins ausführlich getestet.

Das Intel Developer Forum Spring 2002 nahm Intel zum Anlass, einen Ausblick auf die zukünfige Hyper-Threading-Strategie zu geben. Im Desktop-Segment hält Hyper-Threading demnach in der zweiten Jahreshälfte 2003 Einzug. Dann stellt Intel den Pentium-4-Nachfolger Prescott vor. (mec)

Literatur

[1] Giloi, Wolfgang K., Rechnerarchitektur, Springer Verlag, 2. Auflage, 1993, ISBN 3-540-56355-5

[2] Rechenberg, P., Pomberger. G., Informatik-Handbuch, Carl Hanser Verlag, 2. Auflage 1999, ISBN 3-446-19601-3, Seite 633 bis 674