Hyper Threading - Weblearn

Transcription

Hyper Threading - Weblearn
Hyper-Threading oder
Simultaneous Multithreading
ein Referat
von Timo Richter
im Fach Rechnerstrukturen
bei Prof. Dr. Risse
an der Hochschule Bremen
1. EINLEITUNG
2
2. VORBETRACHTUNG
2
2.1 Threads
3
2.2 Multi-Threading
3
3. DAS KONZEPT
4
3.1 Interner Ablauf
5
3.2 Systemaufbau
6
4. LEISTUNGSSTEIGERUNG
6
5. VOR- UND NACHTEILE
10
6. FAZIT
10
7. QUELLEN
11
1. Einleitung
Die Vergangenheit zeigte uns im Bereich Leistungssteigerung bei Prozessoren immer wieder den
gleichen Weg: Änderung der Architektur (pipelining, caching, …) aber vor allem Erhöhung des
Prozessortaktes. Näherte sich eine CPU-Architektur dem Ende ihrer Möglichkeiten, so arbeitete der
Hersteller mit geringfügigen Modifikationen in der Herstellung (CPU-Steppings). Dies kann
allerdings nicht ewig so weiter gehen, da irgendwann die durch die Geschwindigkeit des
elektrischen Stroms bedingte Obergrenze erreicht würde.
Dennoch ist das nicht gleichbedeutend damit, dass es damit einen "Finalen-Prozessor" geben wird,
der eben diese Grenze auslotet und damit nicht weiter verbesserungswürdig wäre.
Eine Möglichkeit, Prozessoren weiter zu beschleunigen, ist die Hyper-Threading Technologie. Die
Idee ist dabei recht einfach: ein Prozessorkern bekommt zwei logische Prozessoren spendiert.
2. Vorbetrachtung
In diesem Kapitel sollen die dem Hyper- Threading zu Grunde liegenden Begriffe und Hintergründe
auf der Software-Seite definiert und erläutert werden. Unter einem Software-Prozess versteht man
eine Instanz eines Programms in der Ausführung. Hierzu gehören insbesondere:
-
das zeitlich unabhängige Programm
ein Satz von Daten, mit dem der Prozess initialisiert wird
ein zeitlich abhängiger Zustand
sowie verschiedene Informationen über diesen Prozess.
Die Koordination zwischen den Prozessen eines Systems erfolgt einerseits dadurch, dass sie von
sich aus bestimmte Zustände einnehmen. Andererseits kann der Dispatcher sie in definierte
Zustände versetzen.
Prozesse sind mit einer Vielzahl von Zustandsinformationen verknüpft, die im Process Control
Block abgelegt werden. Deswegen eignen sie sich kaum, um nebenläufige Vorgänge innerhalb einer
Anwendung zu realisieren. Ein Konzept, das hier Abhilfe schafft, ist der "leichtgewichtige" Prozess
oder auch Thread.
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.
Seite 2
2.1 Threads
Der Einsatz von Threads bietet zwei wesentliche Vorteile:
1. Nebenläufige Vorgänge lassen sich innerhalb von Anwendungsprogrammen elegant
umsetzen. Viele moderne Programmiersprachen haben das Konzept der Nebenläufigkeit
implementiert. Ein Beispiel ist Java.
2. Die Abhängigkeit zwischen den Befehlen in den unterschiedlichen Threads ist meist sehr
gering, so dass die Thread-Ebene eine hervorragende Plattform für die Verteilung der
Befehle auf unterschiedliche Ausführungseinheiten darstellt.
In modernen Anwendungen ist die Aufteilung in unabhängige Prozesse und Threads zu beobachten:
-
Leistungsfähige Server müssen unabhängige Anfragen von zahlreichen Clients beantworten.
Auf Workstations wird mittlerweile vielfach Software eingesetzt, die bereits in mehrere
Prozesse und Threads aufgeteilt ist. 3D-Programme sind hierfür ein Beispiel.
Aber auch im Bereich normaler Desktop-PCs laufen in zunehmendem Maße mehrere
unabhängige Anwendungen, die ebenso parallelisiert werden könnten.
2.2 Multi-Threading
Multi- Threaded-Prozessoren bieten eine hardwarebasierte Unterstützung für den effizienten Einsatz
von Threads. Sie erlauben vor allem einen schnellen Wechsel zwischen den Threads desselben
Prozesses. Dafür besitzen Multi-Threaded-Prozessoren mehrere Registersätze, die jeweils den
unterschiedlichen Threads zugeteilt werden. Der Dispatcher veranlasst das Umschalten zwischen
den verschiedenen Threads:
-
-
Switch-on-Event Multi- Threading stößt den Wechsel von einem auf einen anderen Thread
nach einem Ereignis an. Das kann ein Cache-Miss sein, der einen Zugriff auf den Speicher
zur Folge hätte.
Zeitschlitzorientiertes Multi- Threading gibt die einzelnen Bestandteile der verschiedenen
Threads in die unterschiedlichen Zeitschlitze einer Pipeline. Zwar werden die Pipelines auf
diese Weise am besten genutzt, dies geht allerdings zu Lasten eines größeren
Verwaltungsaufwands auf der Hardware-Seite.
Seite 3
3. Das Konzept
Auf dem Intel Developer Forum im August 2001 (IDF Fall 2001) wurde die Hyper- ThreadingTechnologie als Simultaneous Multi-Threading (SMT) der IA-32-Architektur vorgestellt. Der
ursprüngliche Codename lautete Jackson-Technologie. Die Intel- Entwickler setzen bei der HyperThreading- Technologie auf ein Konzept, welches den Thread-Wechsel vom Betriebssystem
auslösen lässt und damit eine größtmögliche Flexibilität erreicht.
Das Ziel von Hyper-Threading ist, dass die unterschiedlichen Pipelines eines Mikroprozessors
durch unterschiedliche Threads zeitgleich - und damit wie getrennten logischen Prozessoren effizient genutzt werden. Die auf mehreren Threads aufbauenden Programme und Betriebssysteme
sehen den einen physischen Prozessor als mehrere logische Prozessoren.
Intel startete mit Hyper-Threading zunächst Anfang 2002 auf dem Xeon-Prozessor, der mit zwei
logischen CPUs arbeitet. Seit Dezember dieses Jahres wird auch der Pentium 4 mit 3,06 GHz mit
der Hyper- Threading Technologie ausgeliefert.
Auf der Hardware-Seite lassen sich vier Gruppen unterscheiden:
•
•
•
•
Ein Teil der Hardware liegt nur einfach vor. Hierzu zählen insbesondere die meisten CacheSpeicher und die einfach vorhandenen Ausführungseinheiten wie die Gleitkomma-Pipeline.
Zugriffskonflikte auf diese Teile müssen auf Hardware- Ebene abgefangen werden. Der
gemeinsame Zugriff auf den Daten-Cache erla ubt sowohl eine effiziente Nutzung der
Hardware-Ressourcen als auch den schnellen Datenaustausch zwischen zwei Threads, wenn
diese auf die selben Speicheradressen zugreifen.
Ein Teil der Hardware liegt mehrfach vor und wird parallel genutzt. Dies gilt vor allem für
Ausführungseinheiten wie die Integer-Pipelines.
Ein dritter Teil wird weiterhin nur einfach zur Verfügung gestellt und jeweils hälftig von
den beiden logischen Prozessoren genutzt. Hierzu zählen die Warteschlangen zwischen
Instruction Trace Cache und Renaming-Logik sowie zwischen Renaming- Logik und
Scheduler. Weiterhin sind das die Load-and-Store-Buffer am L1-Cache sowie die Reorder/Retire-Buffer.
Und schließlich liegt ein Teil der Prozessor-Ressourcen in doppelter Ausführung vor. Dabei
handelt es sich um die zentralen Zustands- und Datenregister und um den Interrupt
Controller, der im Pentium 4 als Advanced Programmable Interrupt Controller (APIC)
bezeichnet wird.
Abbildung 3.1: DIE - Änderungen
Seite 4
3.1 Interner Ablauf
Das Betriebssystem verwaltet den einen physikalischen Multi-Threaded-Prozessor mit den beiden
logischen Prozessoren so wie zwei getrennte physische Prozessoren. Die nächsten auszuführenden
Befehle der Threads werden in die beiden Instruction Pointer 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 folgendermaßen aus :
1. Zu Beginn sind beide logischen Prozessoren im Idle-Zustand.
2. Das Betriebssystem startet einen Thread 1 auf dem logischen Prozessor LP0. Während der
Zeit, in der nur ein Thread aktiv ist, kann dieser allein über die Ressourcen des Prozessors
verfügen. Von den doppelt vorhandenen Komponenten wird nur eine Ausführung betrieben.
3. Das Betriebssystem startet einen zweiten Thread auf dem logischen Prozessor LP1. Die
beiden Threads teilen sich nun die vorhandenen Ressourcen. Dabei konkurrieren sie um die
einfach und um die doppelt vorhandenen Hardware-Einheiten, die sie parallel nutzen.
Einfach vorhandene Komponenten, die von jedem Thread nur zur Hälfte verwendet werden
können, werden partitioniert. Für diese Aufteilung wird die Pipeline mit dem Thread 1
geleert (flushen) und anschließend mit beiden Threads neu gefüllt.
4. Wenn Thread 1 beendet ist, stehen die im vorherigen Punkt genannten Ressourcen Thread 2
vollständig zur Verfügung. Hierzu sollte Thread 1 explizit mit einem HALT beendet
werden. Das Flushen und erneute Auffüllen der Pipeline kostet Zeit, weshalb ein zu häufiger
Thread-Wechsel nicht empfehlenswert ist. Der erzielbare Leistungsgewinn würde sonst den
Aufwand nicht rechtfertigen. Neben dem Leeren der Ausführungs-Pipelines ist auch eine
besondere Behandlung von Sperrvariablen zu beachten. Sperrvariablen werden in zeitlich
beschränkten kritischen Bereichen von Prozessen und Threads eingesetzt, um deren
Unterbrechung zu vermeiden. Der neu eintretende Prozess muss entsprechend warten, bis
die Sperrvariable aufgehoben wurde. Dies geschieht in der Re gel durch eine zyklische
Abfrage. Um dabei die Verzögerung beim Verlassen der Schleife so gering wie möglich zu
halten, ist der neu eintretende Task in einem PAUSE-Status zu halten. Wenn ihm eine
längere Wartezeit bevorsteht, ist diese zyklische Abfrage nicht mehr effizient. Er muss sich
dann an das Betriebssystem wenden, damit der sperrende Task unterbrochen wird. Diese
Vorkehrungen sind abwärtskompatibel auch auf IA-32-Prozessoren ausführbar, die kein
Hyper-Threading unterstützen.
Abbildung 3.1.1: Das Konzept
Seite 5
3.2 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 das externe Layout (Footprint) der HyperThreading-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 und der Interrupt-Controlle. 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 Processors, den einer der beiden logischen Prozessoren
darstellt 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 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.
4. Leistungssteigerung
Laut Intel soll die Leistungssteigerung 30 Prozent betragen. Diese Leistungssteigerung gilt es in
diesem Kapitel zu beweisen.
Erst einmal muss gesagt werden, dass nicht die absolute Leistung gesteigert wird, sondern der
Durchsatz. Das bedeutet, dass falls ein einzelner Thread auf einem der logischen Prozessoren laufen
würde, dieser nicht schneller beendet würde als auf einem „normalen“ Uni-Prozessor-System. Dies
ist nur verständlich, da diesem Thread nicht mehr Ressourcen zur Verfügung stehen. Das Prinzip
greift erst, wenn mehrere Threads auf den logischen Prozessoren laufen.
Ein Beispiel kann dies verdeutlichen: Auf einem Prozessor ohne Hyper-Threading werden zwei
Threads gestartet. Der erste ist nach 1,5 Minuten beendet und der zweite nach weiteren 1,5
Minuten. Damit hat der Prozessor beide Threads in insgesamt 3 Minuten bearbeitet.
Nun werden diese beiden Threads auf einem Prozessor mit Hyper-Threading gestartet. Der erste
Thread ist auch hier bestenfalls nach 1,5 Minuten beendet, wobei der zweite nur weitere 30
Sekunden zur Beendigung benötigt. Die Gesamtdauer betrug hier nur zwei Minuten.
Hieran kann man sehen, dass der erste Thread nic ht schneller abgearbeitet wurde, aber
währenddessen noch Ressourcen für den zweiten zur Verfügung standen. In diesem Bespiel wäre
der Durchsatz also um 50 Prozent gestiegen.
Seite 6
Da diesem Bericht nicht die Mittel für eine eigene Untersuchung der Leistungssteigerung durch
Hyper-Threading zur Verfügung standen, werden im Weiteren Messungen der Internetseite
www.hardtecs4u.de herangezogen.
Das Testsystem bestand aus einem Intel Pentium 4 3,06 GHz auf einem Mainboard mit Intels i850E
Chipsatz. Alle Tests wurden unter Microsoft Windows XP Professional mit Service Pack 1
absolviert.
Als erstes wurde die Leistung mittels des handelsüblichen Benchmark-Programms SiSoft Sandra in
der Version 1.18.58 gemessen, wobei die ALU-Geschwindigkeit und die FPU-Geschwindigkeit
gemessen wurden. Dieser Benchmark hat den Ruf, die Verhältnisse normaler Alltags-Software sehr
gut zu simulieren.
Abbildung 4.1: Sandra CPU Benchmark
Diese Messung zeigt, dass in diesem Fall die FPU-Leistung um 56 Prozent gestiegen ist. Auch die
ALU-Leistung stieg mit aktiviertem Hyper-Threading um 23 Prozent.
Seite 7
Ein zweiter Test mit Maxon Cinema 4D XL Raytracing Benchmark, welcher multthreaded
programmiert ist, zeigt die Leistungssteigerung an einem praktischen Bespiel.
Abbildung 4.2: Maxon Cinema 4D XL Raytracing Benchmark
Dieser Test bescheinigt der Hyper-Threading- Technologie immerhin einen Leistungszuwachs von 4
Prozent.
Als Multimedia-Test soll der Prozessor ein Musikstück ins MPEG-Format MP3 kodieren. Zu
diesem Zweck wird das Kodierungsprogramm MAGIX MP3 Maker Platinum in der Version 3.04d
verwendet.
Abbildung 4.3: MPEG-Kodierung mit MAGIX MP3 Maker Platinum
Die Kodierung bewältigt der Prozessor mit aktiviertem Hyper-Threading mit 41,97facher
Abspielgeschwindigkeit, während ohne Hyper-Threading nur 36,23fache Abspielgeschwindigkeit
erreicht wird. Dies entspricht einer Leistungserhöhung von 16 Prozent.
Seite 8
Als letztes wurde die Leistungssteigerung im Multi-Tasking-Bereich untersucht. Hierzu wurden
einige Programme parallel ausgeführt. Dabei wurde die Zeit bis zum Abschluss beider Programme
gemessen und dargestellt.
Abbildung 4.4: Leistungssteigerung Multi-Tasking
In diesem Bereich kann Hyper-Threading voll auftrumpfen. Leistungssteigerungen von 84 Prozent
sprechen eine deutliche Sprache. Hier kommt die unterschiedliche Nutzung der Ressourcen des
Prozessors zum Tragen, was Hyper-Threading durch geschickten Taskwechsel ausnutzt.
Seite 9
5. Vor- und Nachteile
Vorteile:
1. Der zusätzliche Aufwand von Hyper-Threading auf dem Prozessor ist so gering, dass
fast keine Mehrkosten anfallen.
2. Wie in Kapitel 4 gezeigt wurde, bietet diese Technik eine Steigerung des
Durchsatzes von ca. 30 Prozent. Die weit wichtigere Steigerung bei nebeneinander
laufenden Programmen von bis zu 80 Prozent ist deutlicher spürbar.
Nachteile:
1. Schlechte Programmierung der Anwendungen kann die Geschwindigkeit des
Prozessors ausbremsen. Threads, die von einander abhängig sind und über eine
globale Variable synchronisiert werden, sind ein Beispiel für diese schlechte
Programmierung. Das heißt, dass zum Beispiel der eine Thread auf das Ergebnis des
anderen wartet und mit einer Schleife immer wieder eine global Variable abfragt und
somit die Ressourcen des Prozessors blockiert.
2. Die Hyper-Threading Technologie bringt bisher ca. 30 Prozent mehr Leistung. Ein
echtes Dual-Prozessor-System kommt auf höhere Performancewerte, gerade bei FPU
intensiven Programmen
3. Als Drittes haben die Kernel von Multiprozessor-Betriebssystemen einen höheren
Verwaltungsaufwand zu bearbeiten. Diese aufwendigen Synchronisierungsmechanismen brauchen Zeit, die ein Uni-Prozessorkernel nicht benötigt.
6. Fazit
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 und
erhöht somit die Produktionskosten nur minimal.
Diese Erhöhung der Leistung zum „Nulltarif“ ergibt sich aber nur, wenn die Software auch
entsprechend programmiert worden ist. Somit ist nicht eine einzige laufende Software das
eigentliche Ziel von Hyper-Threading, sondern der Multitasking Betrieb, in dem diese Technologie
auftrumpfen kann.
Seite 10
7. Quellen
Anand Lal Shimpi, Intel's Hyper-Threading Technology: Free Performance?, (14.02.2002),
http://www.anandtech.com/cpu/showdoc.html?i=1576&p=1
Anand Lal Shimpi, Intel's Pentium 4 3.06GHz: Hyper-Threading on Desktops, (14.11.2002),
http://www.anandtech.com/cpu/showdoc.html?i=1746
Bruce Gain, Intel's Pentium Performance Hangs on a Hyper-Thread, (02.12.2002)
http://www.tomshardware.com/cpu/20021202/index.html
Frank Völkel, Bert Töpelt und Uwe Scheffel, Single-CPU im Dual-Betrieb: P4 3,06 GHz mit
Hyper-Threading, (14.11.2002), http://www.de.tomshardware.com/cpu/02q4/021114/index.html
Intel Corporation, Hyper-Threading Technology, (2002),
http://www.intel.com/technology/hyperthread/index.htm
John L. Gustafson, Reevaluating Amdahl's Law, (2002),
http://www.scl.ameslab.gov/Publications/AmdahlsLaw/Amdahls.html
Jon "Hannibal" Stokes, Introduction to Multithreading, Superthreading and hyper-threading,
(02.10.2002), http://arstechnica.com/paedia/h/hyperthreading/hyperthreading-1.html
Matthias Wothopf, Virtuelles Tandem: Hyper-Threading im neuen Pentium 4 mit 3.06 GHz,
(15.11.2002), c't 24/2002, S. 120
Nick Stam, Desktop Hyper-Threading – Coming Soon!, (03.10.2002)
http://www.extremetech.com/article2/0,3973,587843,00.asp
Peter Gräber, Pentium 4 3.06 GHz mit Hyper-Threading Technologie, (14.11.2002),
http://www.hardtecs4u.de/reviews/2002/p4_3.06ghz/
2CPU.com, Hyperthreading Performance Explored, (30.06.2002),
http://www.2cpu.com/Hardware/ht_analysis/
Seite 11