2 Stimmen

Segmentation Faults beim Ausführen von MEX-Dateien parallel

Ich führe derzeit Wiederholungen eines Experiments durch, das MEX-Dateien in MATLAB 2012a verwendet, und stoße gelegentlich auf Segmentierungsfehler, die ich nicht verstehen kann.

Einige Informationen über die Fehler

  • Sie treten zufällig auf

  • Sie treten nur auf, wenn ich mehrere Wiederholungen meines Experiments parallel auf einer Linux-Maschine mit einer parfor-Schleife ausführe.

  • Sie treten nicht auf, wenn ich mehrere Wiederholungen meines Experiments parallel auf Mac OSX 10.7 mit einer parfor-Schleife ausführe.

  • Sie treten nicht auf, wenn ich die Wiederholungen sequenziell ausführe.

  • Sie scheinen wesentlich seltener aufzutreten, wenn ich 2 Experimente parallel ausführe - im Vergleich zu 12 Experimenten parallel.

Einige Informationen über meine MEX-Datei:

  • Sie ist in C geschrieben

  • Sie verwendet das IBM CPLEX 12.4 API (dies ist threadsicher)

  • Sie wurde mit GCC 4.6.3 kompiliert

Meine Vermutung ist, dass es möglicherweise ein Problem beim Zugriff auf die MEX-Datei in mehreren Kernen gibt. Kann jemand Licht ins Dunkel bringen oder eine Lösung vorschlagen? Ich wäre bereit, weitere Informationen bereitzustellen, wenn nötig.

2voto

Berk U. Punkte 6746

Ich habe vor kurzem einen Stack-Trace an die Leute von MATLAB geschickt und es stellt sich heraus, dass der Übeltäter nicht mein Code ist, sondern eine der Funktionen aus der CPLEX 12.4 API. Es stellt sich heraus, dass diese Funktion die putenv() Funktion in C verwendet, die nicht unbedingt thread-sicher ist.

Leider muss ich diese Funktion und die API weiterhin verwenden, daher habe ich einen Folgethread veröffentlicht, der sich darauf konzentriert, Wege zu finden, um diesen Fehler zu vermeiden.

Jeder Ratschlag wäre willkommen.

1voto

Employed Russian Punkte 180738

Meine Gedanken sind, dass es möglicherweise ein Problem beim Zugriff auf die MEX-Datei in mehreren Kernen gibt.

Es ist viel wahrscheinlicher, dass Ihre MEX-Datei einen Fehler hat. Verschiedene Fehler (die sehr einfach in C zu machen sind), wie der Zugriff auf hängenden Speicher, doppeltes free() oder Schreiben über das Ende eines allokierten Arrays, werden zu intermittierenden SIGSEGV führen.

Ihre beste Option ist, Matlab unter einem Debugger laufen zu lassen und zu sehen, wo es abstürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X