[gelöst] C++: OpenMP Parallel
-
Mh,
also diese vermeintlichen memory leaks sind bei Open MP eine kuriose Sache.Wenn ich ein vollkommen triviales Beispiel habe wie
#include <iostream> #include "omp.h" int main() { # pragma omp parallel { } return 0; }
dann sagt Valgrind schon, dass mit
malloc
was nicht stimmen würde und schließlich==6552== LEAK SUMMARY: ==6552== definitely lost: 0 bytes in 0 blocks ==6552== indirectly lost: 0 bytes in 0 blocks ==6552== possibly lost: 456 bytes in 3 blocks ==6552== still reachable: 1,748 bytes in 3 blocks ==6552== suppressed: 0 bytes in 0 blocks
Hä?
In dem Code passiert doch gar nichts. Das Erzeugen von threads sorgt schon für
still reachable
?Gruß,
-- Klaus.
-
Klaus82 schrieb:
In dem Code passiert doch gar nichts. Das Erzeugen von threads sorgt schon für
still reachable
?Ja. Was nicht weiter tragisch ist, denn da steht schließlich nicht "lost". Hier hat ein Programmierer bewusst den Speicher am Programmende nicht freigegeben. Was sein gutes Recht ist, denn er hat entweder Threads für Linux oder OpenMP für Linux programmiert (welcher Teil auch immer hier verantwortlich ist) und kann sich daher da drauf verlassen, dass das Betriebssystem sich allen Speicher bei Prozessende zurück holt.
-
Okay,
dann kann ich das Thema hoffentlich endlich abhaken.
Ich hatte mit dem nun (auch hoffentlich) richtigen Copy Constructor von Interpolation mittels
firstprivate
eine lokale Kopie an jeden Thread übergeben können.Und wenn ich mich bei dieser Fehlermeldung von Valgrind entspannen kann, dann ist scheinbar alles im grünen Bereich.
Dankeschöööööön!
#include <iostream> #include <vector> #include "interpolation.h" #include "omp.h" int main() { std::vector<double> x,y; for(unsigned int i = 0; i < 100; ++i) { x.push_back(static_cast<double>(i)); y.push_back(x[i] * x[i]); } interpolation inter(x,y); omp_set_num_threads(4); # pragma omp parallel firstprivate (inter) { double const number = omp_get_thread_num() + 0.5; # pragma omp critical { std::cout << inter(static_cast<double>(number)) << std::endl; } } return 0; }
Gruß,
-- Klaus.