Multicore-Anwendungen 8 Tipps zum Parallelisieren und Debuggen von Multicore-Applikationen

Um Multicore-Prozessoren sinnvoll zu nutzen, müssen Software-Entwickler von jahrelang gepflegten Gewohnheiten Abschied nehmen und sich mit neuen Werkzeugen und Methoden beschäftigen.

Das Entwerfen von parallelen Programmen birgt eine ganze Reihe neuartiger Probleme und bringt neue Bugs mit sich, mit denen sich ein Software-Entwickler auseinandersetzen muss. Auch die Vorgehensweise bei der Programmgestaltung hat sich im Gegensatz zu seriellen Programmentwicklungen drastisch verändert. Im Folgenden werden ausgewählte Tipps für das Entwickeln „ge-threadeter“ Applikationen aufgezeigt. Bei dieser Gelegenheit wird beschrieben wie Intel Parallel Studio, ein Plugin-Tool zu Visual Studio für native Windows-C++-Entwickler, bei der Lösung dieser Probleme helfen kann.

Tipp 1: Entwickle und denke in parallelen Strukturen

Erfolgreiches Programmieren erfordert einen parallelen Software-Entwicklungsansatz. Es ist essentiell für den Entwickler, sein Programm genau zu kennen, bevor er parallele Elemente in sein serielles Programm einbaut, um die Applikationsleistung zu verbessern. Wichtigster Ausgangspunkt ist, den besten bekannten Algorithmus auch für die Parallelisierung zu verwenden. Ein paralleles Programm mit einem nicht optimierten Algorithmus wird im Vergleich zu einem seriellen Programm (mit einem optimaleren Algorithmus) ab einer bestimmten Problemgröße im Nachteil sein und langsamer ablaufen.

Als Software-Entwickler ist es wichtig, Konzepte wie Daten-, Task-, und Pipline-Parallelismus zu kennen. Man sollte aber auch mit Kommunikations- und Synchronisierungs-Overhead umgehen können. Auf diese Themen wird hier aber nicht im Detail eingegangen. Zu diesem Themenkomplex, wie man parallele Programme systematisch und algorithmisch angeht, gibt es eigene Literatur [1].

Hilfreich in dieser Phase ist der Intel Parallel Advisor. Dieses Werkzeug gibt dem Entwickler Verbesserungsvorschläge für ein serielles, zu parallelisierendes Programm an die Hand. Das Tool offeriert eine Methodik und eine Sammlung von Hilfs- Tools, die den Entwickler unterstützen, Nebenläufigkeit erfolgreich in sein Programm einzubauen. Ziel ist es vor allem, die Programmskalierbarkeit (bei steigender Kernprozessorzahl) zu gewährleisten. Der Parallel Advisor wird ab September Mitbestandteil der Intel Parallel Studio Suite.

Tipp 2: Schreibe Programme mit höherem parallelem Abstraktionsgrad

Paralleles Programmieren sollte mit Konstrukten bewerkstelligt werden, die einen höheren Abstraktionsgrad aufweisen. Es ist von Nachteil, mit Low-Level-Methoden wie etwa Winthreads oder Pthreads zu arbeiten. Diese sind extrem fehleranfällig, zeitaufwendig und für Außenstehende, die den Code verstehen wollen oder müssen, extrem schwer nachzuvollziehen. Statt das Threadmanagment selbst zu codieren, sollten C- und C++-Entwickler sich darauf konzentrieren, die Entwicklungsaufgabe auf einer höheren Ebene zu implementieren. Dies können sie besser mit domainspezifischen „Thread safe“-Bibliotheken bewerkstelligen, wie z.B. der Intel Performance Primitives (IPP) für Multimedia- Anwendungen, dem OpenMP Application Program Interface (API) und/oder den Intel Threading Building Blocks (TBB).

OpenMP ist ein standardisiertes skalierbares Modell, das ein einfaches und schrittweises Erweitern des seriellen Codes um parallele Programmsegmente bei symmetrischen Multiprocessing- Systemen (SMP) erlaubt. Es werden dazu so genannte Pragma-Anweisungen in die Programmsequenzen eines seriellen Quellcodes eingestreut, die besonders zeitintensiv sind (z.B. Schleifen). Die Lesbarkeit des ursprünglichen Programms wird nur unwesentlich verändert.

TBB erweitert C++ in einer von STL (Standard Template Library) bekannten Art und Weise um „thread-sichere“ Funktions-Templates und Container. Es bietet sich vor allem für objektorientiertes paralleles Programmieren an. Das Besondere an TBB sind der in Tipp 3 erwähnte Task-Scheduler und der auf paralleles Programmieren angelegte dynamische Memory-Allokator (siehe auch Tipp 5). Alle diese Werkzeuge sind übrigens Bestandteil des Intel Parallel Composer und des Intel C++-Compilers.