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 19

    Wie 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.


Anmelden zum Antworten