Prozessoren mit hardwareseitigem Multithreading (auch mehrfädige Prozessoren genannt) können auf jedem Prozessorkern parallel mehrere Prozesse, d. h. mehrere Programme oder Programmteile gleichzeitig ausführen. Der Nutzen besteht in einer besseren Auslastung der Rechenwerke jeder CPU und in einer schnelleren Antwort des Gesamtsystems auf externe Ereignisse, da mehr Aufgaben parallel bearbeitet werden können.
Der Hauptaufwand von hardwareseitigem Multithreading ergibt sich aus dem Bereitstellen mehrerer Registerfiles. Bei den ersten Intel Xeons mit HT machte dies etwa 5 Prozent der Prozessorfläche aus.[1]
Im Gegensatz zur Ausführung auf mehreren Prozessoren (bei dem sich Prozesse i. A. "nur" den Hauptspeicher, I/O und den L3-Cache, ggf. auch Stromaufnahme und Verlustleistung teilen müssen), müssen sich Prozesse bei hardwareseitigem Multithreading wesentlich mehr Betriebsmittel teilen, so u. a. L1-Cache, L2-Cache, µOp-Cache, Sprungvorhersage, Instruction-Fetcher, Befehlsdecoder, Physical Register File, Reservation Station, Load and Store Buffer, TLBs, Arithmetik-Logik-Einheiten, Gleitkomma-Einheiten. Da die Recheneinheiten eines Prozessor-Kerns selten vollständig ausgelastet werden, ergibt sich bei hardwareseitigem Multithreading[2] gegenüber einfachen Prozessoren eine laut Intel bis zu 30 Prozent höhere Rechenleistung.[3] In der Praxis liegt der Wert selten über 15 Prozent. Bei speicherintensiven Applikationen kann durch Cache-Thrashing der Gewinn auch negativ ausfallen.
Es erfolgt kein Wechsel zwischen den Threads, die Befehle der Threads werden gleichzeitig ausgeführt. Es entstehen damit keine Totzeiten (10–30 ms) durch Kontextwechsel des Betriebssystems. Hierzu besitzt jeder Prozessor-Kern zwei Architecture-States inklusive Registersatz, Stapelspeicher, Programmzähler und MMU.[4]
Prozessoren, die pro Kern gleichzeitig sehr viele Threads abarbeiten, heißen Barrel-Prozessoren. Beispiele sind der XMOS XCore XS1-L1 mit 8 Threads/Kern, die CDC 6000 mit 10 Threads/Kern und die Cray Tera MTA mit 128 Threads/Kern.
Der Nutzen von Multithreading ist eine bessere Auslastung der Ressourcen der CPU.
Zwar wird in modernen Prozessoren, welche alle eine Pipeline haben, beispielsweise durch Out-of-order execution schon versucht die Auslastung zu steigern, dennoch haben Untersuchungen ergeben, dass viele Teilwerke der Pipeline durch bspw. simultanes Multithreading zusätzlich noch besser ausgelastet werden können. Ein Grund dafür sind Pipeline-Hazards, die die Pipeline kurz anhalten können.
Multithreadingfähige Prozessoren bearbeiten deshalb mehrere Threads quasi-gleichzeitig. Dies kann in verschiedenen Varianten erfolgen:
In Anwendungen im Bereich eingebetteter Systeme bieten mehrfädige Prozessoren neben dem reinen Leistungsgewinn zusätzliche Möglichkeiten durch explizite Verwendung der Mehrfädigkeit. Solche Prozessoren bieten programmierbare Algorithmen zur Steuerung der einzelnen Programmthreads (hier Kontext genannt). So kann beispielsweise ein Kontext deterministisch einen gewissen Anteil der Takte und damit der Prozessorleistung belegen. Die Kontexte können auch durch eine Prioritätensteuerung um die Rechenzeit konkurrieren.
Sie können durch entsprechende Befehle in einen Wartezustand versetzt und durch Hardware-Ereignisse aufgeweckt werden. Hierdurch sind sehr schnelle Reaktionen des Systems möglich, da im Gegensatz zum klassischen Hardware-Interrupt keinerlei Overhead beim Kontextwechsel notwendig ist.
Kontexte, die nur einen geringen Teil der Clock-Zyklen belegen, können dauerhaft zyklisch laufen, ohne die Leistung des Systems merklich zu beeinflussen und z. B. zum Erzeugen oder Entschlüsseln schneller Signale eingesetzt werden.
Somit kann durch den Einsatz von multithreadingfähigen Prozessoren durch nur geringen Aufwand im Prozessorchip auf dedizierte Hardware oder zusätzliche Prozessoren bzw. digitale Signalprozessoren verzichtet werden.
Da in diesen Anwendungen deutlich mehr als zwei Threads sinnvoll sind, werden in multithreadingfähige, eingebettete Prozessoren nicht mehrere Pipelines implementiert, sondern die erste Stufe der Pipeline entscheidet über den als nächsten auszuführenden Kontext.
Beispiele für mehrfädige Prozessoren für eingebettete Anwendung: