2017-05-02 3 views
0

이 간단한 MPI 예제를 함께 던졌습니다. 테스트 주위에 이상한 행동을보고 있어요 :: mpi :: 요청을 설명 할 수 없습니다. 특히, 두 번째 루프에서 주석을 제거하면 영구히 회전합니다. boost :: mpi :: 요청 테스트는 true를 한 번만 리턴합니까? 그렇다면 어떤 상태의 비트가 업데이트되고 있습니까? 나는 Boost의 MPI와 선택적 코드를 뚫고 보았고 나는 내가보고있는 것을 설명 할 수 없다.boost :: mpi :: request에 대해 누락 된 점은 무엇입니까? 테스트가 상태를 변경하는 것 같습니다

는 (당연히 미숙를 들어, 당신이 스스로를 실행하는 두 개의 노드로 mpiexec 사용해야합니다.)

# include "stdafx.h" 
# include <boost/serialization/string.hpp> 
# include <boost/mpi.hpp> 
# include <windows.h> 
# include <iostream> 
# include <boost/mpi.hpp> 
# include <boost/optional.hpp> 

int main(int argc, char *argv[]); 

int main(int argc, char *argv[]) 

{ 
    boost::mpi::environment m_env; 
    boost::mpi::communicator m_world; 

    if (m_world.rank() == 0) 
    { 
     m_world.send(1,0, std::string("hi!")); 
    } 
    else 
    { 

     std::shared_ptr<std::string> rcv = std::shared_ptr<std::string>(new std::string()); 
     boost::mpi::request x = m_world.irecv(0, 0, *rcv); 
     while (!x.test()) 
     { 
      Sleep(10); 
     } 
     //while (!x.test()) 
     //{ 
     // Sleep(10); 
     //} 
     std::cout << *rcv; 
    } 
} 

답변

1

대답은 종류의 문서에 있습니다

/** 
    * Determine whether the communication associated with this request 
    * has completed successfully. If so, returns the @c status object 
    * describing the communication. Otherwise, returns an empty @c 
    * optional<> to indicate that the communication has not completed 
    * yet. Note that once @c test() returns a @c status object, the 
    * request has completed and @c wait() should not be called. 
    */ 
    optional<status> test(); 

그런 다음 docs for the underlying MPI_Test function보고 :

MPI_TEST에 대한 호출이 플래그를 반환 = 사실 요청에 의해 식별 작업이 완료됩니다. 이 경우 상태 객체는 완료된 작업에 대한 정보를 포함하도록 설정됩니다. 통신 개체가 비 블로킹 보내기 또는 수신에 의해 생성 된 경우 할당이 해제되고 요청 핸들이 MPI_REQUEST_NULL로 설정됩니다.

null 또는 비활성 요청 인수로 MPI_TEST를 호출 할 수 있습니다. 이 경우 작업은 flag = true 및 빈 상태로 반환됩니다.

그래서 우리가 볼 것은 MPI의 test() 방법은 optional<status> 반환 부스트, 그리고 MPI_Test()는 (그 후, 요청이 파괴)를 한 번 상태를 반환 할 수 있습니다. MPI_Test()이 반복적으로 호출되면 flag = true을 반환하지만 확인하지는 않습니다. 이 패턴이 정말로 필요한 경우 MPI_Test()으로 전화를 걸어 상태 대신 반환 된 플래그를 사용할 수 있습니다. 또는 귀하의 신청서에서 부기를 수행하고 동일한 요청으로 boost::mpi::request::test() 번을 두 번 호출하지 마십시오.

이 문제를 바라 보는 또 다른 방법은 당신이 당신이 MPI_Test()flag처럼 작동 할 것으로 예상 부울 컨텍스트에 test()의 결과를 사용하고 있지만, 실제로는 status처럼 작동하고 부울 특성이 있다는 것이다 단지 환상.

+0

그래, 내가 그 일을 끝냈다. 내 자신의 bool을 bookkeping하는 것이다. 기본 MPI_TEST를 고려하지 않았습니다. - 감사합니다. – Carbon

1

이는 MPI 표준과 일치한다. MPI_TEST이 작업이 완료되었음을 나타내면 반환 된 상태 개체에는 완료된 작업에 대한 정보가 포함되고 작업 개체 자체는 비활성 또는 할당 취소 된 것으로 적용됩니다. 해당 조작 오브젝트에 대해 MPI_TEST를 다시 호출하면 빈 상태가 리턴됩니다.

MPI 표준 (최신 버전)은 비파괴적인 방식으로 상태에 액세스하는 방법을 제공합니다 (MPI_REQUEST_GET_STATUS).

부스트에서이 작업의 구현을 알지 못했지만 반환 된 status 개체를 저장할 수 있으며 나중에 test을 호출하는 대신 나중에 참조 할 수 있습니다.