2011-12-12 6 views
6

Tengo un programa OpenMP con C++. Hay regiones paralelas que contienen #pragma omp task dentro de una región paralela. Ahora, me gustaría saber cómo finalizar la región paralela dependiendo de una condición que coincida con cualquiera de los subprocesos en ejecución.¿Cómo termino condicionalmente una región paralela en 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) 
} 

} 

Respuesta

5

No se puede terminar una construcción en paralelo prematuramente. OpenMP no tiene una construcción para esto y especifica que las regiones paralelas pueden tener solo un punto de salida (por lo que no hay ramificación fuera de la región ...).

Creo que la única forma (lógica y portátil) de lograr eso es tener una variable que indique si el trabajo está terminado y hacer que los hilos revisen esa variable regularmente (usando instrucciones atómicas y/o colores para garantizar la visibilidad correcta) . Si la variable indica que el trabajo está hecho, los hilos pueden omitir el trabajo restante (colocando el trabajo restante en un cuerpo if que no está ramificado si el trabajo está hecho).

Podría ser posible escribir código específico del sistema, que suspende los otros hilos y los pone al final del bloque (por ejemplo, manipular la pila y los indicadores de instrucción ...) pero eso no parece muy aconsejable (lo que significa que probablemente muy frágil).

Si nos diga un poco más sobre lo que está tratando de hacer (y por qué necesita esto), podría ser más fácil ayudarle (por ejemplo, al proponer un diseño que no necesita hacer esto) .