Tricky Fehler mit OpenMP in Funktion aus dynamischen Bibliotheken geladen

8

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

    
ThomasI 18.03.2015, 08:45
quelle

1 Antwort

1

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.

    
wpoely86 04.05.2015 09:55
quelle