26.2 Programmiertechniken der Parallelisierung
Als Programmierer können Sie im Grunde mehrere Wege gehen, um Ihre Anwendung zu parallelisieren.
26.2.1 Automatische Parallelisierung
Zunächst gäbe es die Möglichkeit, das Parallelisieren dem Compiler zu überlassen. Eine solche automatische Parallelisierung wird derzeit nur vom Intel-Compiler angeboten. Hierzu setzt man bei der Kompilierung die Option /Qparallel für Windows und /parallel für Linux. Bei der Übersetzung sucht der Compiler jetzt nach einfachen Schleifen (beispielsweise Grafikroutinen), die er in mehreren Threads parallel ausführen kann. Wer hier jetzt eine Compiler-Optimierung wie mit den Optionen -O1 etc. sieht, hat recht. Im Grunde ist diese Option des Compilers nichts anderes als das. Bei Tests ist es mir außerdem nicht gelungen, mehr als zwei parallele Threads zu erzeugen.
26.2.2 Halbautomatische Parallelisierung
Neben der Möglichkeit, parallele Anwendungen mithilfe des Intel-Compilers automatisch zu erstellen, gibt es noch eine halbautomatische Möglichkeit (wenn man das so sagen darf). »Halbautomatisch« deswegen, weil hierbei der Code nicht verändert, sondern nur ergänzt werden muss. Hierzu verwendet man OpenMP, eine Programmierschnittstelle, die seit 1997 von verschiedenen Hardware- und Compiler-Herstellern zur Shared-Memory-Programmierung auf Multiprozessor-Rechnern verwendet wird. Ein Vorteil von OpenMP ist es, dass die Synchronisation der Threads implizit erfolgt. Allerdings schränkt dieser Vorteil den Grad der Parallelisierung erheblich ein. Des Weiteren lässt sich OpenMP nur für Shared-Memory-Systeme verwenden (wie dies beispielsweise bei den Dual-Core-CPUs der Fall ist).
Für die Parallelisierung werden pragma-Direktiven verwendet, weshalb in dem Fall, dass ein Compiler OpenMP nicht unterstützt, keine Fehlermeldungen ausgegeben werden. OpenMP ist auf vielen gängigen Compilern vorhanden (MS Visual Studio etc.). Auch unter Linux wird der GCC unterstützt – dies allerdings erst ab der Version 4.2, was bedeutet, dass Sie den entsprechenden Snapshot (nach-)installieren müssen. Auch der Intel-Compiler (erhältlich für Linux und Windows) unterstützt OpenMP. OpenMP ist somit auch eine interessante und einfache Möglichkeit der (halbautomatischen) Parallelisierung, die sich allerdings wegen der Vereinfachungen recht schlecht skalieren lässt. Mehr Informationen dazu finden Sie auf der Webseite von OpenMP unter http://www.openmp.org/.
26.2.3 Echte Parallelisierung
Dann gibt es noch den Weg der echten Thread-Programmierung. Allerdings ist die Multithread-Programmierung nicht unbedingt eine einfache Sache. Mehrere Threads bedeuten häufig auch mehr Aufwand bei der Programmerstellung. Gewöhnlich müssen Threads auch synchronisiert werden. Schließlich stellt jeder Thread so etwas wie eine eigene Anwendung dar. Trotzdem reißt, wenn ein Thread beispielsweise abstürzt, dieser alle anderen Threads mit ins Verderben.
Thread-Bibliotheken gibt es viele. Den Windows-Entwicklern werden da einige hausgemachte Lösungen für Win32, MFC oder das .NET-Framework mitgeliefert. Wer reine Windows-Anwendungen schreibt, der dürfte damit sehr zufrieden sein. Soll es aber plattformübergreifend sein, greift man gewöhnlich zur POSIX-Thread-Bibliothek. Diese Spezifikation beschreibt den POSIX-Standard 1003.1c oder kurz und einfach Pthreads. Auch in diesem Buch greifen wir auf die POSIX-Threads zurück, um hier die Erwartungen eines jeden Lesers unabhängig von der Systemangehörigkeit zu erfüllen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.