2016-11-24 2 views
1

작업자 순위 (순위! = 0)로 MPI_Send 호출이 여러 개 생성되고 마스터 순위 (순위 == 0)가 이들 모두를 수신하는 MPI 프로그램이 있습니다. 메시지. 그러나 MPI_Recv - MPI_Recv (...)에서 치명적인 오류가 발생하여 메모리가 부족합니다. 난 단지 2 프로세스로 실행하면MPI_Send 호출이 누적되었을 때 MPI_Recv가 실패하는 이유

mpiexec -n 3 MPIHelloWorld.exe

int main(int argc, char* argv[]){ 
    int numprocs, rank, namelen, num_threads, thread_id; 
    char processor_name[MPI_MAX_PROCESSOR_NAME]; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Get_processor_name(processor_name, &namelen); 

    if(rank == 0){ 
     for(int k=1; k<numprocs; k++){ 
      for(int i=0; i<1000000; i++){ 
       double x; 
       MPI_Recv(&x, 1, MPI_DOUBLE, k, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      } 
     } 
    } 
    else{ 
     for(int i=0; i<1000000; i++){ 
      double x = 5; 
      MPI_Send(&x, 1, MPI_DOUBLE, 0, i, MPI_COMM_WORLD); 
     } 
    } 
} 

: 여기

내가과 같이 실행 파일을 실행 나는 Visual Studio 2010에서 Visual Studio 2010을 에서 컴파일하고 코드입니다 , 프로그램이 중단되지 않습니다. 따라서 문제는 세 번째 순위 (일명 두 번째 작업자 노드)에서 MPI_Send 호출이 누적되었을 때인 것처럼 보입니다.

반복 횟수를 100,000으로 줄이면 충돌없이 3 개의 프로세스로 실행할 수 있습니다. 그러나 1 백만 번의 반복으로 전송되는 데이터의 양은 8MB (이중 * 1000000 반복의 경우 8 바이트)이므로 "Out of Memory"가 RAM과 같은 실제 메모리를 언급하지는 않는다고 생각합니다.

아무런 통찰력을 주셔서 감사합니다.

+0

해당 질문에 대해서는 사용중인 MPI 구현과 구성을 아는 것이 매우 중요합니다. – Zulan

+0

Windows 7에서 MS-MPI v 7.1 사용 –

답변

0

MPI_send 작업은 데이터를 system buffer 보낼 준비가되었습니다. 이 버퍼의 크기와 저장 위치는 implementation specific입니다 (이것은 인터커넥트에있을 수도 있음을 기억합니다). 필자의 경우 (mpich가있는 linux) 나는 메모리 오류를 내지 않는다. 이 버퍼를 명시 적으로 변경하는 한 가지 방법은 MPI_buffer_attachMPI_Bsend과 함께 사용하는 것입니다. 시스템 버퍼 크기를 변경하는 방법이있을 수도 있습니다 (예 : MP_BUFFER_MEM IBM 시스템의 시스템 변수).

그러나 이러한 예기치 않은 메시지는 실제로 발생하지 않아야합니다. 위 예제에서 ki 루프 순서를 바꿔서 이러한 메시지가 생성되지 않도록 할 수 있습니다.

+0

시스템 버퍼에 대한 정보를 보내 주셔서 감사합니다. 그러나 k와 i 루프의 순서를 바꾸려고 시도했지만 프로그램의 동작은 동일하게 유지되었습니다. –

+0

여기에서 https://technet.microsoft.com/en-us/library/gg243459(v=ws.11).aspx#MSMPI MS-MPI는 시스템 버퍼 크기 설정에 대한 어떠한 제어도 제공하지 않는 것 같습니다. –

관련 문제