2012-01-23 24 views
18

codice Ho la seguente C/C++ usando OpenMP:Set numero di thread che utilizzano omp_set_num_threads() per 2, ma omp_get_num_threads() restituisce 1

int nProcessors=omp_get_max_threads(); 
    if(argv[4]!=NULL){ 
     printf("argv[4]: %s\n",argv[4]); 
     nProcessors=atoi(argv[4]); 
     printf("nProcessors: %d\n",nProcessors); 
    } 
    omp_set_num_threads(nProcessors); 
    printf("omp_get_num_threads(): %d\n",omp_get_num_threads()); 
    exit(0); 

Come potete vedere, sto cercando di impostare la numero di processori da utilizzare in base a un argomento passato sulla riga di comando.

Tuttavia, sto ottenendo il seguente output:

argv[4]: 2 //OK 
nProcessors: 2 //OK 
omp_get_num_threads(): 1 //WTF?! 

Perché non omp_get_num_threads() sta tornando 2 !!!?


Come è stato sottolineato, chiamo omp_get_num_threads() in una regione di serie, quindi la funzione restituisce 1.

Tuttavia, ho il seguente codice parallelo:

#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected) 
    for(i=0;i<fileLen-CHUNKSIZE;i++){ 
     tid=omp_get_thread_num(); 
     printf("%d\n",tid); 
     int nThreads=omp_get_num_threads(); 
     printf("%d\n",nThreads); 
... 

che emette:

0 //tid 
1 //nThreads - this should be 2! 
0 
1 
0 
1 
0 
1 
... 
+3

Stai chiamando questo da una parte seriale del tuo programma? Se sì, il numero di thread è in realtà 1. – stephan

+0

He stephan: molte grazie per l'intuizione. Ho modificato l'OP con un'altra domanda correlata. – Eamorr

+1

Se si utilizzano librerie Intel IPP con OpenMP abilitato, ho visto alcuni casi in cui si scontrano ... –

risposta

26

I omp_get_num_threads() chiamata restituisce 1 nella sezione seriale del codice. Vedere Link

Quindi, è necessario disporre di codice parallelo per ottenere il valore corretto, ecco come il codice dovrebbe essere simile:

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

int main (int argc, const char * argv[]) 
{ 
    int nProcessors = omp_get_max_threads(); 

    std::cout<<nProcessors<<std::endl; 

    omp_set_num_threads(nProcessors); 

    std::cout<<omp_get_num_threads()<<std::endl; 

#pragma omp parallel for 
    for(int i = 0; i < 5; i++){ 
     int tid = omp_get_thread_num(); 
     std::cout<<tid<<"\t tid"<<std::endl; 
     int nThreads = omp_get_num_threads(); 
     std::cout<<nThreads<<"\t nThreads"<<std::endl; 
    } 

    exit(0); 
} 

Questo codice produce:

1 
0 tid 
2 nThreads 
0 tid 
2 nThreads 
0 tid 
2 nThreads 
1 tid 
2 nThreads 
1 tid 
2 nThreads 

Sembra che tu abbia o aperto mp non abilitato o il tuo ciclo non sia nella forma che può essere paragonato da openmp

+0

OK, ma quando vado in una regione parallela, restituisce ancora 1 ... Si prega di vedere la mia modifica. Molte grazie ... – Eamorr

+0

Dove stai iniziando la tua regione parallela, non la vedo nella modifica. – tune2fs

+0

Mi spiace, l'ho appena aggiornato ... – Eamorr

8

si sta utilizzando la funzione sbagliata. utilizzare omp_get_max_threads per verificare il numero massimo di thread consentiti.

0

È stato già sottolineato che omp_get_num_threads() restituisce 1 in sezioni sequenziali del codice. Di conseguenza, anche se si imposta, per omp_set_num_threads(), un numero complessivo di thread superiore a 1, qualsiasi chiamata a omp_get_num_threads() restituirà 1, a meno che non ci si trovi in ​​una sezione parallela. L'esempio seguente cerca di chiarire questo punto

#include <stdio.h> 

#include <omp.h> 

int main() { 

    const int maxNumThreads = omp_get_max_threads(); 

    printf("Maximum number of threads for this machine: %i\n", maxNumThreads); 

    printf("Not yet started a parallel Section: the number of threads is %i\n", omp_get_num_threads()); 

    printf("Setting the maximum number of threads...\n"); 
    omp_set_num_threads(maxNumThreads); 

    printf("Once again, not yet started a parallel Section: the number of threads is still %i\n", omp_get_num_threads()); 

    printf("Starting a parallel Section...\n"); 

#pragma omp parallel for 
    for (int i = 0; i < maxNumThreads; i++) { 
     int tid = omp_get_thread_num(); 
     printf("This is thread %i announcing that the number of launched threads is %i\n", tid, omp_get_num_threads()); 
    } 

} 
Problemi correlati