Die eigentliche Stärke der mehrfädigen Prozessoren ist, daß sie die Latenzen eines Thread mit Befehlen eines anderen Thread füllen können. Dadurch wird die Performance einer Menge von Threads erhöht. Man nimmt dabei eventuell in Kauf, daß die Performance eines exklusiv laufenden Threads sogar etwas schlechter wird.
Generell gibt es drei mögliche Varianten von mehrfädigen Prozessoren, die sich darin unterscheiden, wann von einem Thread zum nächsten umgeschaltet wird.
Beim Block-Interleaving wird zwischen zwei Thread-Wechseln eine größere Anzahl von Befehlen eines Thread ausgeführt. Wenn die Befehlsblöcke groß genug sind, kann man dieses Verfahren auch dann noch anwenden, wenn das Umschalten einige Takte in Anspruch nimmt.
Wann umgeschaltet wird, wird entweder vom Compiler statisch vorgegeben, oder vom Betriebssytem oder dem Prozessor dynamisch zur Laufzeit entschieden. Um einen Thread-Wechsel durch das Betriebssystem zu ermöglichen, muß der Befehlssatz um spezielle Befehle erweitert werden. Eine weitere statische Variante teilt alle Befehle in Klassen ein und schaltet um, sobald ein Befehl einer bestimmten Klasse erkannt wird.
Bei dynamischen Strategien entscheidet der Prozessor nicht nur anhand des aktuellen Befehls, sondern zusätzlich aufgrund seines momentanen Zustandes. So kann beispielsweise ein Umschalten durch einen Cache-Fehlzugriff ausgelöst werden.
Die zweite Variante ist das Cycle-By-Cycle-Interleaving. Dabei wird auf jeden Fall nach jedem Befehl der Thread umgeschaltet. Das kann man natürlich nur machen, wenn der Umschaltvorgang selbst keinen zusätzlichen Takt benötigt. Dieses Verfahren reduziert zwar die Auswahllogik im einfachsten Fall auf ein Schieberegister, man bekommt aber eine schlechtere Performance, wenn nur ein Thread im System läuft, da dann für jeden genutzten Takt mehrere Takte ungenutzt bleiben. Außerdem können lange Latenzen, wie sie bei einem Cache-Miss auftreten, nicht gut überbrückt werden. Man würde in einem solchen Fall sehr viele Threads brauchen.
Beim Simultaneous Multithreading werden in jedem Takt Befehle aus verschiedenen Threads in die Ausführungseinheiten einer superskalaren Pipeline eingefüttert. Das erhöht die Warscheinlichkeit, daß in einem Takt alle Ausführungseinheiten ausgelastet werden können. Dafür ist normalerweise nicht genügend Parallelität auf Befehlsebene in einem einzelnen Thread vorhanden.
Idealerweise sollte der Prozessor flexibel genug sein, immer einen ausführbaren Thread zu finden, wenn es einen gibt, ohne von vornherein auf eine Reihenfolge festgelegt zu sein. In diesem Projekt soll er zusätzlich die Einhaltung harter Echtzeitbedingungen unterstützen.