2017-02-06 8 views
1

내가 MPI 코드의 간단한 조각으로 몇 가지 이상한 행동을 알아 차리지있어 수신 :MPI_Recv 중지하는 동안 큰 배열

#include <mpi.h> 

int main(int argc, char* argv[]) 
{ 
    // Initialize the MPI environment 
    MPI_Init(NULL, NULL); 

    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 

    // We are assuming at least 2 processes for this task 
    if (world_size != 2) 
    { 
     std::cout << "World size must be equal to 1" << std::endl; 
     MPI_Abort(MPI_COMM_WORLD, 1); 
    } 

    int numberCounter = 10000; 
    double number[numberCounter]; 

    if (world_rank == 0) 
    { 
     std::cout << world_rank << std::endl; 
     MPI_Send(number, numberCounter, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); 
    } 
    else if (world_rank == 1) 
    { 
     std::cout << world_rank << std::endl; 
     MPI_Recv(number, numberCounter, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 

    MPI_Finalize(); 
} 

위의 미세 numberCounter가 작다는 사실을 제공하는 작품 (~ 1000). 그러나 값이 커지면 (> 10000) 코드가 멈추고 끝까지 도달하지 않습니다. MPI_Iprobe를 사용하면 순위 1이 메시지를 받았지만 MPI_Recv는 항상 정지한다는 플래그를 지정합니다.

이 문제의 원인은 무엇일까요? 다른 사람이이 동작을 재현 할 수 있습니까?

답변

0

2시 즉시 문제를 참조하십시오.

1) 상당히 큰 정적 배열을 사용하고 있습니다.

int numberCounter = 10000; 
int number[numberCounter]; 

시스템에 따라 스택 오버플로가 발생할 수 있습니다. Segmentation fault on large array sizes

동적 배열을 사용하십시오. C에는 mallocfree을 사용하십시오. C++에서 나는 newdelete이 MPI 기능과 잘 작동 할 것이라고 100 % 확신하지는 않지만 실제로 작동해야합니다. C++에서는 std :: vector와 같은 STL 컨테이너와 함께 작동하는 Boost MPI 라이브러리를 사용할 수도 있습니다. 는 MPI 기능이 MPI_DOUBLE 유형을 사용하도록 지시 반면 http://www.boost.org/doc/libs/1_62_0/doc/html/mpi.html

2) 전송 및 수신 버퍼 numberint 배열입니다.

는 MPI 형 배열 유형과 일치하므로 (doubleMPI_DOUBLE) 또는 (intMPI_INT)를 사용한다.

+0

현혹 된 코드 포스트에 대해 유감스럽게 생각합니다. 코드는 int가 아닌 double 배열을 사용합니다. 복사 및 붙여 넣기시에 뭔가 빠졌습니다. valgrind에서 메모리를 확인한 결과 괜찮습니다. – Firefly09