2013-04-30 5 views
6

Il codice C++ è legale o esiste un problema con il compilatore? Il codice è stato rispettato in una libreria condivisa utilizzandoPerché il loop while in una sezione parallela OMP non si interrompe quando la condizione di terminazione dipende dall'aggiornamento dalla sezione differente

gcc version 4.4.6 20.110.731 (Red Hat 4.4.6-3) (GCC)

e openMP e poi chiamato via R 2.15.2.

int it=0; 
#pragma omp parallel sections shared(it) 
    { 
     #pragma omp section 
     { 
      std::cout<<"Entering section A"<<std::endl; 
      for(it=0;it<10;it++) 
      { 
        std::cout<<"Iteration "<<it<<std::endl; 

      } 
      std::cout<<"Leaving section A with it="<<it<<std::endl; 
     } 

     #pragma omp section 
     { 
      std::cout<<"Entering section B with it="<<it<<std::endl; 
      while(it<10) 
      { 
        1; 
      } 
      std::cout<<"Leaving section B"<<std::endl; 
    } 
} 

ottengo il seguente output (scuse per intrecciare uscita da 2 fili ma ritengo sia interpretabile):

Entering section A 
Iteration Entering section B with it=0 
0 
Iteration 1 
Iteration 2 
Iteration 3 
Iteration 4 
Iteration 5 
Iteration 6 
Iteration 7 
Iteration 8 
Iteration 9 
Leaving section A with it=10 

Il programma stalle quindi: Sezione B sembra arrestarsi nel ciclo while . Poiché la variabile 'it' è condivisa, non capisco perché il ciclo while non termini quando la sezione A è completa.

risposta

4

Questo è dovuto al fatto shared variabile significa solo che lo stesso per tutte le discussioni, ma il programmatore deve ancora sincronizzare l'accesso da mani

SHARED Clause

È responsabilità del programmatore per garantire che più thread correttamente accedere a variabili SHARED (ad esempio tramite sezioni CRITICAL)

Quindi, è possibile, ad esempio, flush variabili dopo la prima sezione è completato:

 #pragma omp section 
     { 
      std::cout<<"Entering section A"<<std::endl; 
      for(it=0;it<10;it++) 
      { 
        std::cout<<"Iteration "<<it<<std::endl; 

      } 
      #pragma omp flush(it) 
      std::cout<<"Leaving section A with it="<<it<<std::endl; 
     } 

     #pragma omp section 
     { 
      std::cout<<"Entering section B with it="<<it<<std::endl; 
      while(it<10) 
      { 
      #pragma omp flush(it) 
        1; 
      } 
      std::cout<<"Leaving section B"<<std::endl; 
     } 
+0

Grazie mille. – wjastle

+0

Per motivi di interesse è strettamente necessario aggiungere il comando flush nella sezione A? Non tutti i dati vengono copiati dalla cache del processore nella memoria principale alla fine di una sezione? – wjastle

Problemi correlati