Warum OpenMP-Programm läuft nur in einem thread
Habe ich gerade versucht, die OpenMP mit einem einfachen c-Programm
test() {
for(int i=0;i<100000000;i++);
}
main() {
printf("Num of CPU: %d\n", omp_get_num_procs());
#pragma omp parallel for num_threads(4)
for(int i=0;i<100;i++) test();
}
Zusammengestellt g++ -fopenmp
. Es kann richtig Druck heraus, dass ich 4 CPUs, aber alle test-Funktionen laufen auf thread 0
.
Habe ich versucht zu ändern, der OMP_NUM_THREADS
. Aber es hat keine Wirkung auch.
Hatte ich alles die gleiche wie die online-Beispiele, aber warum sollte ich nicht, dass es funktioniert?
Woher weißt du, dass es läuft nur ein thread?
Ich habe ja in der test () - durch den Druck aus der omp_get_thread_num().
Haben Sie
Danke, das habe ich überprüft omp_get_max_threads() in der test() und es ist 4. Aber immer noch jeden test() läuft auf thread Nummer 0.
Ist es möglich, dass der compiler optimiert Sie alle die Schleifen, Sie tun nichts, und dann wird jeder thread endet schneller als die Schleife schaffen Sie ausführen können, da Sie nicht alles tun... es gibt also immer nur ein thread läuft. Nur eine Theorie, wohl falsch 🙂
Ich habe ja in der test () - durch den Druck aus der omp_get_thread_num().
Haben Sie
omp_get_max_threads()
um zu sehen, ob openmp Dinge, es kann nur ein thread aus irgendeinem Grund?Danke, das habe ich überprüft omp_get_max_threads() in der test() und es ist 4. Aber immer noch jeden test() läuft auf thread Nummer 0.
Ist es möglich, dass der compiler optimiert Sie alle die Schleifen, Sie tun nichts, und dann wird jeder thread endet schneller als die Schleife schaffen Sie ausführen können, da Sie nicht alles tun... es gibt also immer nur ein thread läuft. Nur eine Theorie, wohl falsch 🙂
InformationsquelleAutor Eines He | 2012-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist hier:
Die richtige Klausel ist
num_threads(4)
, nichtnum_thread(4)
. Falsche openmp-pragmas ignoriert werden, und so Sie am Ende mit einem sequentiellen Programm. 🙂Ich bin überrascht, dass Sie nicht bekommen, eine compiler-Warnung, weil ich.
Er: Dann ist es sehr merkwürdig, da ich klebte Ihren code, kompiliert es und lief es und es funktionierte auf allen 4 Kernen.
Wie richten Sie Ihre Umgebung? Ich denke, der code ist Recht simpel und könnte nicht schief gehen. Ich bin mit g++ 4.6.1 und libomp1. Ich denke, das openmp ist definitiv Arbeit, denn ich habe kein problem bei der überprüfung der Anzahl der cpus, ...etc. Es müssen einige, wo ich nicht mit der Umgebung korrekt.
Hmm... getestet habe ich dies unter Windows mit cl.exe. Ich werde es testen auf meinem Linux-Umfeld so schnell wie möglich und lassen Sie wissen.
Ok, also getestet habe ich unter ubuntu mit g++ 4.5.2 und es funktioniert auch dort.
InformationsquelleAutor Tudor
Ich hatte dieses problem in visual studio, und schließlich Verstand ich, dass ich vergessen hatte zu aktivieren, Öffnen Sie die MP-Unterstützung in visual studio. Es hat nicht mir keine Fehler aber das Programm ausgeführt nur für einen thread
Gespeichert meiner Zeit. Thx.
InformationsquelleAutor hamed246
verwenden Sie die Funktion omp_set_num_threads(4) vor dem Aufruf der omp parallel Abschnitt.
auch, wie bestimmen Sie die Anzahl der threads ??
das einbetten der printfs in einem kritischen Abschnitt, nur um sicherzustellen, dass alles wird immer gedruckt.
InformationsquelleAutor prathmesh.kallurkar
Traf ich die gleiche situation auf meinem ubuntu-desktop, wenn ich erweitert numpy-Modul mit C-code. openmp lief nur mit einem thread. Ich hatte zu entfernen libopenblas-base, und installieren Sie libatlas-base-dev.(Umgang mit numpy installation problem), Dann wird multi-threading (openmp kam zurück:)
Ich habe es getestet auf einem ubuntu-server mit 64 Kernen und es funktioniert genauso wie mein desktop!
Ich denke, das ist, weil libopenblas Konflikte mit Bibliotheken wie atlas.
InformationsquelleAutor GBY