Parallelisierung (Prozessor)

Die Entwickler von Prozessoren haben im Laufe der Zeit festgestellt, dass sich die Verarbeitungsgeschwindigkeit eines Prozessors nicht nur durch die Erhöhung der Taktrate beschleunigen lässt. So kommt es bei der Abarbeitung des Programmcodes immer wieder zu Verzögerungen. Zum Beispiel beim Zugriff auf den Speicher oder die Peripherie. In so einem Fall ist der Prozessor mit Warten beschäftigt. Er macht erst dann im Programmcode weiter, wenn die Daten aus dem Speicher oder von der Peripherie in die Register geladen wurden. Diese Wartezeit führt dazu, dass ein Großteil der zur Verfügung stehenden Rechenleistung überhaupt nicht genutzt wird.
Deshalb haben sich die Prozessor-Entwickler schon sehr früh überlegt, wie sie einen Prozessor intern so strukturieren müssen, damit er im Programmcode weitermachen kann, während Daten von außen geladen werden. Das hat dazu geführt, dass moderne Prozessoren die anstehenden Aufgaben auf viele parallel arbeitende Einheiten verteilen.

Ebenen der Parallelität/Parallelisierung

Pipelining

Die Befehlsausführung erfolgt wie an einem Fließband (Pipeline). Eine Pipeline ist eine Abfolge von Verarbeitungseinheiten, die einen Befehl ausführen. Wenn ein Befehl von Phase 1 seiner Bearbeitung in Phase 2 tritt, betritt der nächste Befehl Phase 1. Die Bearbeitung in jeder Phase dauert im Optimalfall einen Taktzyklus.

Multi-Threading

Multi-Threading
Mit Multi-Threading ist die Fähigkeit eines Prozessors gemeint, der mehrere Berechnungen parallel ablaufen lassen kann. Im Idealfall laufen zwei oder mehr Aktionen oder Programmabläufe (Threads) gleich lang und können anschließend miteinander kombiniert werden. Die Wartezeit für den Nutzer würde sich erheblich reduzieren.
Leider lassen sich nicht alle Aufgaben gleich gut parallelisieren. Es kommt eben auch vor, dass ein Thread auf einen anderen warten muss. Algorithmen, die sich schlecht parallelisieren lassen oder schlecht parallelisiert sind, vergeuden die Zeit mit aufwendigen Abgleichprozeduren. Erschwerend sind die vielen Engstellen im System. Zum Beispiel Schnittstellen- und Massenspeicherzugriffe.
Für den Programmierer ist nicht immer ersichtlich, welche Funktionen sich für die Auslagerung in einen eigenen Thread eignen. Das Parallelisieren von Funktionen verlangt vom Programmierer eine völlig andere Denkweise. In Echtzeitstrategiespielen könnte die Spielelogik unabhängig von der grafischen Ausgabe und der Eingabeverarbeitung arbeiten. Bei der Bildbearbeitung lohnt es sich zum Beispiel aufwendige Berechnungen in einen eigenen Thread zu verlagern. So bleibt der Zugriff auf das Programm für den Nutzer möglich. Doch nicht immer kann das so umgesetzt werden. So wird ein Großteil der Berechnungen von der Grafikkarte selbst ausgeführt. Hinzu kommt, dass die Treiber für OpenGL und DirectX nur einen Thread gleichzeitig bearbeiten können.

SMT - Simultanes Multi-Threading (Intel)

Simultanes Multi-Threading bedeutet, dass mehrere Threads gleichzeitig abgearbeitet werden. Ein Thread ist ein Code-Faden bzw. ein Programmablauf. Wartet ein Thread auf Daten aus dem Speicher, dann wird auf einen anderen Thread umgeschaltet, der die freien Ressourcen weiterverwendet.
SMT wird deshalb gerne eingesetzt, weil ein Thread alleine die ganzen Funktionseinheiten in einem Prozessor überhaupt nicht auslasten kann. Die Auslastung ist bei zwei gleichzeitig ablaufenden Threads wesentlich besser. Außerdem sind die Ausführungspfade unterschiedlicher Threads unabhängig voneinander. Sie kommen sich nur sehr selten in die Quere.
Weil SMT relativ gut funktioniert kann man auf die Out-of-Order-Technik verzichten. Das macht sich insbesondere beim Energieverbrauch bemerkbar. Single-Thread-Prozessoren mit SMT verbrauchen einfach weniger Leistung.

Hyper-Threading (Intel)

Hyper-Threading ist eine Entwicklung von Intel und eine Vorstufe zum Multicore-Prozessor. Hyper-Threading gaukelt dem Betriebssystem einen zweiten Prozessorkern vor, um dadurch die Funktionseinheiten besser auszulasten und Speicherwartezeiten zu überbrücken.
Wenn der erste Thread des Prozessors auf Daten aus dem Speicher warten muss, dann kann der Prozessor den zweiten Thread nutzen, um im Programmcode weiter zu machen. Wenn ein genügend großer Cache und ein gutes Prefetching vorhanden sind, dann stehen die Chancen nicht schlecht, dass die Wartezeit sinnvoll überbrückt werden kann.
Prefetching ist ein Verfahren, bei dem Befehle und Daten vorab geladen und ausgeführt werden.
Der zusätzliche Hardware-Aufwand für Hyper-Threading liegt bei 20 Prozent und soll mit 40 bis 50 Prozent Geschwindigkeitsgewinn im Multi-Threading-Betrieb bringen.

Coprozessor

Coprozessor
Der Coprozessor ist ein spezieller Prozessor, der den Hauptprozessor um bestimmte Funktionen erweitert und ihn entlastet. Der Coprozessor beschleunigt dadurch das ganze System. Im Lauf der Zeit wurden viele Funktionen klassischer Coprozessoren in den Hauptprozessor integriert.

Multi-Core-Prozessor

Multi-Core / Mehrkern-Prozessoren
Bei der Mehrkern-Technik sind in einem Prozessor (CPU) mehrere Kerne (Core) zusammenschaltet. Das bedeutet, moderne Prozessoren haben nicht nur eine Recheneinheit, sondern mehrere. Man bezeichnet diese Prozessoren als Multi-Core- oder Mehrkern-Prozessoren. Rein äußerlich unterscheiden sich Multi-Core-CPUs nicht von Single-Core-CPUs. Innerhalb des Betriebssystems wird der Multi-Core-Prozessor wie mehrere Einheiten behandelt. Je nach Anzahl der Kerne gibt es abgewandelte Bezeichnungen, die darauf hindeuten, wie viele Kerne im Prozessor integriert sind.

Multi-Prozessor-System

Multi-Prozessor-System
Seit Anfang der 1990er Jahre gibt es in Superrechnern mehrere Prozessoren mit eigenem Arbeitsspeicher. Diese Systeme werden als Multi-Prozessor-Systeme bezeichnet. In Personal Computern haben sich mehrere Prozessoren nicht durchgesetzt. Hier dominieren Multi-Core-Prozessoren.

Grid / Cloud-Computing

Grid
Die Vernetzung von Computersystemen zur parallelen Berechnung und Verarbeitung von Daten bezeichnet man als Grid. Häufig wird das Grid auch als Cloud bezeichnet. Man spricht dann von Cloud Computing.