OpenMP

OpenMP
OpenMP logo
Originalautor (en) OpenMP Architecture Review Board[1]
Entwickler (en) OpenMP Architecture Review Board[1]
Stabile Version
5.1 / 13. November 2020; Vor 20 Monaten
Betriebssystem Plattformübergreifend
Plattform Plattformübergreifend
Typ Erweiterung an C, C ++, und Forran; API
Lizenz Verschiedene[2]
Webseite OpenMP.org

OpenMP (Open Multi-Processing) ist ein Programmierschnittstelle (API), die Multi-Plattform unterstützt geteilte Erinnerung Multiprozessierung Programmierung in C, C ++, und Forran,[3] auf vielen Plattformen, Anweisungsarchitekturen und Betriebssysteme, einschließlich Solaris, AIX, Freebsd, HP-UX, Linux, Mac OS, und Fenster. Es besteht aus einer Reihe von Compiler -Richtlinien, Bibliotheksroutinen, und Umgebungsvariablen Das beeinflusst das Laufzeitverhalten.[2][4][5]

OpenMP wird von der verwaltet gemeinnützige Organisation Technologie Konsortium OpenMP Architecture Review Board (oder OpenMP Arb), gemeinsam durch einen breiten Teil der führenden Computerhardware- und Softwareanbieter definiert, einschließlich Arm, AMD, IBM, Intel, Cray, HP, Fujitsu, Nvidia, NEC, roter Hut, Texas Instrumente, und Oracle Corporation.[1]

OpenMP verwendet a tragbar, skalierbares Modell, das gibt Programmierer Eine einfache und flexible Schnittstelle zur Entwicklung paralleler Anwendungen für Plattformen, die vom Standard reichen Desktop-Computer zum Supercomputer.

Eine Anwendung mit dem Hybridmodell von Parallele Programmierung kann auf einem laufen Computercluster Verwenden Sie sowohl OpenMP als auch Schnittstelle zur Nachrichtenübergabe (MPI), so dass OpenMP für die Parallelität verwendet wird innerhalb Ein (Multi-Core)-Knoten, während MPI für die Parallelität verwendet wird zwischen Knoten. Es gab auch Bemühungen, OpenMP zu betreiben Software verteilte freigegebene Speicher Systeme,[6] OpenMP in MPI übersetzen[7][8] und OpenMP für nicht-stammende Speichersysteme zu erweitern.[9]

Entwurf

Eine Illustration von Multithreading wo der primäre Thread eine Reihe von Threads ausgab, die parallel Codeblöcke ausführen

OpenMP ist eine Implementierung von Multithreading, eine Methode zur Parallelisierung, wobei a primär Thread (eine Reihe von Anweisungen, die nacheinander ausgeführt wurden) Gabeln eine bestimmte Anzahl von Sub-Threads und das System teilen eine Aufgabe unter ihnen. Die Themen laufen dann aus gleichzeitig, mit dem Laufzeitumgebung Threads für verschiedene Prozessoren zuweisen.

Der parallel ausgeführte Codeabschnitt wird entsprechend mit einer Compiler -Anweisung gekennzeichnet, die dazu führt, dass die Threads vor der Ausführung des Abschnitts bilden.[3] Jeder Thread hat eine ICH WÜRDE daran gebunden, was mit a erhalten werden kann Funktion (genannt omp_get_thread_num ()). Die Thread -ID ist eine Ganzzahl, und der primäre Thread hat eine ID von 0. Nach der Ausführung des parallelisierten Codes die Threads beitreten Zurück in den primären Faden, der bis zum Ende des Programms weitergeht.

Standardmäßig führt jeder Thread den parallelisierten Codeabschnitt unabhängig aus. Arbeitsteilung Konstrukte Kann verwendet werden, um eine Aufgabe unter den Threads zu teilen, so dass jeder Thread seinen zugewiesenen Teil des Codes ausführt. Beide Aufgabe Parallelität und Datenparallelität kann auf diese Weise mit OpenMP erreicht werden.

In der Laufzeitumgebung sind Prozessoren je nach Nutzung, Maschinenbelastung und anderen Faktoren Threads zugewiesen. Die Laufzeitumgebung kann die Anzahl der Threads basierend darauf zuweisen Umgebungsvariablenoder der Code kann dies mit Funktionen tun. Die OpenMP -Funktionen sind in a enthalten Header-Datei beschriftet omp.h in C/C ++.

Geschichte

Das OpenMP Architecture Review Board (ARB) veröffentlichte im Oktober 1997 seine ersten API -Spezifikationen OpenMP für FORTRAN 1.0. Im Oktober des folgenden Jahres veröffentlichten sie den C/C ++ - Standard. 2000 SAW Version 2.0 der FORTRAN -Spezifikationen mit Version 2.0 der C/C ++ - Spezifikationen 2002. Version 2.5 ist eine kombinierte C/C ++/FORTRAN -Spezifikation, die 2005 veröffentlicht wurde.

Bis zu Version 2.0 hat OpenMP hauptsächlich Möglichkeiten zur Parallele zur Parallelung hocher regelmäßiger Schleifen angegeben, wie sie in matrixorientiertem auftreten Numerische Programmierung, wo die Anzahl der Iterationen der Schleife zum Eingangszeit bekannt ist. Dies wurde als Einschränkung anerkannt, und es wurden verschiedene Aufgaben paralleler Erweiterungen zu Implementierungen hinzugefügt. Im Jahr 2005 wurde ein Versuch, die Parallelität der Aufgaben zu standardisieren Cilk, X10 und Kapelle.[10]

Version 3.0 wurde im Mai 2008 veröffentlicht. In den neuen Funktionen in 3.0 ist das Konzept von enthalten Aufgaben und die Aufgabe konstruieren,[11] Wesentlich erweitern Sie den Umfang von OpenMP über die parallelen Schleifenkonstrukte hinaus, die den größten Teil von OpenMP 2.0 ausmachten.[12]

Version 4.0 der Spezifikation wurde im Juli 2013 veröffentlicht.[13] Es fügt die folgenden Funktionen hinzu oder verbessert es: Unterstützung für Beschleuniger; Atomik; Fehlerbehandlung; Fadenaffinität; Aufgabeerweiterungen; benutzerdefinierten die Ermäßigung; Simd Unterstützung; Forran 2003 Unterstützung.[14][Vollständiges Zitat benötigt]

Die aktuelle Version ist 5.1, veröffentlicht im November 2020.

Beachten Sie, dass nicht alle Compiler (und OSS) die vollständigen Funktionen für die neueste Version/s unterstützen.

Kernelemente

Diagramm von OpenMP -Konstrukten

Die Kernelemente von OpenMP sind die Konstrukte für die Erstellung von Threads, Workload Distribution (Work Sharing), Daten-Umweltverwaltung, Thread-Synchronisation, Laufzeitroutinen auf Benutzerebene und Umgebungsvariablen.

In C/C ++ verwendet OpenMP #pragmas. Die openMP -spezifischen Pragmas sind unten aufgeführt.

Fadenerstellung

Die Pragma omp parallel wird verwendet, um zusätzliche Fäden zu forkieren, um die im Konstrukt zusammengefügten Arbeiten parallel auszuführen. Der ursprüngliche Thread wird als bezeichnet als Master -Thread mit Thread ID 0.

Beispiel (C -Programm): Anzeige "Hallo, Welt". Verwenden mehrerer Threads.

#enthalten  #enthalten  int hauptsächlich(Leere) {   #pragma omp parallel   printf("Hallo Welt.\n");   Rückkehr 0; } 

Verwenden Sie Flag -fopenmp, um mit GCC zu kompilieren:

$ gcc -fopenmp hello.c -o Hallo

Ausgabe auf einem Computer mit zwei Kernen und damit zwei Threads:

Hallo Welt. Hallo Welt.

Die Ausgabe kann jedoch auch wegen der verstümmelt werden Rassenbedingung verursacht von den beiden Fäden, die die teilen Standardausgabe.

Hallo, Whello, Woorld. RLD.

Ob printf ist Atomic auf die zugrunde liegende Umsetzung ab[15] Im Gegensatz zu C ++ 's std :: Cout.

Arbeitsteilung Konstrukte

Wird verwendet, um festzustellen, wie unabhängige Arbeiten einem oder allen Threads zugewiesen werden.

  • omp für oder omp tun: gewöhnt an Schleifen -Iterationen teilen Unter den Fäden, auch Schleifenkonstrukte genannt.
  • Abschnitte: Zuweisen aufeinanderfolgende, aber unabhängige Codeblöcke mit verschiedenen Threads
  • Single: Angeben eines Codeblocks, der nur von einem Thread ausgeführt wird, wird am Ende eine Barriere impliziert
  • Meister: Ähnlich wie Single, aber der Codeblock wird nur vom Master -Thread ausgeführt und am Ende keine Barriere impliziert.

Beispiel: Initialisieren Sie den Wert eines großen Arrays parallel und verwenden Sie jeden Thread, um einen Teil der Arbeit zu erledigen

int hauptsächlich(int argc, verkohlen **argv) {   int a[100000];   #pragma omp parallel für   zum (int i = 0; i < 100000; i++) {   a[i] = 2 * i;   }   Rückkehr 0; } 

Dieses Beispiel ist peinlich parallel, und hängt nur vom Wert von ab i. Der OpenMP parallel für Flag teilt das OpenMP -System mit, dass er diese Aufgabe in seine funktionierenden Threads aufteilt. Die Themen erhalten jeweils eine eindeutige und private Version der Variablen.[16] Zum Beispiel kann mit zwei Arbeiter -Threads ein Thread eine Version von übergeben werden i Das läuft von 0 bis 49999, während die zweite eine Version von 50000 bis 99999 erhält.

Variante Richtlinien

Variante Richtlinien sind eines der Hauptmerkmale, die in der OpenMP 5.0 -Spezifikation eingeführt wurden, um die Programmierer zur Verbesserung der Leistungsträglichkeit zu erleichtern. Sie ermöglichen die Anpassung von OpenMP Pragmas und Benutzercode zur Kompilierung. Die Spezifikation definiert Merkmale zur Beschreibung von aktiven OpenMP-Konstrukten, Ausführungsgeräten und Funktionen, die durch eine Implementierung bereitgestellt werden, Kontextauswahlern basierend auf den Merkmalen und benutzerdefinierten Bedingungen, und metadirektiv und Richtlinie deklarieren Anweisungen für Benutzer, um dieselbe Coderegion mit Variantenanweisungen zu programmieren.

  • Das metadirektiv ist eine ausführbare Richtlinie, die sich bedingt in eine andere Richtlinie zur Kompilierung des Zeitpunkts auflöst, indem sie aus mehreren Richtlinienvarianten basierend auf Merkmalen ausgewählt werden, die eine OpenMP -Bedingung oder -kontext definieren.
  • Das Variante deklarieren Richtlinie hat ähnliche Funktionen wie metadirektiv Wählt jedoch eine Funktionsvariante an der Call-Site basierend auf Kontext oder benutzerdefinierten Bedingungen aus.

Der Mechanismus, der von den beiden Variantenanweisungen zur Auswahl von Varianten bereitgestellt wird, ist bequemer zu verwenden als die C/C ++ - Vorverarbeitung, da er die Variantenauswahl in OpenMP direkt unterstützt und einen OpenMP -Compiler ermöglicht, die endgültige Richtlinie aus Varianten und Kontext zu analysieren und zu bestimmen.

// Codeanpassung mit Vorverarbeitungsrichtlinien int v1[N], v2[N], v3[N]; #if definiert (NVPTX)   #PRAGMA OMP -Zielteams verteilen parallel für MAP (an: v1, v2) Karte (von: v3)   zum (int i= 0; i< N; i++)    v3[i] = v1[i] * v2[i];   #anders   #PRAGMA OMP -Zielparallel für MAP (bis: v1, v2) Karte (von: v3)   zum (int i= 0; i< N; i++)    v3[i] = v1[i] * v2[i];   #endif // Codeanpassung mit metadirektiven in OpenMP 5.0 int v1[N], v2[N], v3[N]; #PRAGMA omp Zielkarte (bis: v1, v2) Karte (von: v3)   #PRAGMA OMM Metadirective \      Wenn (Device = {arch (nvptX)}: Zielteams verteilt parallel für) \      Standard (Ziel parallel für)   zum (int i= 0; i< N; i++)    v3[i] = v1[i] * v2[i]; 

Klauseln

Da OpenMP ein gemeinsam genutztes Speicherprogrammiermodell ist, sind die meisten Variablen im OpenMP -Code standardmäßig für alle Threads sichtbar. Aber manchmal sind private Variablen erforderlich, um zu vermeiden Rennbedingungen und es besteht die Notwendigkeit, Werte zwischen dem sequentiellen Teil und dem parallelen Bereich zu übergeben (der parallel ausgeführte Codeblock) Datenfreigabe -Attributklauseln Indem Sie sie an die OpenMP -Richtlinie anhängen. Die verschiedenen Arten von Klauseln sind:

Datenfreigabe -Attributklauseln
  • geteilt: Die außerhalb einer parallelen Region deklarierten Daten sind gemeinsam genutzt, was bedeutet, dass alle Threads gleichzeitig sichtbar und zugänglich sind. Standardmäßig werden alle Variablen in der Arbeitsfreigaberegion mit Ausnahme des Schleifen -Iteration -Zählers geteilt.
  • Privatgelände: Die in einem parallelen Bereich deklarierten Daten sind für jeden Thread privat, was bedeutet, dass jeder Thread eine lokale Kopie hat und sie als temporäre Variable verwendet. Eine private Variable wird nicht initialisiert und der Wert wird für die Verwendung außerhalb des parallelen Bereichs nicht aufrechterhalten. Standardmäßig sind die Schleifen -Iteration -Zähler in den OpenMP -Schleifenkonstrukten privat.
  • Ursprünglich: Ermöglicht dem Programmierer, dass der Standarddatenscoping in einem parallelen Bereich entweder sein wird geteilt, oder keiner für c/c ++ oder geteilt, FirstPrivate, Privatgelände, oder keiner Für Forran. Das keiner Die Option zwingt den Programmierer, jede Variable im parallelen Bereich mithilfe der Datenfreigabe -Attributklauseln zu deklarieren.
  • FirstPrivate: wie Privatgelände Außer auf den ursprünglichen Wert initialisiert.
  • lastPivate: wie Privatgelände außer dem ursprünglichen Wert wird nach dem Konstrukt aktualisiert.
  • die Ermäßigung: Eine sichere Art, Arbeiten aus allen Threads nach dem Konstrukt zu verbinden.
Synchronisationsklauseln
  • kritisch: Der beigefügte Codeblock wird jeweils nur von einem Thread ausgeführt und nicht gleichzeitig von mehreren Threads ausgeführt. Es wird oft verwendet, um gemeinsam genutzte Daten vor Rennbedingungen.
  • Atomic: Das Speicheraktualisierung (schreiben oder read-modify-write) in der nächsten Anweisung wird atomisch durchgeführt. Es macht nicht die gesamte Aussage Atomic; Nur das Speicher Update ist atomic. Ein Compiler verwendet möglicherweise spezielle Hardware -Anweisungen für eine bessere Leistung als bei der Verwendung kritisch.
  • bestellt: Der strukturierte Block wird in der Reihenfolge ausgeführt, in der Iterationen in einer sequentiellen Schleife ausgeführt würden
  • Barriere: Jeder Thread wartet, bis alle anderen Fäden eines Teams diesen Punkt erreicht haben. Ein Arbeitsteilungskonstrukt hat am Ende eine implizite Barrieresynchronisation.
  • jetzt: Gibt an, dass Threads, die zugewiesene Arbeiten abgeschlossen werden, fortgesetzt werden können, ohne auf alle Threads im Team zu warten. In Abwesenheit dieser Klausel begegnen Threads eine Barrieresynchronisation am Ende des Arbeitsplatzkonstrukts.
Planungsklauseln
  • Zeitplan (Typ, Chunk): Dies ist nützlich, wenn das Konstrukt des Arbeitsplatzes eine Do-Schleife oder eine Fürschleife ist. Die Iterationen im Arbeitsplatzkonstrukt werden den Threads gemäß der Planungsmethode zugewiesen, die durch diese Klausel definiert ist. Die drei Arten der Planung sind:
  1. statisch: Hier werden alle Threads Iterationen zugewiesen, bevor sie die Schleifen -Iterationen ausführen. Die Iterationen sind standardmäßig gleich auf Threads aufgeteilt. Angabe einer Ganzzahl für den Parameter jedoch Chunk Verteilt die Anzahl der zusammenhängenden Iterationen einem bestimmten Thread.
  2. dynamisch: Hier werden einige Iterationen einer kleineren Anzahl von Threads zugeordnet. Sobald ein bestimmter Thread seine zugewiesene Iteration beendet hat, kehrt er zurück, um einen anderen aus den Iterationen zu erhalten, die übrig bleiben. Der Parameter Chunk Definiert die Anzahl der zusammenhängenden Iterationen, die jeweils einem Thread zugewiesen werden.
  3. geführt: Ein großer Teil von zusammenhängenden Iterationen wird jedem Thread dynamisch (wie oben) zugeordnet. Die Stückegröße nimmt exponentiell mit jeder aufeinanderfolgenden Zuordnung auf eine im Parameter angegebene Mindestgröße ab Chunk
Wenn Kontrolle
  • wenn: Dies führt dazu, dass die Themen die Aufgabe nur dann parallelisieren, wenn eine Bedingung erfüllt ist. Andernfalls wird der Codeblock seriell ausgeführt.
Initialisierung
  • FirstPrivate: Die Daten sind für jeden Thread privat, aber mit dem Wert der Variablen mit demselben Namen aus dem Master -Thread initialisiert.
  • lastPivate: Die Daten sind für jeden Thread privat. Der Wert dieser privaten Daten wird unter Verwendung desselben Namens außerhalb der parallelen Region in eine globale Variable kopiert, wenn die aktuelle Iteration die letzte Iteration in der parallelisierten Schleife ist. Eine Variable kann beides sein FirstPrivate und lastPivate.
  • Threadprivate: Die Daten sind globale Daten, aber in jeder parallele Region während der Laufzeit privat. Der Unterschied zwischen Threadprivate und Privatgelände ist der globale Bereich, der mit Threadprivate und dem erhaltenen Wert in parallelen Regionen verbunden ist.
Datenkopieren
  • Kopieren: ähnlich zu FirstPrivate zum Privatgelände Variablen, Threadprivate Variablen werden nicht initialisiert, es sei denn Kopieren Um den Wert aus den entsprechenden globalen Variablen zu übergeben. Nein Kopieren wird benötigt, da der Wert einer Thread -Variablen während der gesamten Ausführung des gesamten Programms aufrechterhalten wird.
  • Exemplar: benutzt mit Single Unterstützung des Kopierens von Datenwerten aus privaten Objekten in einem Thread (die Single Thread) zu den entsprechenden Objekten auf anderen Threads im Team.
Die Ermäßigung
  • Reduktion (Operator | Intrinsische: Liste): Die Variable hat in jedem Thread eine lokale Kopie, aber die Werte der lokalen Kopien werden in eine globale gemeinsame Variable zusammengefasst (reduziert). Dies ist sehr nützlich, wenn eine bestimmte Operation (angegeben in Operator für diese bestimmte Klausel) in einer Variablen läuft iterativ, so dass sein Wert in einer bestimmten Iteration von ihrem Wert bei einer vorherigen Iteration abhängt. Die Schritte, die zum operativen Inkrement führen, sind parallelisiert, aber die Threads aktualisieren die globale Variable auf sichere Weise. Dies wäre parallelisierend erforderlich Numerische Integration von Funktionen und Differentialgleichungals häufiges Beispiel.
Andere
  • spülen: Der Wert dieser Variablen wird vom Register zum Speicher wiederhergestellt, um diesen Wert außerhalb eines parallelen Teils zu verwenden
  • Meister: Nur durch den Master -Thread ausgeführt (dem Thread, der alle anderen während der Ausführung der OpenMP -Direktive abgab). Keine implizite Barriere; Andere Teammitglieder (Threads) müssen nicht erreichen.

Laufzeit auf Benutzerebene

Wird verwendet, um die Anzahl der Threads zu ändern/zu überprüfen, feststellen, ob sich der Ausführungskontext in einem parallelen Bereich befindet, wie viele Prozessoren im aktuellen System, Set/Unegeting -Sperren, Zeitfunktionen usw.

Umgebungsvariablen

Eine Methode zur Änderung der Ausführungsfunktionen von OpenMP -Anwendungen. Wird zur Steuerung der Schleifen -Iterationen -Planung, der Standardzahl der Threads usw. Omp_num_threads wird verwendet, um die Anzahl der Threads für eine Anwendung anzugeben.

Implementierungen

OpenMP wurde in vielen kommerziellen Compilern implementiert. Zum Beispiel unterstützen Visual C ++ 2005, 2008, 2010, 2012 und 2013 die Unterstützung (OpenMP 2.0, in Professional, Teamsystem, Premium und Ultimate Editions[17][18][19]), ebenso gut wie Intel Parallel Studio Für verschiedene Prozessoren.[20] Oracle Solaris Studio Compiler und Tools unterstützen die neuesten OpenMP -Spezifikationen mit Produktivitätsverbesserungen für Solaris OS (UltrasParc und X86/X64) und Linux -Plattformen. Die Forger-, C- und C ++ - Compiler von Die Portland Group Unterstützen Sie auch OpenMP 2.5. GCC hat auch OpenMP seit Version 4.2 unterstützt.

Compiler mit einer Implementierung von OpenMP 3.0:

  • GCC 4.3.1
  • Mercurium Compiler
  • Intel Forran- und C/C ++ - Versionen 11.0 und 11.1 Compiler, Intel C/C ++ und FORTRAN COMPOSER XE 2011 und Intel Parallel Studio.
  • IBM XL Compiler[21]
  • Sun Studio 12 Update 1 verfügt über eine vollständige Implementierung von OpenMP 3.0[22]
  • Multi-Processor Computing

Mehrere Compiler unterstützen OpenMP 3.1:

  • GCC 4.7[23]
  • Intel Forran und C/C ++ Compiler 12.1[24]
  • IBM XL C/C ++ - Compiler für AIX und Linux, v13.1[25] & IBM XL FORTRAN Compiler für AIX und Linux, v14.1[26]
  • Llvm/klang 3.7[27]
  • ABSOST FORTRAN -COMPILER v. 19 für Windows, Mac OS X und Linux[28]

Compiler, die OpenMP 4.0 unterstützen:

  • GCC 4.9.0 für C/C ++, GCC 4.9.1 für FORTRAN[23][29]
  • Intel Forran und C/C ++ Compiler 15.0[30]
  • IBM XL C/C ++ für Linux, v13.1 (partiell)[25] & Xl fortran für Linux, v15.1 (partiell)[26]
  • LLVM/Clang 3.7 (teilweise)[27]

Mehrere Compiler, die OpenMP 4.5 unterstützen:

  • GCC 6 für C/C ++ [31]
  • Intel Forran und C/C ++ Compiler 17.0, 18,0, 19.0 [32]
  • Llvm/klang 12 [33]

Partielle Unterstützung für OpenMP 5.0:

  • GCC 9 für C/C ++ [34]
  • Intel Forran und C/C ++ Compiler 19.1 [35]
  • Llvm/klang 12 [33]

Automatische Parallelisierung Compiler, die mit OpenMP -Direktiven kommentierten Quellcode generiert:

Mehrere Profiler und Debugger unterstützen OpenMP ausdrücklich:

  • Intel Vtune Profiler - ein Profiler für die x86 CPU und Xe GPU -Architekturen
  • Intel Advisor - Ein Tool für Designhilfe und Analyse für OpenMP- und MPI -Codes
  • Allinea verteilte Debugging -Tool (DDT) - Debugger für OpenMP- und MPI -Codes
  • Allinea -Karte - Profiler für OpenMP- und MPI -Codes
  • Totalview - Debugger von Rogue Wave Software Für OpenMP-, MPI- und Seriencodes
  • OMPP - Profiler für OpenMP
  • Vampir - Profiler für OpenMP- und MPI -Code

Vor-und Nachteile

Profis:

  • Tragbarer Multithreading-Code (in C/C ++ und anderen Sprachen muss man normalerweise plattformspezifische Primitive aufrufen, um Multithreading zu erhalten).
  • Einfach: muss sich nicht mit dem Verabschiedung von Nachrichten als umgehen als MPI tut.
  • Das Datenlayout und die Zerlegung werden automatisch von Richtlinien behandelt.
  • Skalierbarkeit vergleichbar mit MPI auf gemeinsam genutzten Systemen.[36]
  • Inkrementelle Parallelität: Kann gleichzeitig an einem Teil des Programms arbeiten, es ist keine dramatische Änderung des Code erforderlich.
  • Einheitlicher Code für serielle und parallele Anwendungen: OpenMP -Konstrukte werden als Kommentare behandelt, wenn sequentielle Compiler verwendet werden.
  • Original (serielle) Code -Anweisungen müssen im Allgemeinen nicht geändert werden, wenn sie mit OpenMP parallelisiert ist. Dies verringert die Wahrscheinlichkeit, versehentlich Fehler einzuführen.
  • Beide grobkörnig und feinkörnig Parallelität sind möglich.
  • In unregelmäßigen Multi-Physik-Anwendungen, die sich nicht nur an die halten SPMD Berechnungsart, wie in eng gekoppelten Fluid-Partikulate-Systemen auftreten, kann die Flexibilität von OpenMP einen großen Leistungsvorteil haben MPI.[36][37]
  • Kann bei verschiedenen Beschleunigern verwendet werden, z. Gpgpu[38] und Fpgas.

Nachteile:

  • Risiko, schwer zu debuggen Synchronisationsfehler einzuführen und Rennbedingungen.[39][40]
  • Ab 2017 läuft nur effizient in gemeinsamen Multiprozessor-Plattformen mit gemeinsamem Memory (siehe jedoch Intel's Cluster OpenMP Archiviert 2018-11-16 bei der Wayback -Maschine und andere verteilter gemeinsamer Speicher Plattformen).
  • Benötigt einen Compiler, der OpenMP unterstützt.
  • Die Skalierbarkeit wird durch Gedächtnisarchitektur begrenzt.
  • Keine Unterstützung für vergleiche und swap.[41]
  • Eine zuverlässige Fehlerbehandlung fehlt.
  • Es fehlt feinkörnige Mechanismen zur Steuerung der Kartierung der Gewindeprozessor.
  • Hohe Chance, versehentlich zu schreiben Falsche Teilen Code.

Leistungserwartungen

Man könnte erwarten, eine zu bekommen N mal beschleunigen Beim Ausführen eines Programms parallel mit OpenMP auf a N Prozessorplattform. Dies tritt jedoch selten aus diesen Gründen auf:

  • Wenn eine Abhängigkeit besteht, muss ein Prozess warten, bis die Daten, von denen sie abhängt, berechnet werden.
  • Wenn mehrere Prozesse eine nichtparallele Beweisressource (wie eine Datei zum Schreiben) teilen, werden ihre Anforderungen nacheinander ausgeführt. Daher muss jeder Thread warten, bis der andere Thread die Ressource veröffentlicht.
  • Ein großer Teil des Programms darf nicht durch OpenMP parallelisiert werden, was bedeutet, dass die theoretische Obergrenze von Beschleunigung nach Begrenzung von entsprechend begrenzt ist Amdahls Gesetz.
  • N Prozessoren in a Symmetrische Multiprozessierung (SMP) kann nfache Rechenleistung haben, aber die Speicherbandbreite Normalerweise skalieren Sie nicht n -mal. Sehr oft wird der ursprüngliche Speicherpfad von mehreren Prozessoren geteilt, und es kann beobachtet werden, wenn sie um die gemeinsame Speicherbandbreite der gemeinsamen Speicher konkurrieren.
  • Viele andere häufige Probleme, die die endgültige Beschleunigung beeinflussen in Parallele Computing Bewerben Sie sich auch bei OpenMP wie Lastverteilung und Synchronisation Overhead.
  • Die Compiler -Optimierung ist beim Aufrufen von OpenMP möglicherweise nicht so effektiv. Dies kann üblicherweise zu einem OpenMP-Programm mit einem Thread-Programm führen, das langsamer läuft als der gleiche Code ohne OpenMP-Flag (das vollständig seriell ist).

Fadenaffinität

Einige Anbieter empfehlen, die festzulegen Prozessoraffinität Auf OpenMP -Threads, um sie mit bestimmten Prozessorkernen zu verbinden.[42][43][44] Dies minimiert die Migration der Thread-Migration und den Kontext-Switching-Kosten unter den Kernen. Es verbessert auch die Datenlokalität und reduziert den Cache-Kohärenzverkehr zwischen den Kernen (oder Prozessoren).

Benchmarks

Es wurde eine Vielzahl von Benchmarks entwickelt, um die Verwendung von OpenMP zu demonstrieren, ihre Leistung zu testen und die Korrektheit zu bewerten.

Einfache Beispiele

  • OMPSCR: OpenMP -Quellcode -Repository

Leistungsbenchmarks umfassen:

  • NAS Parallele Benchmark
  • Barcelona OpenMP Task Suite Eine Sammlung von Anwendungen, mit denen OpenMP -Aufgaben -Implementierungen getestet werden können.
  • Spezifikationserie
    • Spezifikation 2012
    • Die Spec Accel Benchmark Suite Testing OpenMP 4 Ziel -Offloading -API
    • Der SpecHPC 2002 Benchmark
  • Korallenbenchmarks
  • Exascale Proxy -Anwendungen
  • Rodinia konzentriert sich auf Beschleuniger.
  • Problembasierte Benchmark -Suite

Zu den Korrektheit der Benchmarks gehören:

  • OpenMP -Validierungssuite
  • OpenMP -Validierungs- und Verifizierungstestsuite
  • DataraceBench ist eine Benchmark -Suite, mit der die Wirksamkeit von OpenMP -Daten -Rennerkennungs -Tools systematisch und quantitativ bewertet wurde.
  • Autoparbench ist eine Benchmark -Suite zur Bewertung von Compilern und Tools, mit denen openMP -Direktiven automatisch eingefügt werden können.

Siehe auch

Verweise

  1. ^ a b c "Über den OpenMP Arb und". Openmp.org. 2013-07-11. Archiviert von das Original Am 2013-08-09. Abgerufen 2013-08-14.
  2. ^ a b "OpenMP Compiler & Tools". Openmp.org. November 2019. Abgerufen 2020-03-05.
  3. ^ a b Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (2012-12-17). Betriebssystemkonzepte (9. Aufl.). Hoboken, N.J.: Wiley. S. 181–182. ISBN 978-1-118-06333-0.
  4. ^ OpenMP -Tutorial bei Supercomputing 2008
  5. ^ Verwenden von OpenMP - Portable Shared Memory Parallele Programmierung - Book Beispiele herunterladen und diskutieren
  6. ^ Costa, J.J.; et al. (Mai 2006). "Ausführen von OpenMP-Anwendungen effizient auf einem Everything-Shared SDSM". Journal of Parallel und Distributed Computing. 66 (5): 647–658. doi:10.1016/j.jpdc.2005.06.018.
  7. ^ Basumallik, Ayon; Min, Seung-Jai; Eigenmann, Rudolf (2007). Programmieren verteilter Speicher -SYTEMS [SIC] mit OpenMP. Proceedings des IEEE International Parallel and Distributed Processing Symposium 2007. New York: IEEE Press. S. 1–8. Citeseerx 10.1.1.421.8570. doi:10.1109/ipdps.2007.370397. ISBN 978-1-4244-0909-9. S2CID 14237507. A Preprint ist auf der Homepage von Chen Ding erhältlich; Siehe insbesondere Abschnitt 3 zur Übersetzung von OpenMP nach MPI.
  8. ^ Wang, Jue; Hu, Changjun; Zhang, Jilin; Li, Jianjiang (Mai 2010). "OpenMP -Compiler für verteilte Speicherarchitekturen". Wissenschaft China Informationswissenschaften. 53 (5): 932–944. doi:10.1007/s11432-010-0074-0. (Ab 2016 Die in diesem Artikel beschriebene KLComp -Software scheint nicht öffentlich verfügbar zu sein)
  9. ^ Cluster OpenMP (Ein Produkt, das früher verfügbar war für Intel C ++ - Compiler Versionen 9.1 bis 11.1, wurde aber in 13.0 fallen gelassen)
  10. ^ Ayguade, Eduard; Copty, Nawal; Duran, Alejandro; Hoeflinger, Jay; Lin, Yuan; Massaioli, Federico; Su, Ernesto; Unnikrishnan, Priya; Zhang, Guansong (2007). Ein Vorschlag für die Parallelität der Aufgaben in OpenMP (PDF). Proc. INT'L Workshop auf OpenMP.
  11. ^ "OpenMP -Anwendungsprogrammschnittstelle, Version 3.0" (PDF). openmp.org. Mai 2008. Abgerufen 2014-02-06.
  12. ^ Lagrone, James; Aribuki, Ayodunni; Addison, Cody; Chapman, Barbara (2011). Eine Laufzeitimplementierung von OpenMP -Aufgaben. Proc. INT'L Workshop auf OpenMP. S. 165–178. Citeseerx 10.1.1.221.2775. doi:10.1007/978-3-642-21487-5_13.
  13. ^ "OpenMP 4.0 API veröffentlicht". Openmp.org. 2013-07-26. Archiviert von das Original Am 2013-11-09. Abgerufen 2013-08-14.
  14. ^ "OpenMP -Anwendungsprogrammschnittstelle, Version 4.0" (PDF). openmp.org. Juli 2013. Abgerufen 2014-02-06.
  15. ^ "C - So verwenden Sie printf () in mehreren Threads".
  16. ^ "Tutorial - Parallele für Schleifen mit OpenMP". 2009-07-14.
  17. ^ Visual C ++ Ausgaben, Visual Studio 2005
  18. ^ Visual C ++ Ausgaben, Visual Studio 2008
  19. ^ Visuelle C ++ - Editionen, Visual Studio 2010
  20. ^ David Worthington, "Intel befasst sich mit dem Entwicklungslebenszyklus mit parallelem Studio" Archiviert 2012-02-15 in der Wayback -Maschine, Sdtimes, 26. Mai 2009 (Zugriff am 28. Mai 2009)
  21. ^ "XL C/C ++ für Linux -Funktionen", (abgerufen am 9. Juni 2009)
  22. ^ "Oracle Technology Network für Java -Entwickler | Oracle Technology Network | Oracle". Entwickler.sun.com. Abgerufen 2013-08-14.
  23. ^ a b "OpenMP - GCC Wiki". Gcc.gnu.org. 2013-07-30. Abgerufen 2013-08-14.
  24. ^ Eingereicht von Patrick Kennedy ... am Fri, 09/02/2011-11:28 (2011-09-06). "Intel® C ++ - und FORTRAN -Compiler unterstützen jetzt die OpenMP* 3.1 -Spezifikation | Intel® Developer Zone". Software.intel.com. Abgerufen 2013-08-14. {{}}: |author= hat generischen Namen (Hilfe)
  25. ^ a b "IBM XL C/C ++ - Compiler -Funktionen". 13. Dezember 2018.
  26. ^ a b "IBM XL FORTRAN COMPILERS Features". 13. Dezember 2018.
  27. ^ a b "Clang 3.7 Versionsnotizen". llvm.org. Abgerufen 2015-10-10.
  28. ^ "Aboft -Homepage". Abgerufen 2019-02-12.
  29. ^ "GCC 4.9 Release -Serie - Änderungen". www.gnu.org.
  30. ^ "OpenMP* 4.0 Funktionen in Intel Compiler 15.0". Software.intel.com. 2014-08-13. Archiviert von das Original Am 2018-11-16. Abgerufen 2014-11-10.
  31. ^ "GCC 6 Release -Serie - Änderungen". www.gnu.org.
  32. ^ "OpenMP Compiler & Tools". openmp.org. www.openmp.org. Abgerufen 29. Oktober 2019.
  33. ^ a b "OpenMP Support - Clang 12 Dokumentation". Clang.llvm.org. Abgerufen 2020-10-23.
  34. ^ "GOMP - Eine OpenMP -Implementierung für GCC - GNU -Projekt - Free Software Foundation (FSF)". gcc.gnu.org. Archiviert von das Original am 2021-02-27. Abgerufen 2020-10-23.
  35. ^ "OpenMP* Support". Intel. Abgerufen 2020-10-23.
  36. ^ a b Amritkar, Amit; Tafti, Danesh; Liu, Rui; Kufrin, Rick; Chapman, Barbara (2012). "OpenMP-Parallelität für Flüssigkeits- und Flüssigkeitspartikulationssysteme". Parallele Computing. 38 (9): 501. doi:10.1016/j.parco.2012.05.005.
  37. ^ Amritkar, Amit; Deb, Surya; Tafti, Danesh (2014). "Effiziente parallele CFD-DEM-Simulationen mit OpenMP". Journal of Computational Physics. 256: 501. Bibcode:2014jcoph.256..501a. doi:10.1016/j.jcp.2013.09.007.
  38. ^ OpenMP -Beschleunigerunterstützung für GPUs
  39. ^ Erkennung und Vermeiden von OpenMP -Rennbedingungen in C ++
  40. ^ "Alexey Kolosov, Evgeniy Ryzhkov, Andrey Karpov 32 OpenMP -Fallen für C ++ - Entwickler". Archiviert von das Original Am 2017-07-07. Abgerufen 2009-04-15.
  41. ^ Stephen Blair-Chappell, Intel Corporation, wird in neun Minuten zu einem parallelen Programmexperte, Präsentation auf Accu 2010 Konferenz
  42. ^ Chen, Yurong (2007-11-15). "Multi-Core-Software". Intel Technology Journal. 11 (4). doi:10.1535/itj.1104.08.
  43. ^ "Ompm2001 Ergebnis". Spezifikation. 2008-01-28.
  44. ^ "Ompm2001 Ergebnis". Spezifikation. 2003-04-01. Archiviert von das Original am 2021-02-25. Abgerufen 2008-03-28.

Weitere Lektüre

  • Quinn Michael J, Parallele Programmierung in C mit MPI und OpenMP McGraw-Hill Inc. 2004. ISBN0-07-058201-7
  • R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Parallele Programmierung in OpenMP. Morgan Kaufmann, 2000. ISBN1-55860-671-8
  • R. Eigenmann (Herausgeber), M. Voss (Herausgeber), OpenMP Shared Memory Parallele Programmierung: Internationaler Workshop zu OpenMP -Anwendungen und Tools, WOMPAT 2001, West Lafayette, IN, USA, 30. bis 31. Juli 2001. (Vorlesungen in Informatik). Springer 2001. ISBN3-540-42346-x
  • B. Chapman, G. Jost, R. van der Pas, D.J. Kuck (Vorwort), Verwenden von OpenMP: Parallele Programmierung mit tragbarem Shared Memory. The MIT Press (31. Oktober 2007). ISBN0-262-53302-2
  • Parallele Verarbeitung über MPI & OpenMP, M. Firuziaan, O. Nommensen. Linux Enterprise, 10/2002
  • MSDN Magazine Artikel über OpenMP
  • SC08 OpenMP -Tutorial Archiviert 2013-03-19 bei der Wayback -Maschine (PDF)-praktische Einführung in OpenMP, Mattson und Meadows, von SC08 (Austin)
  • OpenMP -Spezifikationen Archiviert 2021-03-02 am Wayback -Maschine
  • Parallele Programmierung in Fortran 95 mit OpenMP (PDF)

Externe Links