Meine Frage betrifft die Verwendung von OpenMP in C ++ - Funktionen, die in dynamischen Bibliotheken gespeichert sind. Betrachten wir den folgenden Code (in shared.cpp):
%Vor%Ich kompiliere diesen Code mit g ++: g ++ -fopenmp -shared -fPIC -o shared.so shared.cpp . Um dann die Funktion test zu verwenden, habe ich das folgende Programm (main.cpp):
%Vor%kompiliert mit dem Befehl: g ++ -o main main.cpp -ldl Das Problem ist, dass ein Segmentierungsfehler am Ende der Programmausführung auftritt. Laut Valgrind sind einige Threads zu diesem Zeitpunkt noch aktiv, was mit dem OpenMP-Verhalten in Einklang zu stehen scheint.
Eine Lösung (für C-Code) aus diesem Beitrag ist, das Programm mit dem gcc -fopenmp -Flag zu kompilieren, aber g ++ scheint intelligent genug zu sein, um zu erkennen, dass OpenMP nie in diesem Programm verwendet wird und die OpenMP-Umgebung niemals geladen wird (der Assembler-Code beider Versionen) ist gleich). Die einzige Problemumgehung, die ich gefunden habe, besteht darin, einen unbrauchbaren Aufruf von OpenMP in dem Programm zu machen, was zwingt, dass g ++ die OpenMP-Umgebung lädt, und die Ausführung ist dann korrekt. Aber für mich ist dieser Workaround ziemlich hässlich. Ich habe versucht g ++ - 4.8.2, g ++ - 4.8.1, g ++ - 4.7.3 und g ++ - 4.6.4. (Mit Icc-14 beheben Sie mit der Option -openmp das Problem).
Hat jemand jemals dieses Problem konfrontiert? Gibt es eine sauberere Problemumgehung? Vielen Dank, Thomas
Bearbeiten Versucht mit G ++ - 4.9.2: immer noch fehlgeschlagen
Ich denke, Sie sehen ein Problem mit libgomp, der OpenMP-Laufzeitbibliothek von GCC. Versuchen Sie es zu verlinken: g ++ -o main main.cpp -ldl -lgomp und Ihr Segfault ist weg.
libgomp hat einen internen Status, der beim ersten OpenMP-Aufruf initialisiert wird. Aus irgendeinem Grund tritt die De-Initialisierung nicht auf, wenn Sie eine OpenMP-Bibliothek dynamisch laden. Es klingt wie ein Fehler für mich.
Der Intel Compiler hat eine eigene OpenMP Runtime (libiomp5), die dieses Problem nicht hat.
Tags und Links compilation c++ g++ openmp dynamic-library