2012-06-19 8 views
22

Ich schreibe ein paralleles Programm mit OpenMP in C++.OpenMP set_num_threads() funktioniert nicht

Ich möchte die Anzahl der Threads im Programm mit omp_set_num_threads() steuern, aber es funktioniert nicht.

#include <iostream> 
#include <omp.h> 
#include "mpi.h" 

using namespace std; 

int myrank; 
int groupsize; 
double sum; 
double t1,t2; 
int n = 10000000; 

int main(int argc, char *argv[]) 
{ 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    MPI_Comm_size(MPI_COMM_WORLD,&groupsize); 

    omp_set_num_threads(4); 

    sum = 0; 
    #pragma omp for reduction(+:sum) 
    for (int i = 0; i < n; i++) 
     sum+= i/(n/10); 

    cout<<"sum="<<sum<<endl; 
    cout<<"threads="<<omp_get_num_threads()<<endl; 

    MPI_Finalize(); 
    return 0; 
} 

Die Programmausgaben:

sum = 4.5e+007 
threads=1 

Wie die Anzahl der Threads kontrollieren?

Antwort

69

Neben dem Aufruf von omp_get_num_threads() außerhalb der parallelen Region in Ihrem Fall garantiert der Aufruf von omp_set_num_threads() weiterhin nicht, dass die OpenMP-Laufzeitumgebung genau die angegebene Anzahl von Threads verwendet. omp_set_num_threads() wird verwendet, um den Wert der Umgebungsvariablen OMP_NUM_THREADS zu überschreiben und beide steuern die obere Grenze der Größe des Thread-Teams, das OpenMP für alle parallelen Regionen (im Fall von OMP_NUM_THREADS) oder für jede konsequente parallele Region (nach einem Anruf an omp_set_num_threads()). Es gibt so genannte dynamische Teams, die immer noch eine kleinere Anzahl von Threads auswählen können, wenn das Laufzeitsystem dies für angemessener hält. Sie können dynamische Teams deaktivieren, indem Sie omp_set_dynamic(0) aufrufen oder die Umgebungsvariable OMP_DYNAMIC auf false setzen.

Um eine bestimmte Anzahl von Threads erzwingen sollten Sie dynamische Teams deaktivieren und die gewünschte Anzahl von Threads mit entweder omp_set_num_threads() angeben:

omp_set_dynamic(0);  // Explicitly disable dynamic teams 
omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions 
#pragma omp parallel ... 
{ 
    ... 4 threads used here ... 
} 

oder mit der num_threads OpenMP-Klausel:

omp_set_dynamic(0);  // Explicitly disable dynamic teams 
// Spawn 4 threads for this parallel region only 
#pragma omp parallel ... num_threads(4) 
{ 
    ... 4 threads used here ... 
} 
+0

Aber ich konnte keine Beschleunigung bekommen, indem ich die Anzahl der Threads änderte und auch omp_set_dynamic (0) ?? – Nurlan

+4

Zuerst dauert die _serial_ Version 50 ms auf meiner CPU. Sie können aufgrund des OpenMP-Overhead keine Beschleunigung für solch schnelle Codes erwarten. Setzen Sie 100x mehr Interaktionen in die Schleife. Zweitens fehlt in Ihrem ursprünglichen Code die "parallele" Region. Sie haben '#pragma omp for ...' geschrieben, während es '#pragma omp parallel for ...' sein sollte. Drittens mischen Sie MPI und OpenMP. Sind Sie sicher, dass Sie genau wissen, was Sie tun? –

+0

@HristoIliev kann ein Benutzer die Anzahl der Threads dynamisch steuern? h., anstatt eine hartcodierte "4" zu verwenden. benutze eine Variable? – manatttta

15

Die Funktion omp_get_num_threads() gibt die Anzahl der Threads zurück, die derzeit im Team sind, das die parallele Region ausführt, von der es heißt. Sie rufen es außerhalb der Parallelregion auf, weshalb es 1 zurückgibt.

3

Nach die GCC manual for omp_get_num_threads:

In einer sequentiellen s ection des Programm omp_get_num_threads zurück 1

So folgt aus:

cout<<"sum="<<sum<<endl; 
cout<<"threads="<<omp_get_num_threads()<<endl; 

Sollte so etwas wie geändert werden:

#pragma omp parallel 
{ 
    cout<<"sum="<<sum<<endl; 
    cout<<"threads="<<omp_get_num_threads()<<endl; 
} 

Der Code Ich benutze folgt Hristo Rat von dynamischen Teams zu deaktivieren, zu .

2

Ich war mit dem gleichen Problem konfrontiert. Lösung gegeben unter

Rechtsklick auf Source-Programm> Eigenschaften> Konfigurationseigenschaften> C/C++> Sprache> Jetzt öffnen MP Unterstützung Flagge auf Ja ändern ....

Sie das gewünschte Ergebnis erhalten.