Mehrere OpenMP - Fragen
-
Ich versuche gerade, ich in OpenMP einzuarbeiten, und werde hier in diesem Thread meine Schwierigkeiten und Fragen posten.
Da ich den Thread des Öfteren updaten werde, wenn ich auf neue Probleme stoße, lohnt es sich unter Umständen auch später nochmal reinzuschauen.
Falls das das falsche Subforum ist, bitte verschieben.
Problem 1 - offen
Was ich erreichen möchte:
Umgang mit dem Keyword sections.Das Problem, das ich mir dazu ausgedacht habe:
2 Threads initialisieren parallel ein Array - ohne dass ich dabei die einfache Variante mit parallel for verwende.Ansatz:
#include <iostream> #include <omp.h> using namespace std; int main() { int a[20]; #pragma omp parallel sections shared(a) { #pragma omp section { for(int i=0; i< 10; i++) { a[i] = i; #pragma omp critical cout << "Thread " << omp_get_thread_num << " calculating " << i << endl; } } #pragma omp section { for(int i=10; i< 20; i++) { a[i] = i; #pragma omp critical cout << "Thread " << omp_get_thread_num << " calculating " << i << endl; } } } for(int i=0; i< 20; i++) cout << i << " " ; cout << endl; return 0; }
Leider wird das hier alles von EINEM Thread getan:
Thread 1 calculating 0
...
Thread 1 calculating 19Wie kann ich erreichen, dass beide Sections von unterschiedlichen Threads ausgeführt werden?
-
Mh, also in einem Beispiel ist der erste Block (also deine erste Section) ohne #pragma omp section, sondern nur die { ... }.
Frag doch vor dem pragma Block nach den möglichen OpenMP-Threads mit omp_get_max__threads (oder so ähnlich heisst der Befehl). Umgekehrt kannst du ja auch die Threadanzahl einstellen mit omp-set_num_threads (oder so ähnlich ;))
-
Ich kann mich meinem Vorredner nur anschließen. Bei mir funktioniert folgendes.
Und warum willst du nicht
parallel for
verwenden?#include <iostream> #include <omp.h> #include <vector> int main() { int const n_threads = 2; omp_set_num_threads( n_threads ); std::vector<double> sample( 20, 0.0 ); #pragma omp parallel sections shared(sample) { #pragma omp section { for(int i=0; i< 10; i++) { sample[i] = i; #pragma omp critical std::cout << "Thread " << omp_get_thread_num() << " calculating " << i << std::endl; } } #pragma omp section { for(int i=10; i< 20; i++) { sample[i] = i; #pragma omp critical std::cout << "Thread " << omp_get_thread_num() << " calculating " << i << std::endl; } } } for(double x: sample) std::cout << x << " "; std::cout << std::endl; return 0; }
Ausgabe
Thread 0 calculating 0 Thread 1 calculating 10 Thread 0 calculating 1 Thread 1 calculating 11 Thread 0 calculating 2 Thread 1 calculating 12 Thread 0 calculating 3 Thread 1 calculating 13 Thread 0 calculating 4 Thread 1 calculating 14 Thread 0 calculating 5 Thread 1 calculating 15 Thread 0 calculating 6 Thread 1 calculating 16 Thread 0 calculating 7 Thread 1 calculating 17 Thread 0 calculating 8 Thread 1 calculating 18 Thread 0 calculating 9 Thread 1 calculating 19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Gruß,
-- Klaus.