Multithreading (Computerarchitektur)

Im Rechnerarchitektur, Multithreading ist die Fähigkeit von a Zentrale Verarbeitungseinheit (CPU) (oder ein einzelner Kern in a Multi-Core-Prozessor) um mehrere zu liefern Ausführungsfäden Gleichzeitig unterstützt von der Betriebssystem. Dieser Ansatz unterscheidet sich von Multiprozessierung. In einer Multithread -Anwendung teilen die Threads die Ressourcen einer einzelnen oder mehrere Kerne, die die Computereinheiten enthalten, die CPU -Caches, und die Übersetzungs -Lookaside -Puffer (TLB).
Wenn Multiprozesationssysteme mehrere vollständige Verarbeitungseinheiten in einem oder mehreren Kernen enthalten, zielt Multithreading darauf ab, die Nutzung eines einzelnen Kerns durch Verwendung zu erhöhen Parallelität auf Fadenebene, ebenso gut wie Parallelität auf Befehlsebene. Da die beiden Techniken komplementär sind, werden sie in nahezu allen modernen Systemarchitekturen mit mehreren Multithreading -CPUs und CPUs mit mehreren Multithreading -Kernen kombiniert.
Überblick
Das Multithreading Paradigma ist als Bemühungen zur weiteren Ausbeutung populärer geworden Parallelität auf Befehlsebene sind seit Ende der neunziger Jahre ins Stocken geraten. Dies ermöglichte das Konzept von Durchsatz Computing wieder aus dem spezialisierten Bereich von zu trennen Transaktionsverarbeitung. Obwohl es sehr schwierig ist, einen einzelnen Thread oder ein einzelnes Programm weiter zu beschleunigen, sind die meisten Computersysteme tatsächlich Multitasking zwischen mehreren Threads oder Programmen. Daher führen Techniken, die den Durchsatz aller Aufgaben verbessern, zu Gesamtleistungsergebnissen.
Zwei Haupttechniken für das Durchsatz -Computing sind Multithreading und Multiprozessierung.
Vorteile
Wenn ein Thread viel bekommt Cache FehlerDie anderen Threads können die nicht verwendeten Rechenressourcen weiter nutzen, was zu einer schnelleren Gesamtausführung führen kann, da diese Ressourcen untätig gewesen wären, wenn nur ein einzelner Thread ausgeführt würde. Wenn ein Thread nicht alle Computerressourcen der CPU verwenden kann (da die Anweisungen vom Ergebnis des anderen abhängen), kann das Ausführen eines anderen Threads verhindern, dass diese Ressourcen im Leerlauf werden.
Nachteile
Mehrere Threads können sich beim Teilen von Hardware -Ressourcen wie Caches oder gegenseitig beeinträchtigen Übersetzungs -Lookaside -Puffer (Tlbs). Infolgedessen werden die Ausführungszeiten eines einzelnen Threads nicht verbessert und können abgebaut werden, selbst wenn nur ein Thread ausgeführt wird, aufgrund niedrigerer Frequenzen oder zusätzlicher Pipeline-Stufen, die zur Aufnahme von Hardware mit Thread-Schaltungen erforderlich sind.
Die Gesamteffizienz variiert; Intel behauptet bis zu 30% Verbesserung mit seinem Hyper-Threading-Technologie,[1] Während ein synthetisches Programm, das gerade eine Schleife nicht optimierter abhängiger Gleitkommaoperationen durchführt, beim parallelen Betrieb tatsächlich eine Geschwindigkeitsverbesserung von 100% erhöht. Andererseits handgeklemmt Montagesprache Programme verwenden MMX oder Altivec Erweiterungen und Durchführung von Datenpräfiten (wie ein guter Videocodierer) leiden nicht unter Cache -Missen oder Ressourcen für das Leerlauf. Solche Programme profitieren daher nicht von Hardware -Multithreading und können aufgrund der Auseinandersetzung mit gemeinsamen Ressourcen tatsächlich eine verschlechterte Leistung erkennen.
Aus Sicht der Software ist die Hardware -Unterstützung für Multithreading für die Software sichtbarer und erfordert mehr Änderungen an Anwendungsprogrammen und Betriebssystemen als Multiprozessing. Hardware -Techniken zur Unterstützung Multithreading häufig parallel zu den verwendeten Softwaretechniken Computer Multitasking. Die Thread -Planung ist auch ein großes Problem beim Multithreading.
Arten von Multithreading
Verschachtelter/zeitliches Multithreading
Grobkörniges Multithreading
Die einfachste Art von Multithreading tritt auf, wenn ein Thread ausgeführt wird, bis er durch ein Ereignis blockiert wird, das normalerweise einen langen Latenzstand erzeugt. Ein solcher Stand könnte ein Cache-Fehlschlag sein, der auf Off-Chip-Speicher zugreifen muss, der möglicherweise Hunderte von CPU-Zyklen für die Rückkehr der Daten benötigen. Anstatt auf die Lösung des Standes zu warten, wechselte ein Thread -Prozessor die Ausführung auf einen anderen Thread, der bereit war, auszuführen. Erst wenn die Daten für den vorherigen Thread angekommen waren, würde der vorherige Thread wieder auf die Liste von platziert werden bereit zu rennen Themen.
Zum Beispiel:
- Zyklus i: Anweisung j Aus Thread A wird ausgestellt.
- Zyklus i + 1: Anweisung j + 1 Aus Thread A wird ausgestellt.
- Zyklus i + 2: Anweisung j + 2 Aus Thread A wird ausgestellt, eine Lastanweisung, die in allen Caches verfehlt.
- Zyklus i + 3: Thread Scheduler aufgerufen, schaltet zum Thread um B.
- Zyklus i + 4: Anweisung k Aus Thread B wird ausgestellt.
- Zyklus i + 5: Anweisung k + 1 Aus Thread B wird ausgestellt.
Konzeptionell ähnelt es dem in verwendeten kooperativen Multitasking Echtzeit-Betriebssysteme, in denen Aufgaben freiwillig die Ausführungszeit aufgeben, wenn sie auf eine Art von Ereignis warten müssen. Diese Art von Multithreading ist als Block, kooperativ oder grobkörnig bekannt.
Das Ziel der Multithreading -Hardware -Unterstützung ist es, schnell zwischen einem blockierten Faden und einem anderen Faden zu wechseln. Wenn Sie von einem Thread zu einem anderen wechseln, bedeutet dies, dass die Hardware -Switches von einem Register auf ein anderes eingestellt sind. Um dieses Ziel zu erreichen, wird die Hardware für das Programm sichtbare Register sowie einige Register der Prozessorkontrolle (wie z. B. dem Programmzähler) repliziert. Um beispielsweise schnell zwischen zwei Threads zu wechseln, wird der Prozessor mit zwei Registersätzen erstellt.
Zusätzliche Hardware -Unterstützung für Multithreading ermöglicht das Einschalten von Threads in einem CPU -Zyklus, wodurch Leistungsverbesserungen erzielt werden. Außerdem ermöglicht zusätzliche Hardware jedem Thread, sich so zu verhalten, als würde er allein ausgestellt und keine Hardware -Ressourcen mit anderen Threads weitergeben, wodurch die Anzahl der in der Anwendung benötigten Softwareänderungen und das Betriebssystem zur Unterstützung von Multithreading minimiert werden.
Viele Familien von Mikrocontroller und eingebettete Prozessoren haben mehrere Registerbanken, um schnell zu ermöglichen Kontextumschaltung für Interrupts. Solche Schemata können als eine Art Block -Multithreading unter dem Benutzerprogramm -Thread und den Interrupt -Threads angesehen werden.
Feinkörniger Multithreading
Der Zweck von feinkörnigem Multithreading besteht darin, alle zu entfernen Datenabhängigkeit Stände aus der Ausführung Pipeline. Da ein Thread relativ unabhängig von anderen Fäden ist, besteht weniger die Wahrscheinlichkeit, dass eine Anweisung in einer Pipelining -Stufe eine Ausgabe aus einer älteren Anweisung in der Pipeline benötigt. Konzeptionell ist es ähnlich wie Präventiv Multitasking in Betriebssystemen; Eine Analogie wäre, dass die Zeitschnitte für jeden aktiven Faden ein CPU -Zyklus ist.
Zum Beispiel:
- Zyklus i + 1: eine Anweisung aus Thread B wird ausgestellt.
- Zyklus i + 2: eine Anweisung aus Thread C wird ausgestellt.
Diese Art von Multithreading wurde zunächst als Fassverarbeitung bezeichnet, bei denen die Dauben eines Fass die Pipeline -Stufen und deren ausführende Threads darstellen. Verschachtelte, präventive, feinkörnige oder zeitgeschnittene Multithreading sind modernere Terminologie.
Zusätzlich zu den Hardwarekosten, die im Blocktyp Multithreading besprochen werden, hat das Intervolved Multithreading zusätzliche Kosten für jede Pipeline -Stufe, die die Thread -ID der von ihr verarbeitenden Befehls verfolgt. Da in der Pipeline gleichzeitig mehr Threads ausgeführt werden, müssen gemeinsame Ressourcen wie Caches und TLBs größer sein, um ein Verstürschen zwischen den verschiedenen Fäden zu vermeiden.
Simultanes Multithreading
Die fortschrittlichste Art von Multithreading gilt für Superscalar -Prozessoren. Während ein normaler superzalarer Prozessor in jedem CPU -Zyklus mehrere Anweisungen aus einem einzelnen Thread ausgibt, kann ein superzalarer Prozessor bei gleichzeitiger Multithreading (SMT) jeden CPU -Zyklus Anweisungen aus mehreren Threads ausstellen. Erkennen, dass ein einzelner Thread eine begrenzte Menge an hat Parallelität auf BefehlsebeneDiese Art von Multithreading versucht, die Parallelität über mehrere Fäden zu nutzen, um den mit nicht verwendeten Ausgabe von Slots verbundenen Abfällen zu verringern.
Zum Beispiel:
- Zyklus i: Anweisungen j und j + 1 Aus Thread A und Anweisung k Aus Thread B gleichzeitig ausgestellt werden.
- Zyklus i + 1: Anweisung j + 2 Aus Thread A, Anweisung k + 1 Aus Thread Bund Anweisung m Aus Thread C werden alle gleichzeitig ausgegeben.
- Zyklus i + 2: Anweisung j + 3 Aus Thread A und Anweisungen m + 1 und m + 2 Aus Thread C werden alle gleichzeitig ausgegeben.
Um die anderen Arten von Multithreading von SMT, dem Begriff, zu unterscheiden "Temporales Multithreading"Wird verwendet, um zu bezeichnen, wann Anweisungen aus nur einem Thread gleichzeitig ausgegeben werden können.
Zusätzlich zu den für verschachtelten Multithreading besprochenen Hardwarekosten verfügt SMT über die zusätzlichen Kosten für jede Pipeline -Stufe, in der die Thread -ID jeder zu verarbeitenden Anweisung verfolgt wird. Auch hier müssen gemeinsame Ressourcen wie Caches und TLBs für die große Anzahl aktiver Threads verarbeitet werden.
Implementierungen umfassen Dez (später Compaq) EV8 (nicht vollständig), Intel Hyper-Threading-Technologie, IBM Power5/Power6/Power7/Power8/Power9, IBM Z13/Z14/Z15, Sun Microsystems Ultrassparc T2, Cray Xmt, und AMD Bulldozer und Zen Mikroarchitekturen.
Implementierungspezifikationen
Ein wichtiger Forschungsbereich ist der Thread-Scheduler, der sich schnell aus der Liste der referenzierenden Threads auswählen muss, um als nächstes auszuführen und die laufenden und blockierten Thread-Listen zu verwalten. Ein wichtiger Subtopic sind die unterschiedlichen Thread -Prioritätsschemata, die vom Scheduler verwendet werden können. Der Thread Scheduler wird möglicherweise vollständig in Software, vollständig in Hardware oder als Hardware-/Software -Kombination implementiert.
Ein weiterer Forschungsbereich ist, welche Art von Ereignissen einen Thread-Switch verursachen sollten: Cache-Missen, Kommunikation zwischen Thread, DMA Fertigstellung usw.
Wenn das Multithreading-Schema den gesamten software-sichtbaren Zustand repliziert, einschließlich privilegierter Kontrollregister und TLBs, ermöglicht es virtuelle Maschinen für jeden Thread erstellt werden. Dadurch kann jeder Thread sein eigenes Betriebssystem auf demselben Prozessor ausführen. Wenn andererseits nur der Status des Benutzermodus gespeichert wird, ist weniger Hardware erforderlich, wodurch mehr Threads gleichzeitig für denselben Würfelbereich oder Kosten aktiv sind.
Siehe auch
Verweise
- ^ "Intel Hyper-Threading-Technologie, technischer Benutzerhandbuch" (PDF). p. 13. archiviert von das Original (PDF) Am 2010-08-21.
Externe Links
- Eine Übersicht unter Prozessoren mit explizitem Multithreading, ACM, März 2003, von Theo Ungerer, Borut Robi und Jurij Silc
- Betriebssystem | Unterschied zwischen Multitasking, Multithreading und Multiprozessierung Geeksforgeeks, 6. September 2018.