# Parallelrechner

Ein Parallelrechner ist ein Rechner, in dem Rechenoperationen gleichzeitig unter anderem auf mehreren Haupt- oder Grafikprozessoren durchgeführt werden können.

## Anwendungsbereiche

Grob können die folgenden Anwendungsbereiche unterschieden werden:

### Massiv-parallele Verarbeitung

Verteilte Problemstellungen, wie z. B. Wettervorhersagen. Dabei wird z. B. die Erdoberfläche in Planquadrate aufgeteilt und jeweils ein Prozessor übernimmt die Berechnung für ein Planquadrat. Um die Einflüsse zwischen benachbarten Planquadraten zu berücksichtigen, müssen dazu die Prozesse auf den unterschiedlichen Prozessoren untereinander Daten austauschen und dazu synchronisiert werden.
Computer, die für diese Art von Aufgabenstellung ausgelegt sind, können einige tausend Hauptprozessoren enthalten. Man verwendet dafür den Begriff Massiv-parallele Computer. Neben Wettervorhersagen finden sich Anwendungen für solche Architekturen z. B. in allen Bereichen von Simulationen (siehe z. B. Chemoinformatik, Computerphysik).

### Pipelining

Problemstellungen, bei denen größere Datenmengen in mehreren aufeinander folgenden Schritten verarbeitet werden, sogenanntes Pipelining. Z. B. lassen sich die Module eines Compilers (Präprozessor, lexikalische Analyse, semantische Analyse, Optimierung, Codeerzeugung), als parallel laufende Prozesse realisieren.
Jeder Prozess reicht seine Ausgabe dabei an den nachfolgenden Prozess weiter und ist damit frei um die nächsten Daten zu verarbeiten, während der nachfolgende Prozessschritt von einem anderen Prozess erledigt wird. Dabei kann jeder der Prozesse jeweils einem Prozessor zugewiesen werden, so dass eine weitgehende echte Parallelisierung der Verarbeitung erreicht wird.
Problemstellungen dieser Art sind in der Regel für Rechner geeignet, die über vergleichsweise wenige Prozessoren verfügen.
Man spricht in diesem Fall häufig von Multithreading oder Nebenläufigkeit. Allerdings ist für Multithreading (Thread = Faden) nicht zwingend erforderlich, dass die verschiedenen Prozesse (Threads) jeweils auf einem eigenen Prozessor laufen. Denkbar wäre ebenso, die verschiedenen Prozesse quasi parallel auf einem einzigen Prozessor laufen zu lassen. Allerdings können dann die Geschwindigkeitsvorteile nicht realisiert werden.

## Optimierung

Parallelcomputer erhöhen ihre Arbeitsgeschwindigkeit, indem sie den Rechenaufwand auf ihre Prozessoren verteilen. Um die volle Leistungsfähigkeit eines Parallelrechners ausnutzen zu können, muss die Programmierung entsprechend angepasst werden. Dafür stehen eine Reihe von Programmierschnittstellen zur Verfügung (siehe Abschnitt weiter unten).
Die Verteilung der Rechenlast auf mehrere Prozesse erfordert immer einen zusätzlichen Aufwand, um diese Verteilung zu organisieren und zu koordinieren. Dieser Aufwand steigt mit der Anzahl der Prozesse in der Regel überproportional an. Je nach bestehenden Abhängigkeiten ist es auch nicht immer möglich, Prozesse zu parallelisieren. Eine Aufgabenstellung so zu implementieren, dass sie einen Parallelrechner effizient nutzt, erfordert deshalb ein tiefes Verständnis der Problemstellung, und es muss immer eine Kosten-Nutzen-Abwägung getroffen werden, um für die Parallelisierung ein Optimum zu finden. Es gilt die knappen Ressourcen – Rechenzeit, Speicherzugriffe, Datenbusse – effizient zu nutzen. Stets sollte der sequentielle Programm-Overhead minimal sein (Amdahlsches Gesetz).
Auch die Art der Vernetzung der Hardwarekomponenten hat Einfluss auf die Effizienz. Für viele Problemstellungen lassen sich gute Ergebnisse mit folgenden Topologien erzielen:
* Cube (Konfiguration aus 8 Rechnern. Vernetzung entspricht einem Quader).
* Hyper-Cube (n-dimensionale Quader)

## GPU-Cluster

In den letzten Jahren sind Grafikkarten auf den Markt gekommen die teilweise mehr als 2000 Rechenkerne besitzen. Eigentlich für die Berechnung von Farbverläufen, Texturen usw. konzipiert, lassen sich diese Rechenkerne auch für die Parallelisierung anderer Berechnungen nutzen. Für massiv parallele Anwendungen wurden deshalb mittlerweile auch Rechner gebaut, die Cluster aus mehreren hundert Grafik-Prozessoren oder Grafikkarten enthalten. Damit lassen sich Rechnerarchitekturen erreichen, die statt einiger Tausend, einige Hunderttausend Prozessoren enthalten.

## Programmierschnittstellen

* OpenCL Open Computing Language (Schnittstelle für uneinheitliche Parallelrechner)
* CUDA Compute Unified Device Architecture (Schnittstelle um die Grafikkarte für parallele Berechnungen nutzen zu können)
* OpenHMPP Hybrid Multicore Parallel Programming
* OpenACC
* OpenMP Open Multi-Processing