CPU-Grundlagen: Multithreading

Feinkörnige Parallelität

Der Ansatz zu einer Ausführung von parallelen Threads mit Feinkörnigkeit besteht in der Fokussierung auf Instruktionsblöcke. Hier liegt es nahe, die Basisblöcke (siehe Superskalare Prozessorarchitekturen) und die schon beschriebenen Hyperblöcke (siehe Compiler-Techniken für superskalare Prozessoren) zu Grunde zu legen. Diese Blöcke beinhalten einen ungestörten sequenziellen Fluss von Instruktionen und eignen sich ideal für die superskalare Ausführung. Teil a) des Bilds zeigt den Kontrollflussgraphen (CFG, Control Flow Graph) eines Beispielprogramms: Die Instruktionsblöcke - auch als Microthreads bezeichnet - stellen die Knoten, die Übergänge zu anderen Blöcken die Kanten dar. Die Darstellung als CFG beinhaltet zunächst nur die statische Repräsentation des Programms, Aussagen über den tatsächlichen Programmverlauf sind nicht enthalten.

Den dynamischen Kontrollfluss stellt Teil a) des Bilds ebenfalls dar. Das Programm durchläuft je nach Kontext verschiedene Knoten. Die Auswertung dieses aktuellen Programmverlaufs behandeln die folgenden Ansätze zum Multithreading jeweils ganz unterschiedlich.

Multiskalare Prozessoren ordnen verschiedenen Knoten des CFG, also Instruktionsblöcken, verschiedene Prozessorelemente (PE) der CPU zu. Diese bewirkt, dass der Prozessor mehr auf Instruktionsblockbasis als auf Instruktionsbasis arbeitet. Teil b) des Bilds zeigt eine derartige Abbildung der Microthreads auf die Prozessorelemente. Die multiskalare Architektur besticht dabei durch einen einfachen Ansatz: Im Gegensatz zur superskalaren CPU verteilt sie die Ressourcen auf mehrere, eher als RISC-Architektur ausgeführte und weit gehend eigenständige Prozessoren (PE genannt). Jeder dieser PEs bekommt einen Microthread zur Ausführung. Der Name multiskalar rührt von dem Ansatz her, dass viele skalare Ausführungseinheiten nebeneinander arbeiten.