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