2011-11-15 2 views
7

POSIX 타이머 (timer_create())를 사용하는 프로그램이 있습니다. 본질적으로 프로그램은 타이머를 설정하고 길고 (잠재적으로 무한한) 계산을 시작합니다. 타이머가 만료되고 신호 처리기가 호출되면 처리기는 아직 계산되어 프로그램을 종료 한 최상의 결과를 인쇄합니다.OpenMP 병렬 프로그램의 신호 처리

OpenMP를 사용하여 계산을 병렬로 수행하는 것이 속도가 빨라지므로이를 고려해야합니다.

pthreads에는 내 스레드에 대한 신호 마스크를 설정하는 특수 기능이 있습니다. OpenMP가 이러한 제어 기능을 제공합니까? 아니면 OpenMP가 생성 한 스레드에 신호를 전달할 수 있다는 사실을 받아 들여야합니까?

또한 현재 코드의 병렬 섹션에 있고 처리기가 호출 된 경우에도 안전하게 응용 프로그램 (exit(0);)을 종료하고 OpenMP 잠금을 잠그는 것과 같은 작업을 수행 할 수 있습니까?

+0

아마도,이 출구를 잡는 하나의 블록을 사용하여 해결 될 수있다 (도 1 참조) ? – Bort

+0

OpenMP 사양에 "signal"이라는 단어가 없습니다. – jfs

답변

2

OpenMP 3.1 표준은 신호에 대해 아무 말도하지 않습니다.

제가 알고 있듯이 Linux/UNIX에서 널리 사용되는 모든 OpenMP 구현은 pthreads를 기반으로하므로 OpenMP 스레드는 pthread의 스레드입니다. pthreads 및 신호의 일반적인 규칙이 적용됩니다.

합니까 OpenMP는 이러한 제어를

없음 특정 제어를 제공; pthread의 컨트롤을 사용하려고 할 수 있습니다. 문제는 OpenMP 스레드의 사용량과 제어문의 위치를 ​​파악하는 것입니다.

OpenMP가 생성하는 스레드에 신호를 전달할 수 있습니까?

기본적으로 네, 모든 스레드에 전달됩니다. 신호 처리기에 대한

내 핸들러가 호출 될 때,

일반적인 규칙은 여전히 ​​적용됩니다. 신호 처리기에서 허용되는 함수는 http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html (페이지 끝)에 나열됩니다.

printf은 허용되지 않습니다 (write). printf를 사용할 수 있습니다. 시그널 printf가 어떤 쓰레드에서도 사용되지 않는다는 것을 안다면 (예를 들어 병렬 영역에 printf가 없다). abort()_exit() 핸들러에서 사용할 수 있습니다 : 네, 할 수는

(출구 (0))

는 여전히 안전하게 응용 프로그램을 죽일 수 있습니다.

임의의 스레드가 exit 또는 abort 일 때 Linux/Unix가 모든 스레드를 종료합니다.

OpenMP 잠금을 잠그는 것과 같은 작업을 수행합니까?

신호 처리기 실행시이 잠금이 잠기지 않는다는 것을 알고 있다면이를 시도 할 수 있습니다.

!! 업데이트

OpenMP http://www.cs.colostate.edu/~cs675/OpenMPvsThreads.pdf ("OpenMP 대 C/C++의 스레딩")에 시그널링을 채택하는 예제가 있습니다. 즉, 핸들러에 플래그를 설정하고 매 N 번째 루프 반복마다 모든 스레드에서이 플래그의 검사를 추가합니다. 병렬 영역보다 포트란 애플리케이션 프로그램은 복잡한 사용자 인터페이스를 사용한다는 것이다 C/C++ 애플리케이션 발생

뭔가 신호 기반 예외기구 적응

. Genehunter는 사용자가 질병에 대한 임상 데이터베이스의 다음 패밀리 트리로 이동할 수 있도록 control-C를 눌러 하나의 패밀리 트리 의 계산을 방해 할 수있는 간단한 예입니다. 조기 종료는 에서 처리됩니다.신호 처리기 인 setjump, 이 포함 된 메커니즘과 같은 예외가 있습니다. longjump.OpenMP는 구조화되지 않은 컨트롤 흐름이 병렬 구조 경계를 통과하도록 허용하지 않습니다. 은 폴링 메커니즘으로 인터럽트 처리기를 변경하여 OpenMP 버전에서 예외 처리를 수정했습니다. control-C 신호를 수신하는 스레드는 공유 플래그를 설정합니다. 모든 스레드 루프의 시작 부분에있는 플래그를 으로 확인하여 has_hit_interrupt() 루틴을 호출하고 반복이 생략되면 건너 뜁니다. 루프 단부는, 마스터 플래그를 확인하고 쉽게 우수한 이탈을 완료하는 롱 점프를 수행 할 때