2011-12-12 5 views
6

Ho un OpenMP con programma C++. Ci sono regioni parallele che contengono #pragma omp task all'interno di una regione parallela. Ora, vorrei sapere come terminare la regione parallela a seconda di una condizione in cui uno qualsiasi dei thread in esecuzione si incontra.Come si termina condizionatamente un'area parallela in OpenMP?

#pragma omp parallel 
{ 
#pragma omp task 
{ 
    //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region) 
} 

} 

risposta

5

Non è possibile terminare prematuramente un costrutto parallelo. OpenMP non ha costrutto per questo e specifica che le regioni parallele possono avere solo un punto di uscita (quindi nessuna ramificazione fuori dalla regione ...).

Penso che l'unico modo (sano e portatile) per ottenere ciò sia di avere una variabile che indica se il lavoro è finito e che i thread controllano quella variabile regolarmente (usando le istruzioni atomiche e/o gli svuotamenti per assicurare la visibilità corretta) . Se la variabile indica che il lavoro è stato fatto, i thread possono saltare il lavoro rimanente (mettendo il lavoro rimanente in un corpo di if che non è ramificato in se il lavoro è fatto).

Potrebbe essere possibile scrivere codice specifico del sistema, che sospende gli altri thread e li imposta alla fine del blocco (ad esempio, manipolando stack e istruzionipoint ...) ma ciò non sembra molto consigliabile (il che significa che probabilmente è molto fragile).

Se ci diresti qualcosa di più su ciò che stai cercando di fare (e perché ne hai bisogno), potrebbe essere più semplice aiutarti (ad esempio facendo un disegno che non ha bisogno di farlo) .