2011-11-15 19 views
7

Tengo un programa que usa el temporizador POSIX (timer_create()). Esencialmente, el programa establece un temporizador y comienza a realizar un cálculo largo (potencialmente infinito). Cuando el temporizador expira y se llama a un controlador de señal, el controlador imprime el mejor resultado que se haya calculado y abandona el programa.Manejo de señales en el programa paralelo OpenMP

Considero hacer el cálculo en paralelo usando OpenMP, porque debería acelerarlo.

En pthreads, hay funciones especiales, por ejemplo, para configurar las máscaras de señal para mis hilos más o menos. ¿OpenMP proporciona dicho control, o tengo que aceptar el hecho de que la señal se puede entregar a cualquiera de los hilos que OpenMP crea?

Además, en caso de que actualmente esté en una sección paralela de mi código y se llame a mi controlador, ¿puede todavía matar de forma segura la aplicación (exit(0);) y hacer cosas como bloquear bloqueos OpenMP?

+0

Tal vez, esto puede ser resuelto mediante el uso de un único bloque que atrapa la salida ? – Bort

+0

La especificación OpenMP no contiene la palabra "señal". – jfs

Respuesta

2

El estándar OpenMP 3.1 no dice nada sobre las señales.

Como sé, cada implementación popular de OpenMP en Linux/UNIX se basa en pthreads, por lo que el hilo de OpenMP es el hilo de pthread. Y se aplican las reglas genéricas de pthreads y señales.

¿El OpenMP proporcionan tal control

Sin ningún tipo de control específico; pero puedes intentar usar el control de pthread. El único problema es saber cuánto se utilizan los hilos OpenMP y dónde colocar la declaración de control.

la señal se puede entregar a cualquiera de los subprocesos que OpenMP crea?

De manera predeterminada, sí, se entregará a cualquier hilo.

mi gestor se llama,

reglas habituales sobre manejador de la señal sigue siendo válida. Las funciones permitidas en el manejador de señal se enumeran en http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html (al final de la página)

Y printf no está permitido (write es). Puede usar printf si sabe que en el momento de la impresión de la señal no se utiliza ningún hilo (por ejemplo, no tiene printf en la región paralela).

puede todavía matar con seguridad la aplicación (salida (0);)

Sí se puede: abort() y _exit() se permiten desde el manejador.

Linux/Unix terminará todos los hilos cuando cualquier hilo lo haga exit o abort.

y hacer cosas como bloqueo de cerraduras OpenMP?

No debe hacerlo, pero si sabe que este bloqueo no se bloqueará en el momento de la ejecución del manejador de señal, puede intentar hacerlo.

!! ACTUALIZAR

Hay un ejemplo de adopción de señalización para OpenMP http://www.cs.colostate.edu/~cs675/OpenMPvsThreads.pdf ("OpenMP versus Threading en C/C++"). En resumen: configure una bandera en el controlador y agregue verificaciones de esta bandera en cada hilo en cada enésima repetición de bucle.

la adaptación de un mecanismo de excepción basada señal a una región paralela

algo que ocurre más con C/++ aplicaciones C que con las aplicaciones Fortran es que el programa utiliza una interfaz de usuario sofisticada. Genehunter es un ejemplo simple donde el usuario puede interrumpir el cálculo de un árbol genealógico al presionar Control-C para que pueda continuar con el siguiente árbol genealógico en una base de datos clínica sobre la enfermedad . La terminación prematura se maneja en la versión en serie mediante un mecanismo de excepción de C++ mecanismo que implica un manejador de señal, salto de línea, y salto largo.OpenMP no permite el flujo de control no estructurado para cruzar un límite de construcción paralelo. Nosotros modificamos el manejo de excepciones en la versión OpenMP cambiando el manejador de interrupciones a un mecanismo de sondeo . El hilo que capta la señal de control C de establece un indicador compartido. Todos los hilos comprueban el indicador al principio del ciclo llamando a la rutina has_hit_interrupt() y omiten la iteración si está configurada. Cuando los extremos de bucle , el maestro comprueba el indicador y fácilmente pueden ejecutar el longjump para completar la salida excepcional (Ver Figura 1.)

Cuestiones relacionadas