2012-06-19 21 views
22

Sto scrivendo un programma parallelo che utilizza OpenMP in C++.OpenMP set_num_threads() non funziona

Voglio controllare il numero di thread nel programma utilizzando omp_set_num_threads(), ma non funziona.

#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; 
} 

I risultati del programma:

sum = 4.5e+007 
threads=1 

Come controllare il numero di thread?

risposta

69

Oltre a chiamare omp_get_num_threads() al di fuori dell'area parallela nel proprio caso, chiamare omp_set_num_threads() non garantisce ancora che il runtime di OpenMP utilizzi esattamente il numero specificato di thread. omp_set_num_threads() viene utilizzato per sovrascrivere il valore della variabile di ambiente OMP_NUM_THREADS e entrambi controllano il limite superiore della dimensione del team di thread che OpenMP genererà per tutte le regioni parallele (nel caso di OMP_NUM_THREADS) o per qualsiasi regione parallela conseguente (dopo una chiamata a omp_set_num_threads()). C'è qualcosa chiamato team dinamici che potrebbe ancora scegliere un numero minore di thread se il sistema di runtime lo ritiene più appropriato. È possibile disabilitare i team dinamici chiamando omp_set_dynamic(0) o impostando la variabile di ambiente OMP_DYNAMIC su false.

di imporre un determinato numero di thread si dovrebbe disabilitare team dinamici e specificare il numero desiderato di fili sia con omp_set_num_threads():

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

o con la clausola num_threads OpenMP:

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

Ma non ho potuto ottenere alcuna accelerazione modificando il numero di thread e anche impostando il omp_set_dynamic (0) ?? – Nurlan

+4

Innanzitutto, la versione _serial_ richiede 50 ms sulla mia CPU. Non è possibile aspettarsi un aumento della velocità per codici così veloci a causa del sovraccarico di OpenMP. Metti 100 volte più interazioni nel ciclo. Secondo, ti manca la regione 'parallela' nel tuo codice originale. Hai scritto '#pragma omp per ...' mentre dovrebbe essere '#pragma omp parallelo per ...'. Terzo, stai mixando MPI e OpenMP. Sei sicuro di sapere esattamente cosa stai facendo? –

+0

@HristoIliev un utente può controllare dinamicamente il numero di thread? cioè invece di usare un '4' hardcoded. usa una variabile? – manatttta

15

La funzione omp_get_num_threads() restituisce il numero di thread che sono attualmente nel team che esegue l'area parallela da cui viene chiamato. Si sta chiamando fuori dalla regione parallela, motivo per cui restituisce 1.

3

Secondo GCC manual for omp_get_num_threads:

In una sequenza s essione dei omp_get_num_threads programma restituisce 1

Quindi questo:

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

deve essere modificato in qualcosa di simile a:

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

Il codice che uso segue il consiglio di Hristo di disabilitare squadre dinamiche, troppo .

2

Mi trovavo di fronte allo stesso problema. Soluzione è riportata qui sotto

clic destro sulla sorgente del programma> Proprietà> Proprietà di configurazione> C/C++> Language> Ora cambiare Apri MP supporto bandiera a Sì ....

otterrete il risultato desiderato.