2011-11-16 2 views
1

MPI 사양은 종료하기 전에 각 스레드에서 MPI_Finalize을 호출하도록 지정합니다. 어설 션과 같은 런타임 오류와 함께 어떻게 작동합니까?MPI_Finalize 및 단정?

assert(cond)cond이 false로 평가되면 정상 프로그램 흐름이 변경되므로 MPI_Finalize으로 전화 할 기회가 없습니다. 내가 SIGABRT, SIGSEGV 및 god-knows-what-else를 잡아야합니까? 아니면 MPI 라이브러리가 어떻게 든 이것을 처리합니까?

+0

나는 assert가 단순히 프로그램을 죽인다 고 가정한다. 쓰레드 제거는 lamhalt를 통해 스스로 호출되어야합니다. 하지만 이것은 단지 추측입니다. MPI_Finalze 등을 호출하기 위해 assert 대신 적절한 에러 핸들링을 사용해야합니다. – Bort

답변

1

어설 션 후 MPI_Finalize를 호출하는 자신의 assert 버전을 작성하십시오.

#define MY_ASSERT(cond) do { \ 
    if (!cond) { \ 
     printf ("Assert (%s) failed at %s:%d\n", #cond, __FILE__, __LINE__); \ 
     MPI_finalize(); \ 
    } \ 
} while (0); 

작업의 다른 MPI 프로세스도 마무리에 도달해야합니다.

+0

그게 해결 방법입니다, 나는 당신에게 이것을 주지만, 모든 것을 죽이지는 않기 때문에 assert처럼 행동하지 않습니다; 좋아, 당신의 솔루션은 실제로'stderr'와'exit (1)'에'MPI_Finalize()'후에 쓸 수 있지만 여러분이 말한 것처럼 다른 프로세스들도'SIGABRT '하지 않습니다. 이 표준 문제에 대한 표준 해결책이 있어야합니다. – bitmask

관련 문제