2016-12-24 5 views
13

OpenMP hat eine eigene Unterstützung für atomaren Zugriff, jedoch gibt es mindestens zwei Gründe, C++ 11 Atomics vorzuziehen: Sie sind wesentlich flexibler und sie sind Teil des Standards. Auf der anderen Seite ist OpenMP leistungsfähiger als die C++ 11-Thread-Bibliothek.Mischen von C++ 11 Atomics und OpenMP

Der Standard spezifiziert die atomare Operationen Bibliothek und die Fadenauflage Bibliothek in zwei verschiedenen Kapiteln. Dies lässt mich glauben, dass die Komponenten für den atomaren Zugriff eine Art orthogonal zur verwendeten Thread-Bibliothek sind. Kann ich tatsächlich C++ 11 Atomics und OpenMP kombinieren?


gibt es eine sehr similar question auf Stack-Überlauf; es ist jedoch seit drei Jahren grundsätzlich unbeantwortet, da seine Antwort die eigentliche Frage nicht beantwortet.

+0

Warum können Sie nicht? Versuchen Sie nicht, einen C++ - Mutex zu erstellen und warten Sie mit OpenMP darauf. –

+0

@brianbeuning Nun, ich bin unsicher, deshalb frage ich. Es gibt einen Kommentar zu der verbundenen Frage, die spekuliert, dass wir "wahrscheinlich auf Probleme stoßen werden".Ich konnte keine feste Antwort auf die Frage im Internet finden, deshalb habe ich die Frage erneut aufgeworfen. – user1494080

+3

Dies ist ein implementierungsdefiniertes Verhalten und kann zwischen Compilern variieren. Es gibt jedoch auch eine eher "praktische" Antwort. Wenn die Standardbibliothek und die OpenMP-Laufzeit in den meisten Fällen vom selben Compiler-Hersteller stammen, ist es höchstwahrscheinlich in Ordnung. Wenn Sie beispielsweise GCC mit libstdC++ und libgomp verwenden, können Sie mit der Laufzeit von libC++ und LLVM (Intel) klarkommen. Es kann Probleme geben, wenn ein Compiler verwendet wird, der keine eigene Standardbibliothek besitzt, zum Beispiel Intel C++ mit libstdC++ unter Linux oder libC++ unter macOS. Ich habe Probleme in diesem Fall gesehen, aber sehr selten. –

Antwort

6

Interessanterweise ist der OpenMP 4.5 Standard (2.13.6) einen eher vagen Bezug auf C++ 11 atomics oder spezifischere std::memory_order:

Die Absicht ist, dass, wenn die analoge Operation in C existiert ++ 11 oder C11, ein sequentiell konsistentes atomares Konstrukt hat die gleiche Semantik wie eine atomare Operation memory_order_seq_cst in C++ 11/C11. In ähnlicher Weise hat ein nicht-sequentiell konsistentes atomares Konstrukt die gleiche Semantik wie eine atomare Operation memory_order_relaxed in C++ 11/C11.

Leider ist dies nur eine Anmerkung, es gibt nichts, das definiert, dass sie gut zusammen spielen. Insbesondere die neueste OpenMP 5.0-Vorschau bezieht sich immer noch auf C++ 98 als einzige normative Referenz für C++. So technisch unterstützt OpenMP nicht einmal C++ 11 sich.

Abgesehen davon wird es wahrscheinlich die meiste Zeit in der Praxis arbeiten. Ich würde zustimmen, dass die Verwendung von std::atomic weniger Probleme mit der Verwendung von OpenMP als C++ 11 Threading hat. Aber wenn es irgendwelche Probleme gibt, ist es vielleicht nicht so offensichtlich. Der schlimmste Fall wäre ein Atom, das nicht atomar arbeitet, obwohl ich ernsthafte Schwierigkeiten habe, mir ein realistisches Szenario vorzustellen, in dem dies passieren könnte. Am Ende des Tages ist es vielleicht nicht wert und das sicherste ist, bei reinem OpenMP oder reinem C++ 11 Thread/Atomics zu bleiben.

Vielleicht hat Hristo etwas dazu zu sagen, in der Zwischenzeit überprüfen this answer für eine allgemeinere Diskussion. Obwohl es ein bisschen veraltet ist, fürchte ich, dass es immer noch gilt.

+4

Ich fragte einmal ein Mitglied des OpenMP ARB und die ** inoffizielle ** Antwort war, dass die Interoperabilität zwischen OpenMP und jedem anderen Threading-Paradigma wird wahrscheinlich nie in die Spezifikation, aber die meisten Anbieter werden sowieso Do The Right Thing (tm) wie in den Kommentaren von Yan Zhou zusammengefasst. Mit anderen Worten, ein solcher Code wird meistens funktionieren, aber niemals tragbar sein. –

1

Dies wird derzeit von OpenMP 4.5 nicht spezifiziert. In der Praxis können Sie in den meisten Compilern C++ 11-atomare Operationen mit OpenMP-Threads verwenden, aber es gibt keine formelle Garantie, dass es funktioniert.

Wegen des nicht spezifizierten Verhaltens, unterstützte GCC bis vor kurzem keine C11-Atomics (die in der Semantik mit C++ 11 Atomics fast identisch sind) und OpenMP-Threads. Einzelheiten finden Sie unter https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65467.

OpenMP 5+ wird dies beheben. Ich bin persönlich in diesen Prozess involviert, aber da noch nichts ratifiziert wurde, werde ich die Details nicht kommentieren.