- Werbung -


Hier könnte Ihre Werbung stehen. Interessiert? Sprechen Sie uns an.


Neueste Kommentare

Parallele und verteilte Berechnungen - Teil 2: OpenMP

Druckversion

Vor der Lektüre dieses Artikels sollte man den ersten Teil gelesen haben. Dieser erklärt die Problematik, die durch verteilte Berechnungen gelöst werden soll. Dazu werden die drei Standards OpenMP, MPI und CORBA kurz vorgestellt. Ersterer wird nun hier in der Praxis vorgestellt. Im demnächst folgenden dritten Teil des Artikels folgen schließlich die anderen beiden.

Details zu OpenMP

Zur Demonstration von openMP wollen wir die Zahl Pi berechnen. Für mathematisch Interessierte benutzen wir dazu dieses Integral:


Bild 1: Integral mit Maple berechnet

Leute, die den Namen Carl Friedrich Gauss noch nie gehört haben, erinnern sich vielleicht aus der Schulzeit, dass tan (45 Grad) = 1 ist. Dieses ist eine vereinfachte Zusammenfassung des obigen Sachverhalts.

Für die Berechnung von Pi verwenden wir also etwa folgendes Programm:


Bild 2: openMP-Demoprogramm

Für die Benutzung von openMP benötigen wir die Include-Datei omp.h. Falls der Compiler kein openMP beherrscht, fehlt diese natürlich und es würde mit Fehler abgebrochen. Wenn der Compiler openMP-fähig ist und mit der entsprechenden Option aufgerufen wurde, existiert die Preprozessor-Variable "_OPENMP". Damit klammern wir also die Include-Anweisung.

"#pragma ..." sind Direktiven an den Compiler. Falls irgendein Compiler eine spezielle Pragma-Direktive nicht kennt, muss er gemäß dem Standard diese ohne Fehlermeldung ignorieren. Wenn wir die "ifdef-else-endif" Konstruktion in den Zeilen 21, 31..33 entfernen und Zeilen 22..23 auskommentieren, würde ein nicht openMP-fähiger Compiler daraus ein lauffähiges sequentielles Programm erstellen. Das "#pragma omp parallel..." würde ein solcher Compiler gemäss dem C/C++-Standard ignorieren.

Dieses Programm wollen wir jetzt übersetzen mit dem Microsoft-Compiler "Visual Studio 2008 Express". Dazu müssen die entsprechenden Environment-Variablen und Pfade gesetzt werden. Mein Script "VisStd2008.bat var" ruft den entsprechenden MS-Batch auf. Mit dem in obiger Quelldatei angegebenen Kommando "CL ..." übersetzen wir diese Datei. Die Übersetzung kann auf einem Einzelkern-Prozessor erfolgen, z.B. AMD Athlon 4000+ auf Windows XP etc., wurde im folgenden Beispiel jedoch unter Windows 7 durchgeführt:


Bild 3: openMP-Programm übersetzen (durch Anklicken vergrößerbar)


Bild 4: Ausführung des soeben übersetzten openMP-Beispiels

Natürlich kann man openMP-Programme auch mit der IDE von Visual Studio übersetzen. Für diese einfachen Beispiele, von denen ich mehrere in "einem" Verzeichnis halte, wollte ich jedoch diesen Overkill nicht.

Wenn wir das resultierende EXE-file auf einem Einzelkern-Prozessor starten, läuft es selbstverständlich auch, aber eben als sequentielles Programm. Wir wollen die Berechnung jetzt laufen lassen auf einem Intel Core i5-520 (Bild 4). Diese CPU hat 2 Kerne und Hyper Threading (HT), d.h. jeder Kern besitzt 2 Registersätze, sodass man zwischen jeweils 2 Programmfäden (Threads) schnell umschalten kann ohne Register retten zu müssen. Windows und Ubuntu-Linux nehmen dieses als 4 logische Prozessoren mit gemeinsamen Speicher wahr.

Wir erkennen, dass dieses Programm mit 100 Millionen Iterationen eine Genauigkeit von etwa 10-13 erreicht. Natürlich ist dies nicht der "Non plus ultra Algorithmus", sondern er soll nur die Möglichkeiten von openMP demonstrieren. Mit dem angegebenen Pragma in Zeile 26 benötigt das Programm ca. 1..2 Sekunden, mit einer Anweisung "#pragma omp critical" und kleinen Programm-Änderungen beträgt die Laufzeit etwa 30..60 Sekunden.

Wer bessere Algorithmen sucht, um Pi z.B. auf 10.000 Stellen zu berechnen, möge sich das Buch [L1] zu Gemüte führen. Dort wird beispielsweise die "Schul-Multiplikation" durch eine Multiplikation auf Basis von "Fast Fourier Transformation (FFT)" ersetzt und Algorithmen von verschiedenen Mathematikern beschrieben.

Anmerkung: Auf einem IBM-Grossrechner 1960 in Paris hat die Berechnung von Pi mit 10.000 Stellen 8 Stunden gedauert, mit einem alternativen Verfahren von C.F. Gauss nur 2,5 Stunden. In der früheren Zeitschrift mc gab es ein C-Programm, welches auf meinem damaligen Rechner ca. 2..3 Stunden für 10.000 Stellen von Pi benötigte. Auf meinem jetzigen Tischrechner hat das Ganze nur noch 3 Sekunden bei Ausgabe in eine Datei gebraucht!

Wer jetzt auf den Geschmack gekommen ist, sich mit openMP zu beschäftigen, sollte sich das Büchlein [L2] ansehen, denn die Probleme bei konkurrierenden Zugriffen auf gemeinsame Variablen oder andere Ressourcen, sind genauso wie bei früheren Prozessrechnern. Basteln reicht nicht, sondern ein Verstehen ist dazu notwendig.

Jetzt kommt die spannende Frage: "Was brauchen wir für einen Compiler für openMP?"

Betriebssystem / C++-Compiler Version (yyyymm aus _OPENMP)
Windows + minGW GCC 4.1.2 kann noch kein openMP, erst ab GCC 4.2
Windows 2000 + Visual Studio 2005 vorhanden, aber ??
Windows XP ff + Visual Studio 2008 (2010?) 200203
Linux Suse 11 200505
Linux Debian 5 200505
Linux Ubuntu 2010.04 200805

Was nehmen wir unter Windows? Die Professional-Version von Visual Studio 2008 unterstützt openMP ohne Murren, deren "nackte" Express-Version zunächst einmal nicht. Da die Professional-Version ca. 1.000 € kostet, fragen sich Leute, die nicht Student sind oder über die Firma darauf Zugriff haben: "Was ist mit uns?"

Lösung: Wir besorgen uns bei Microsoft kostenlos die 90-Tage-Testversion von "Visual Studio 2008 Professional" und installieren diese in einer virtuellen Maschine (auf keinen Fall im Wirtssystem!). Dazu ist natürlich mindestens ein virtuelles Windows XP oder eine Testversion von Windows 7 nötig. Daraus extrahieren wir über "gemeinsame Verzeichnisse" (heisst bei VMware 'shared folders') oder USB-Stick die Dateien:

  • ...\vc\include\omp.h
  • ...\vc\include\ompassen.h
  • ...\vc\lib\vcomp.lib
  • ...\vc\lib\vcompd.lib

und kopieren diese in die gleichen Verzeichnisse der Express-Version auf dem Wirtsrechner, also dem eigentlichen Zielsystem. Dann kann man nach meinen bisherigen Erfahrungen mit openMP experimentieren.

Literatur

 
Referenz Thema Buch
L1 Mathematik Jörg Arndt / Christoph Haenel: "Pi Algorithmen, Computer, Arithmetik", Springer-Verlag Heidelberg
L2 OpenMP S. Hoffmann / R. Lienhart: "OpenMP", Springer-Verlag Heidelberg

 

Nachtrag zu openMP

Leider habe ich in dem Artikel noch etwas Wichtiges vergessen. ## Aus der 90-Tage-Testversion von Visual Studio 2008 Professional muss man noch die Datei VCOMP90.DLL kopieren und irgendwo in den Suchpfad aufnehmen, sonst läuft das Beispiel-Programm nicht. Die Library vcomp.lib ist unter C++ nur ein Verwaltungseinstieg für diese DLL, welche die eigentliche Arbeit macht. In C# gibt es diese Konstruktion nicht. ## Normalerweise befinden sich diese Dateien in einem Unterverzeichnis von C:\windows\WinSxS. Es reicht aber z.B. D:\user\reinhold> set path=D:\zusatzDLLs;%path%; ## Es kann nur das Release-Exefile mit dieser Technik unter "2008 Express" gestartet werden, für das Debug-Exefile ist immer die "Professional-Version" von Visual Studio 2008 nötig. ## Dieses ist mir erst nach umrüsten meines Rechners aufgefallen.

Reinhold, RG 600