2016-08-08 26 views
0

valgrind hat mir gesagt, dass ich in meinem Code folgendes Problem:Speicherleck - OpenMP

LEAK SUMMARY: 
==18114== definitely lost: 0 bytes in 0 blocks 
==18114== indirectly lost: 0 bytes in 0 blocks 
==18114==  possibly lost: 1,776 bytes in 3 blocks 
==18114== still reachable: 2,320 bytes in 4 blocks 
==18114==   suppressed: 0 bytes in 0 blocks 

Dieses Problem tritt auf in:

#pragma omp parallel for num_threads(numThreads) 

in

parallelCalc= new Calculator[numOff]; 

    #pragma omp parallel for num_threads(numThreads) 
    for(int i = 1; i<=numOff;i++) 
    { 
     std::stringstream sstm; 
     sstm << filename <<"/" << i<<".off"; 
     std::string aktFilename = sstm.str(); 


     Polyhedron *poly = new Polyhedron(aktFilename.c_str()); 
     parallelCalc[i-1].init(poly,consistentTargets->points,numTarget); 
     parallelCalc[i-1].hfield(); 


     delete poly; 
    } 

Ich habe versucht, setze parallelCalc in openmp freigegeben, (ich denke, das ist das Problem, nicht wahr?), aber wenn ich das tue, bekomme ich den Fehler MainController::parallelCalc is not a variable in clause shared. Kann mir jemand einen Hinweis geben, wie man dieses Speicherproblem löst?

+0

Gibt es einen Grund, warum Sie hier einen Zeiger verwenden? Wenn nicht, sollten Sie stattdessen ein lokales automatisches Schleifenobjekt verwenden. – NathanOliver

+0

Sind Sie sicher, dass das Problem mit omp zusammenhängt? Verschwindet der Fehler, wenn Sie omp deaktivieren? – Mehno

+0

ja, die serielle Version hat keine Speicherprobleme. Und es ist der gleiche Code nur ohne #pragma omp denke ich, dass openmp private prarallelcalcs für jeden Thread produziert und das ist das Problem des Lecks, nicht wahr? – Julian

Antwort

1

Es gibt keine Möglichkeit, Ihren Fehler zu reproduzieren, da der Code nicht vollständig ist.

Ich sehe einen möglichen Speicherverlust. Sie haben einen neuen Rechneranruf, aber kein passendes Löschen.

Darüber hinaus könnte es anderen Speicher statisch durch indirekte Mittel zugewiesen werden, dass es keine Möglichkeit gibt, zu befreien.

Eine Möglichkeit, herauszufinden, was los ist, ist die Verwendung von Valgrind in einem Modus, in dem die spezifischen Elemente angezeigt werden, von denen angenommen wird, dass sie durchgelaufen sind. Normalerweise verwende ich

valgrind --verbose --num-Anrufer = 30 --track-fds = yes --leak-Check = full --show-erreichbar = yes

Dies wird Dump viele weitere Informationen ermöglichen Sie zu verfolgen, wo Valgrind denkt, dass das Leck von kommt. Verwenden Sie die Stack-Traces Mit Valgrind können Sie herausfinden, ob Sie die "Leaks" ignorieren können, weil Sie nichts dagegen tun können oder wenn Sie den Code, den Sie schreiben, korrigieren müssen.

+0

Siehe die folgenden für mögliche duplizieren: http://StackOverflow.com/Questions/26391389/Compiling-with-openmp-results-in-a-memory-leak?rq=1 – Russ

+0

Ich bin nicht sicher, das ist das gleiche. Wenn ich parallelCalc = new parallelCalc() setze und parallelCalc innerhalb der for-Schleife lösche, bekomme ich keine Lecks, aber ich brauche die Ergebnisse von parallelCalc. – Julian

+0

löschen Sie parallelCalc mit 'delete [] parallelCalc'? Haben Sie versucht, Valgrind mit den oben erwähnten Befehlszeilenoptionen auszuführen, um zu sehen, auf welchen Valgrind Sie zeigen? – Russ