2013-05-19 1 views
2

저는 MPI_Isend 및 MPI_Recv 프로그램이 있습니다. 나는 2 개의 프로세서를 가지고 있고이 두 가지가 모두 이와 같다고 가정합니다.MPI_Recv가 차단되지 않습니다.

  1. MPI_Isend
  2. MPI_Recv
  3. MPI_Wait

내가 뭘 차단하지 않고 두 프로세서의 데이터를 전송하는이 기대. 그런 다음 데이터가 올 때까지 기다립니다. 그런 다음, 다시 시작하십시오. 1

  • 1 0
  • 0 전송에

    1. 0 1
    2. 1 0

    에서 수신하지만 내가 얻을 것이 이것이다에서 송수신합니다.

    1. 0 1
    2. 0 1에서 수신에 전송 (1 보내지 않았더라도!)
    3. 1 0 (지금은 전송)
    4. 1 0
    에서 수신에 전송

    나는 MPI_Recv가 데이터가 올 때까지 기다려야한다고 생각했다. 이것이 원인 일 수 있습니까?

  • 답변

    0

    MPI_Recv 블록입니다.

    표준 출력이 버퍼링되어 있고 모든 출력을 한 번에 볼 수 없기 때문에 메시지가 올바른 순서로 표시되지 않습니다.

    +0

    버퍼링되지 않은 출력을 볼 수있는 방법이 있습니까? – eakyurek

    +0

    각 인쇄 후에 명시 적으로 플러시 할 수는 있지만 설정에 따라 도움이되지 않을 수 있습니다 (이더넷 연결?). – ebo

    +0

    나는 그 설정에 대해 전혀 모른다, 그 학교 comp. 그러나 나는 홍조를 시도 할 것이다. 어쨌든 대답 주셔서 감사합니다. – eakyurek

    0

    출력을 수행하고 인터리브 된 MPI_Barrier을 사용하여 플러시 할 수 있습니다. 당신이 P 프로세스를 제공, 현재 프로세스의 순위가 변수 rank에 저장하고 의사 소통 comm를 사용하고, 당신은 할 수 있습니다 :

    for (int p = 0; p < P; ++p) 
    { 
        // Only one process writes at this time 
        // std::endl flushes the buffer 
        if (p == rank) 
         std::cout << "Message from process " << rank << std::endl; 
    
        // Block the other processes until the one that is writing 
        // flushes the buffer 
        MPI_Barrier(comm); 
    } 
    

    은 물론이 단지 C++ 예이다. 포트란의 C로 변환해야 할 수도 있습니다. 또한이 코드는 결과가 실제로 예상되는 것일 확률은 100 %로 보장하지 않지만 좋은 가능성이 있습니다.

    어쨌든 원칙적으로 항상 두 출력 작업 사이에 장벽을 추가하고 버퍼를 플러시하는 것이 원칙입니다.

    관련 문제