2015-01-18 3 views
2

신호가 safely 및 MPI 응용 프로그램에서 처리 될 수있는 방법 (예 : 응용 프로그램에 런타임이 만료되어 다음 10 분 이내에 종료되어야한다고 알리는 SIGUSR1) 몇 가지 있습니다 제약 조건 :MPI 응용 프로그램에서 신호 처리/정상 종료

  • 응용 프로그램을 종료하기 전에 모든 병렬/직렬 IO를 완료하십시오! 응용 프로그램이 문제

어떻게하지 않고 종료 할 수있는 모든 다른 상황에서

  • 이는 종료하려고 제대로 현재 컨텍스트 main() 다시 점프와 MPI_FINALIZE()를 호출을 유지하면서 안전하게에는 교착 상태를 달성 할 수 없다? 어쨌든 프로세스가 종료 될 때까지 기다려야합니다 (멀티 스레드 응용 프로그램에서는 동일하다고 생각합니다).하지만 많은 정보를 전달하지 않고도 효율적으로 처리하는 방법은 무엇입니까? 아무도이 일을 올바르게하는 몇 가지 방법을 알고 있습니까? (
    우리가 신호 처리기에서 신호를 잡아와 "처리되지 않은 신호 스택"에 밀어 각 프로세스에 대해 말할 수 있습니다 :

    아이디어 1 :

    다음은 또는 작동하지 않을 수있는 몇 가지 생각입니다 USS) 우리는 단순히 시그널 핸들러 루틴에서 돌아온다. 그런 다음 IO 작업 전후에 특정 응용 프로그램 종료 지점이 생기며 USS의 모든 신호를 처리합니다. 예를 들어 USS에 SIGUSR1이있는 경우 각 프로세스는 종료 지점에서 종료됩니다.

    • 이 아이디어는 과정이 이미이 점을 통과하고 지금 병렬 IO를 시작하는 동안 처리 한 단지, ​​종료 지점을 befor singnal 잡기, 여전히 교착 상태가 될 수 있다는 문제가있다. 신호에
      만 마스터 프로세스 0 어획량 신호 : 공정 2에서 교착 상태에 결과 1 종료 할 프로세스는

    ... 아이디어 2 (종료 IO에 대한 공정 1 대기) 처리기는 다음 브로드 캐스트 메시지를 보냅니다. "모든 프로세스가 종료되었습니다!" 응용 프로그램의 특정 지점에서 모든 프로세스가 브로드 캐스트를 수신하고 mainMPI_FINALIZE에 catch 된 예외가 호출됩니다.

    • 출구 안전하게 발생이 방법하지만, 우리가 종료해야합니다 있는지 확인하기 위해 지속적으로 브로드 캐스트 메시지를 수신해야하는 비용 여부에 대한

    고마워요!

  • 답변

    1

    모든 프로세스를 같은 지점에서 중지하는 것이 목표라면 가능한 종료 지점에서 항상 동기화하는 방법이 없습니다. 즉, 종단점에서의 공동 호출이 필요합니다.

    물론 다른 공동 콜의 동기화를 사용하여 적절한 종료를 보장하거나 기존 방송에서 종단 정보를 피킹 할 수는 있지만 그만한 가치는 있다고 생각하지 않을 수 있습니다. 결국 I/O 전에 동기화하고 10 분에 한 번 이상 동기화하면됩니다. 그러한 빈도로 방송이라 할지라도 성능상의 문제는 아닙니다.

    0

    일반적으로 MPI 응용 프로그램의 신호를 사용하는 것은 안전하지 않습니다.일부 구현은이를 지원할 수도 있고 그렇지 않을 수도 있습니다.

    예를 들어, MPICH에서 SIGUSR1은 비정상 실패의 내부 통지를 위해 프로세스 관리자가 사용합니다. 다른 한편으로

    http://lists.mpich.org/pipermail/discuss/2014-October/003242.html

    열기 MPI는 다른 프로세스에 mpiexec에서 SIGUSR1SIGUSR2을 전달합니다했다.

    http://www.open-mpi.org/doc/v1.6/man1/mpirun.1.php#sect14

    다른 구현과 다를 것이다. 따라서이 경로를 지나기 전에 사용중인 구현이이를 처리 할 수 ​​있는지 확인하십시오.

    관련 문제