Suchen

Nutzung von Parallelrechnern stellt hohe Anforderung an Softwareentwicklung

Autor / Redakteur: Sebastian Bindick / Reinhold Schäfer

Die Nutzung von Parallelrechnern stellt große Anforderungen an die Softwareentwicklung, zudem sind, wie dieser Beitrag zeigt, parallele Programmierparadigmen zu berücksichtigen.

Firmen zum Thema

Bild 1: Aufgabenparallelität versus Datenparallelität am Beispiel mehrerer Köche.
Bild 1: Aufgabenparallelität versus Datenparallelität am Beispiel mehrerer Köche.
(Bild: Volkswagen)

Auf einen Blick

  • Bei der Parallelverarbeitung unterscheiden Entwickler häufig zwischen Aufgabenparallelität und Datenparallelität.
  • Bei der Aufgabenparallelität wird eine Reihe unterschiedlicher Aufgaben parallel und unabhängig voneinander auf den gleichen oder unterschiedlichen Daten bearbeitet.
  • Bei der Datenparallelität wird dieselbe Aufgabe auf unterschiedlichen Bereichen eines Datensatzes parallel ausgeführt.

Anders als bei klassischen Anwendungen mit sequenziellem Programmfluss werden beim Parallel Computing mehrere Teilaufgaben gleichzeitig ausgeführt. Dies wird auch als Nebenläufigkeit (concurrency) oder Parallelität (parallelism) bezeichnet. Die Vorteile liegen auf der Hand: Durch eine parallele Bearbeitung lassen sich Mehrkernsysteme effizient auslasten und komplexe Problemstellungen in angemessener Zeit lösen. Allerdings gehen damit auch eine deutlich höhere Komplexität und eine schlechtere Nachvollziehbarkeit des Programmcodes sowie eine höhere Fehleranfälligkeit einher.

Der zweite Teil des Artikels geht auf Konzepte, Techniken und Herausforderungen paralleler Programmierung mit Java-Threads ein. Zum Beispiel: Wie lässt sich eine hohe Auslastung über viele CPU-Kerne erreichen? Wie ist mit Race Conditions und Data Races umzugehen? Oder welche Fallstricke lauern beim Einsatz von Synchronisationstechniken?

Bei der Parallelverarbeitung unterscheiden Entwickler häufig zwischen Aufgabenparallelität (task parallelism) und Datenparallelität (data parallelism) [1]. Bei der Aufgabenparallelität wird eine Reihe unterschiedlicher Aufgaben parallel und unabhängig voneinander auf den gleichen oder unterschiedlichen Daten bearbeitet. Im Prinzip ein ähnlicher Vorgang, wie wenn mehrere Köche einen Burger zubereiten und dabei die einzelnen Arbeitsschritte wie die Zubereitung von Salat, Tomaten, Brötchen und Bulette (Bild 1, links) parallel ausführen.

Bei der Datenparallelität wird derselbe Algorithmus auf unterschiedliche Bereiche eines Datensatzes parallel ausgeführt. So, als würden mehrere Köche eine Burger-Bestellung (einen Datensatz) gleichzeitig bearbeiten und die Burger zubereiten (Bild 1, rechts).

Parallele Ausführung beschleunigt Anwendungen

Wie sehr sich eine Anwendung durch eine parallele Ausführung beschleunigen lässt, ist nach dem amdahlschen Gesetz abhängig von dem sequenziellen (also dem nicht parallelisierbaren) Anteil einer Applikation [2]. So bereiten mehrere Köche die einzelnen Zutaten des Burgers vor, aber nur ein Koch fügt sie sequenziell zusammen (Bild 2).

Die gesamte Zubereitungszeit hängt also von den fünf Minuten ab, die der einzelne Koch benötigt, um die Zutaten zusammenzufügen. Auch wenn sehr viele Köche mitkochen und die Zubereitung der Zutaten (paralleler Anteil) beschleunigen, fällt die Gesamtzeit niemals unter fünf Minuten.

Bild 2: Die Grenzen der Parallelverarbeitung.
Bild 2: Die Grenzen der Parallelverarbeitung.
(Bild: Volkswagen)

Eine hohe parallele Effizienz lässt sich erzielen, wenn die Problemstellung gut parallelisierbar ist und einen möglichst geringen sequenziellen Anteil besitzt. Gute Parallelisierbarkeit heißt auch, dass sich die einzelnen Teilaufgaben in der gleichen Ausführungszeit erledigen lassen. Andernfalls kommt es zu dem in Bild 3 dargestellten Problem. Der Koch, der die Bulette zubereitet, benötigt deutlich mehr Zeit als die anderen drei Köche. Dies erhöht nicht nur die Bearbeitungszeit des parallelen Anteils, sondern führt auch dazu, dass die anderen drei Köche fünf Minuten warten und nichts zu tun haben, bis der letzte Koch fertig ist.

Bild 3: Die Aufgabe muss gut parallelisierbar sein.
Bild 3: Die Aufgabe muss gut parallelisierbar sein.
(Bild: Volkswagen)

Um ein Multicore-System effizient auszulasten, ist somit eine Aufgabenstellung mit einer hohen Parallelisierung notwendig. Insbesondere Aufgaben, die denselben Algorithmus auf unterschiedliche Bereiche eines Datensatzes anwenden (Datenparallelität), eignen sich hierfür gut. Anwendungsgebiete wie die Simulation physischer Prozesse oder das Training neuronaler Netze sind besonders prädestiniert. Hingegen lassen sich Anwendungen wie Office-Applikationen oder Webserver oftmals kaum parallelisieren.

Wie die Parallelverabeitung genau erfolgen kann wird im zweiten Teil dieses Beitrags demonstriert.

Dieser Beitrag stammt von unserem Partnerportal Maschinenmarkt.de.

Literatur

[1] Wikipedia, Data parallelism versus task parallelism, https://en.wikipedia.org/wiki/Data_parallelism#Data_parallelism_vs._task_parallelism, am 19. 2. 2020

[2] Wikipedia, Amdahlsches Gesetz, https://de.wikipedia.org/wiki/Amdahlsches_Gesetz, am 19. 2. 2020

* Dr. Sebastian Bindick ist IT-Architekt bei der Volkswagen Group IT in 38440 Wolfsburg

(ID:46604970)