2013-02-28 6 views
1

나는 주변을 둘러 보았지만이 문제에 대한 참조를 찾을 수 없었다.부스트 테스트 유닛이 mpi 함수를 호출 할 수 없음

나는 boost/unit으로 테스트하고있는 C++ 프로그램을 작성했습니다. 시리얼 버전이 잘 작동하고 단위 테스트가 작동합니다.
이제 저는 MPI와 당황스럽게 평행하게 일하는 기능을 통해 프로그램을 병렬로 만들었습니다. 병렬 함수를 호출하는 자체 테스트를 적어 두었다면 parafunction이라고 부르 자. MPI가 잘 작동하고있다.
컴파일은 mpiC++로 수행되며 mpixec을 사용하여 프로그램을 실행합니다.

그러나 부스트 테스트 케이스에서 parafunction을 호출하면 MPI가 모두 잘못되어 테스트가 여러 번 시작되고 여러 MPI::Init이 호출되면 프로세스가 중단됩니다. 여기에 내가 오류의 예입니다 MPI_FINALIZE가 호출 된 후 MPI_comm_size() 함수가 호출

.

이것은 MPI 표준에 의해 허용되지 않습니다.

MPI 작업이 중단됩니다.

내 테스트 사례가 test_unit에 있고, master_test_suite가 자동으로 처리합니다. 내가 병렬 처리없이 말했듯이 그것은 완벽하게 잘 작동합니다.

Parafunction은 MPI::InitMPI::Finalize을 호출하며 MPI 관련 작업은 파일의 다른 기능으로 수행되지 않습니다.

누구도 전에 비슷한 문제가 발생 했습니까?

내 테스트를 실행하면 꽤 길기 때문에 실제로 프로그램의 병렬 버전을 사용할 수 있습니다! MPI는 프로그램의 수명 동안 한 번 초기화 할 수 있으며 한 번만 완료 할 수 있기 때문에 다음 처음 상태 모두가 한 번만 호출 할 수 있습니다 확정 당신의 도움이

+0

parafunction을 호출하는 대신 BOOST_AUTO_TEST_CASE 내에서 모든 병렬 처리를 수행하면 동일한 문제가 발생합니다 ... –

답변

1

함수에 대한

감사합니다. 여러 초기화 호출을 방지하기 위해, 조건에 MPI_Init() 또는 MPI_Init_thread()에 전화를 넣어 :

종결에 관해서는
int already_initialised; 

MPI_Initialized(&already_initialised); 
if (!already_initialised) 
    MPI_Init(NULL, NULL); 

, 그것은 아마 atexit(3) 핸들러에서, 함수의 외부 이동해야 당신이하지 않으면 MPI 호출로 외부 범위를 오염시키고 싶습니다. 예를 들어 :

void finalise_mpi(void) 
{ 
    int already_finalised; 

    MPI_Finalized(&already_finalised); 
    if (!already_finalised) 
     MPI_Finalize(); 
} 

... 
atexit(finalise_mpi); 
... 

atexit() 호출은 MPI가 이미 초기화 된 경우는 atexit(3) 처리기를 설치하지 않을 초기화 코드의 일부, 예컨대 :

int already_initialised; 

MPI_Initialized(&already_initialised); 
if (!already_initialised) 
{ 
    MPI_Init(NULL, NULL); 
    atexit(finalise_mpi); 
} 

수 있습니다. 기본 개념은 MPI가 함수에 진입 할 때 초기화되면 외부 범위에서 MPI_Init()이 호출되었고 일반적으로 MPI_Finalize()이 호출되기를 기대한다는 것을 의미합니다.

내가 너라면, MPI 초기화 및 마무리 작업을 병렬 처리 기능 밖으로 옮길 것입니다.적절한 호출 순서는 MPI를 초기화하고 테스트를 실행 한 다음 MPI를 마무리하는 것입니다.

C++ 바인딩이 MPI-2.2에서 사용되지 않으며 MPI-3.0에서 삭제됨에 따라 위의 텍스트에서 C 바인딩을 사용했습니다.