www.wikidata.de-de.nina.az
OpenMP Open Multi Processing ist eine seit 1997 gemeinschaftlich von mehreren Hardware und Compilerherstellern entwickelte Programmierschnittstelle API fur die Shared Memory Programmierung in C C und Fortran auf Multiprozessor Computern OpenMPBasisdatenEntwickler Liste kompatibler CompilerAktuelle Version 5 2 November 2021 Aktuelle Vorabversion Betriebssystem Linux Unix Microsoft Windows NTProgrammiersprache C C FortranKategorie APILizenz unbekannt open deutschsprachig neinopenmp org OpenMP parallelisiert Programme auf der Ebene von Schleifen die in Threads ausgefuhrt werden und unterscheidet sich dadurch von anderen Ansatzen z B MPI bei denen ganze Prozesse parallel laufen und durch Nachrichtenaustausch zusammenwirken Der OpenMP Standard definiert dazu spezielle Compiler Direktiven die diesen dann anweisen z B die Abarbeitung einer for Schleife auf mehrere Threads oder Prozessoren zu verteilen Alternativ gibt es Bibliotheksfunktionen und Umgebungsvariablen fur die OpenMP Programmierung OpenMP ist zum Einsatz auf Systemen mit gemeinsamem Hauptspeicher Shared Memory Maschinen gedacht sogenannte UMA und NUMA Systeme wahrend andere Ansatze wie Message Passing Interface PVM eher auf Multicomputern Distributed Memory Maschinen aufsetzen Bei modernen Supercomputern werden OpenMP und MPI Message Passing Interface oftmals zusammen eingesetzt Dabei laufen auf einzelnen Shared Memory Clients OpenMP Prozesse die sich mittels MPI austauschen Eine Eigenschaft von OpenMP ist dass bis auf Ausnahmen die Programme auch korrekt laufen wenn der Compiler die OpenMP Anweisungen siehe unten im Beispiel nicht kennt und als Kommentar bewertet also ignoriert Der Grund dafur ist dass eine mit OpenMP fur mehrere Threads aufgeteilte for Schleife auch mit einem einzelnen Thread sequentiell abgearbeitet werden kann Inhaltsverzeichnis 1 Hauptbestandteile 2 Beispiel Code 3 Implementation 4 Weblinks 5 EinzelnachweiseHauptbestandteile BearbeitenDie Hauptbestandteile von OpenMP sind Konstrukte zur Thread Erzeugung Lastverteilung auf mehrere Threads Verwaltung des Gultigkeitsbereiches von Daten Synchronisation Laufzeitroutinen und Umgebungsvariablen Die Thread Erzeugung omp parallel teilt das Programm den Originalthread in mehrere Threads auf sodass der vom Konstrukt eingeschlossene Programmteil parallel abgearbeitet wird Der Original Thread wird als Master Thread bezeichnet und tragt die ID 0 Beispiel Gibt Hallo Welt mehrmals mittels mehrerer Threads aus jeder Thread erzeugt eine Ausgabe include lt stdio h gt int main pragma omp parallel puts Hallo Welt n return 0 Die Konstrukte zur Lastverteilung bestimmen wie nebenlaufige unabhangige Arbeitslast auf parallele Threads verteilt wird Omp for und omp do teilen hierbei Schleifendurchlaufe moglichst gleichmassig auf alle Threads auf Gebietsaufteilung data partitioning Sections verteilt aufeinander folgende aber unabhangige Programmteile auf mehrere Threads Funktionsaufteilung function partitioning auf Beispiel Initialisiert eine grosse Tabelle array parallel wobei jeder Thread einen Teil initialisiert Gebietsaufteilung define N 100000 int main int a N pragma omp parallel for for int i 0 i lt N i a i 2 i return 0 Die Verwaltung eines Gultigkeitsbereich bei Daten lasst sich mit unterschiedlichen Programmierungen beeinflussen Bei Shared Memory Programmierung sind zunachst die meisten Daten in allen Threads sichtbar Einige Programme benotigen private also nur fur einen Thread sichtbare Daten und den expliziten Austausch von Werten zwischen sequentiellen und parallelen Abschnitten Dafur dienen in OpenMP die sogenannten Data Clauses Der Typ shared beschreibt dass Daten fur alle Threads sichtbar und anderbar sind Sie liegen fur alle Threads an derselben Speicherstelle Ohne weitere Angaben sind Daten gemeinsame Daten Die einzige Ausnahme davon sind Schleifenvariablen Bei private verfugt jeder Thread uber eigene Kopien dieser Daten welche nicht initialisiert werden Die Werte werden nicht ausserhalb des parallelen Abschnitts bewahrt Der Typ private lasst sich nochmal in firstprivate und lastprivate unterteilen welche sich auch kombinieren lassen Bei ersterem sind die Daten private Daten mit dem Unterschied dass sie mit dem letzten Wert vor dem parallelen Abschnitt initialisiert werden Lastprivate unterscheidet sich darin dass der Thread welcher die letzte Iteration ausfuhrt anschliessend den Wert aus dem parallelen Abschnitt herauskopiert Ausserdem gibt es noch den Typ threadprivate fur globale Daten die im parallelen Programmabschnitt jedoch als privat behandelt werden Der globale Wert wird uber den parallelen Abschnitt hinweg bewahrt Copyin ist analog zu firstprivate fur private Daten allerdings fur threadprivate Daten welche nicht initialisiert werden Mit Copyin wird der globale Wert explizit an die privaten Daten ubertragen Ein Copyout ist nicht notwendig da der globale Wert bewahrt wird Bei dem Typ reduction sind die Daten privat werden jedoch am Ende auf einen globalen Wert zusammengefasst reduziert So lasst sich zum Beispiel die Summe aller Elemente eines Arrays parallel bestimmen Beispiel in Fortran OMP DO REDUCTION s do i 1 size a s s a i end do Es werden verschiedene Konstrukte zur Synchronisation der Threads verwendet wie z B Critical Section wobei der eingeschlossene Programmabschnitt von allen Threads ausgefuhrt wird allerdings niemals gleichzeitig oder Barrier welcher eine Barriere markiert wo jeder Thread wartet bis alle anderen Threads der Gruppe ebenfalls die Barriere erreicht haben Der Befehl atomic ist analog zu critical section jedoch mit dem Hinweis an den Compiler spezielle Hardwarefunktionen zu benutzen Der Compiler ist an diesen Hinweis nicht gebunden er kann ihn ignorieren Sinnvoll ist die Verwendung von atomic fur das exklusive Aktualisieren von Daten Flush markiert einen Synchronisationpunkt an dem ein konsistentes Speicherabbild hergestellt werden muss Private Daten werden in den Arbeitsspeicher zuruckgeschrieben Single bedeutet dass der umschlossene Programmteil nur von dem Thread ausgefuhrt wird welcher ihn zuerst erreicht dies impliziert eine Barriere am Ende des Blocks und ist somit aquivalent mit Barrier an einer bestimmten Stelle Master ist Analog zu single mit dem Unterschied dass der umschlossene Programmteil vom Master Thread ausgefuhrt wird und am Ende des Blocks keine Barriere impliziert ist Bei diesen Prozessen werden Laufzeitroutinen benutzt um zum Beispiel die Thread Anzahl wahrend der Laufzeit zu bestimmen und zu ermitteln ob sich das Programm gerade im parallelen oder sequentiellen Zustand befindet Umgebungsvariablen liefern in diesem Zusammenhang Informationen wie zum Beispiel die Thread ID Durch gezieltes Verandern bestimmter Umgebungsvariablen lasst sich die Ausfuhrung von OpenMP Programmen verandern So kann beispielsweise die Anzahl von Threads und die Schleifenparallelisierung zur Laufzeit beeinflusst werden Beispiel Code BearbeitenDer folgende Code veranschaulicht die parallele Ausfuhrung einer for Schleife mittels OpenMP Je nach Anzahl der beteiligten Threads wird die Schleife in kleine Abschnitte unterteilt die je einem Thread zugeordnet werden Damit wird erreicht dass alle Threads gleichzeitig rechnen include lt omp h gt include lt stdio h gt int main omp set num threads 4 pragma omp parallel for for int i 0 i lt 4 i const int id omp get thread num printf Hello World from thread d n id Nur im Master Thread ausfuhren if id 0 printf There are d threads n omp get num threads return 0 Beim Ubersetzen muss man dem Compiler sagen dass er die Pragma Anweisungen beachten und notwendige Bibliotheken fur die omp Funktionen einbinden soll Dies funktioniert bei gcc oder clang uber die Option fopenmp gcc fopenmp example c o example example Hello World from thread 3 Hello World from thread 0 Hello World from thread 1 Hello World from thread 2 There are 4 threads Statt die Anzahl der Threads im Programm festzulegen kann man dies auch zur Laufzeit bestimmen Dazu setzt man die Umgebungsvariable OMP NUM THREADS auf den gewunschten Wert OMP NUM THREADS 4 example Hello World from thread 3 Hello World from thread 0 Hello World from thread 1 Hello World from thread 2 There are 4 threadsImplementation BearbeitenOpenMP ist in den meisten Compilern integriert Microsoft Visual C 2005 2008 und 2010 Professional Team System Premium und Ultimate Edition Intel Parallel Studio fur verschiedene Prozessoren OpenMP 3 1 ab Version 13 GCC ab Version 4 2 OpenMP 4 0 ab Version 5 0 1 Clang LLVM OpenMP 3 1 ab Version 3 6 1 Oracle Solaris Studio Compiler und Tools fur Solaris OS UltraSPARC und x86 x64 und Linux Fortran C und C Compiler der Portland Group OpenMP 2 5 Gfortran IBM XL C C compiler Nanos Compiler Pelles C OpenMP 3 1 ab Version 8 Weblinks BearbeitenOffizielle Website Tutorial von OpenMP OpenMP Programmiergrundlagen Memento vom 11 November 2011 im Internet Archive PDF 80 kB C orientiert deutsch Einfuhrungsvideos von Intel OpenMP Parallelitat messen und visualisieren anhand eines C Routenplaners wird der Speedup Faktor ermittelt von MyARM Einzelnachweise Bearbeiten gcc gnu org Abgerufen von https de wikipedia org w index php title OpenMP amp oldid 237186989