2011-11-15 16 views
7

Ho un programma che utilizza il timer POSIX (timer_create()). In sostanza, il programma imposta un timer e inizia a eseguire calcoli lunghi (potenzialmente infiniti). Quando il timer scade e viene chiamato un gestore di segnale, il gestore stampa il risultato migliore ancora calcolato e chiude il programma.Gestione del segnale nel programma parallelo OpenMP

Considero di eseguire il calcolo in parallelo utilizzando OpenMP, perché dovrebbe accelerarlo.

In pthreads, ci sono funzioni speciali ad esempio per l'impostazione di maschere di segnale per i miei thread o così. OpenMP fornisce tale controllo o devo accettare il fatto che il segnale può essere consegnato a uno qualsiasi dei thread creati da OpenMP?

Inoltre, nel caso in cui io sia attualmente in una sezione parallela del mio codice e il mio gestore venga chiamato, può comunque uccidere tranquillamente l'applicazione (exit(0);) e fare cose come bloccare i blocchi OpenMP?

+0

Forse, questo può essere risolto utilizzando un unico blocco che cattura l'uscita ? – Bort

+0

La specifica OpenMP non contiene la parola "segnale". – jfs

risposta

2

Lo standard OpenMP 3.1 non dice nulla sui segnali.

Come noto, ogni implementazione OpenMP popolare su Linux/UNIX è basata su pthreads, quindi il thread OpenMP è il thread di pthread. E si applicano regole generiche di pthread e segnali.

fa OpenMP fornire tale controllo

Nessun alcun controllo specifico; ma puoi provare a usare il controllo di pthread. L'unico problema è sapere quanta thread OpenMP sono usati e dove posizionare la dichiarazione di controllo.

il segnale può essere consegnato a uno qualsiasi dei thread creati da OpenMP?

Per impostazione predefinita, sì, verrà consegnato a qualsiasi thread.

mio gestore è chiamato,

regole usuali circa gestore di segnale si applica ancora. Le funzioni consentite nel gestore di segnale sono elencate a http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html (alla fine della pagina)

E printf non è consentito (write è). Puoi usare printf se sai che al momento del segnale printf non è usato da nessun thread (ad esempio non hai printf nella regione parallela).

può ancora uccidere in modo sicuro l'applicazione (uscita (0);)

Sì, è possibile: abort() e _exit() sono ammessi dal gestore.

Linux/Unix interromperà tutti i thread quando qualsiasi thread fa exit o abort.

e fare cose come bloccare i lucchetti OpenMP?

Non si dovrebbe, ma se si sa che questo blocco non sarà bloccato al momento dell'esecuzione del gestore di segnale, si può provare a farlo.

!! UPDATE

C'è un esempio di adozione di segnalazione per OpenMP http://www.cs.colostate.edu/~cs675/OpenMPvsThreads.pdf ("OpenMP versus Threading in C/C++"). In breve: imposta un flag nel gestore e aggiungi controlli di questo flag in ogni thread ad ogni ennesima iterazione del ciclo.

Adattamento meccanismo eccezione segnale in base ad una regione parallela

Qualcosa che si verifica più con C/C++ applicazioni con applicazioni Fortran è che il programma utilizza una sofisticata interfaccia utente. Genehunter è un semplice esempio in cui l'utente può interrompere il calcolo di un albero genealogico premendo control-C in modo che possa passare al prossimo albero genealogico in un database clinico sulla malattia . La terminazione prematura viene gestita nella versione seriale da un C++ come eccezione meccanismo che coinvolge un gestore di segnale, setjump, e longjump.OpenMP non consente il flusso non strutturato del controllo per attraversare un limite di costrutto parallelo. Abbiamo modificato la gestione delle eccezioni nella versione OpenMP modificando il gestore di interrupt in un meccanismo di polling . Il thread che intercetta il segnale control-C imposta un flag condiviso. Tutti i thread controllano la flag all'inizio del loop di chiamando la routine has_hit_interrupt() e salta l'iterazione se è impostata. Quando le estremità ciclo , il master controlla il flag e possono facilmente eseguire la LongJump per completare la uscita eccezionale (Vedi Figura 1.)

Problemi correlati