2013-10-07 10 views
5

Ho già utilizzato OpenMP con i cicli "pragma omp for" e volevo provare ora i task OpenMP. Ma un semplice programma, che dovrebbe eseguire 2 attività parallele, non sembra funzionare. Ho frainteso l'uso dei compiti o cosa c'è di sbagliato qui?Le attività di gcc in openmp non funzionano

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

//ubuntu 12.04 LTS, gcc 4.6.3 
//g++ test_omp.cpp -fopenmp 

int main() 
{ 
#pragma omp parallel 
{ 
    #pragma omp single 
    { 

     #pragma omp task 
     { 
      while(true) 
      { 
      usleep(1e6); 
      #pragma omp critical (c_out) 
      std::cout<<"task1"<<std::endl; 
      } 
     } 

     #pragma omp task 
     { 
      while(true) 
      { 
      usleep(1e6); 
      #pragma omp critical (c_out) 
      std::cout<<"task2"<<std::endl; 
      } 
     } 

    } 
} 
} 

L'output è: task1 task1 task1 .....

Così il secondo compito non è in esecuzione.

risposta

3

Dal spec OpenMP:

Quando un filo incontra un costrutto compito, un'attività è generata da il codice per il blocco strutturato associato. L'ambiente dati di l'attività viene creato in base alle clausole dell'attributo di condivisione dei dati su , il costrutto di attività, gli ICV per i dati per dati e le impostazioni predefinite che si applicano a .

Il thread di rilevamento può eseguire immediatamente l'attività oppure posticipare l'esecuzione. In quest'ultimo caso, qualsiasi thread nel team può essere assegnato a . Il completamento dell'attività può essere garantito utilizzando i costrutti di sincronizzazione dell'attività . Un costrutto di attività può essere annidato all'interno di un'attività esterna , ma l'area di attività dell'attività interna non fa parte dell'area di attività dell'attività esterna.

(sottolineatura mia)

Il modo in cui ho letto questo: un singolo thread inizia l'esecuzione vostra sezione single. Raggiunge la direttiva task, a quel punto può decidere di eseguire l'attività stessa o assegnarla a un altro thread. Il problema si verifica quando decide di eseguire l'attività stessa - non ritorna mai.

Non sono del tutto sicuro del motivo per cui nel tuo esempio hai task/single. Che cosa si vuole fare sembra un caso per omp parallel sections invece:

int main() 
{ 
#pragma omp parallel sections num_threads(2) 
{ 
     #pragma omp section 
     { 
      while(true) 
      { 
      usleep(3e5); 
      #pragma omp critical (c_out) 
      std::cout<<"task1"<<std::endl; 
      } 
     } 
     #pragma omp section 
     { 
      while(true) 
      { 
      usleep(5e5); 
      #pragma omp critical (c_out) 
      std::cout<<"task2"<<std::endl; 
      } 
     } 
} 
} 
+0

ho pensato un compito OpenMP è sempre una sorta di "uova" o "forchetta" e il filo che ha incontrato questa operazione continua il suo lavoro. Ma mi sbagliavo. – martin7743

Problemi correlati