niestandardowy program obsługi przerwań dla mpirun

Widocznie,mpirun używa procedury obsługi SIGINT, która „przesyła” sygnał SIGINT do każdego z procesów, które wywołał.

Oznacza to, że możesz napisać program obsługi przerwań dla kodu obsługującego mpi, wykonaćmpirun -np 3 my-mpi-enabled-executable a następnie SIGINT zostanie podniesiony dla każdego z trzech procesów. Wkrótce potem mpirun wychodzi. Działa to dobrze, gdy masz mały niestandardowy program obsługi, który drukuje tylko komunikat o błędzie, a następnie kończy działanie.jednak, gdy twój niestandardowy program obsługi przerwań wykonuje nietrywialne zadanie (np. wykonuje poważne obliczenia lub trwające dane), procedura obsługi nie działa do końca. Zakładam, że to dlatego, że mpirun postanowił wyjść za wcześnie.

Oto stderr po naciśnięciuctrl-c (tzn. powodując SIGINT) po wykonaniumy-mpi-enabled-executable. Jest to pożądane oczekiwane zachowanie:

interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.

Oto stderr po naciśnięciuctrl-c po wykonaniumpirun -np 1 my-mpi-enabled-executable. To jest problematyczne zachowanie:

interrupted by signal 2.
running viterbi... mpirun: killing job...

--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 8970 on node pharaoh exited on signal 0 (Unknown signal 0).
--------------------------------------------------------------------------
mpirun: clean termination accomplished

Odpowiadanie na dowolne z następujących pytań rozwiąże mój problem:

Jak zastąpić obsługę SIGINT mpirun (jeśli w ogóle jest to możliwe)?Jak uniknąć zakończenia procesów wywoływanych przez mpirun zaraz po zakończeniu mpirun?Czy istnieje inny sygnał, który mpirun może wysyłać do procesów potomnych przed zakończeniem mpirun?Czy istnieje sposób „przechwycenia” tak zwanego „sygnału 0 (Nieznany sygnał 0)” (patrz drugi stderr powyżej)?

Używam openmpi-1.6.3 na Linuksie.

questionAnswers(2)

yourAnswerToTheQuestion