2017-02-17 1 views
0

아래 코드에서 프로브하는 동안 정확한 도착 수를 얻을 수 없습니다. 동일한 기능이 표준 MPI 기능으로 테스트되고 정답이 얻어집니다. Boost 버전이 올바른 결과를 내지 않는 이유는 무엇입니까?boost :: iprobe가 올바른 수를 반환하지 않습니다.

부스트 버전 :

#include <iostream> 
#include <boost/mpi.hpp> 

using namespace boost; 
using namespace boost::mpi; 

int main() 
{ 
    environment env; 
    communicator world; 

    if (world.rank() == 0) 
    { 
     int a[70]; 

     auto req = world.isend(0, 0, a); 
     //req.wait(); // does not make any difference on the result. 

     optional<status> stat; 
     while (!stat) 
     { 
      stat = world.iprobe(0, 0); 

      if (stat) 
      { 
       optional<int> count = (*stat).count<int>(); 

       if (count) 
       { 
        std::cout << *count << std::endl; // output: 2, expected: 70. 
       } 
      } 
     } 
    } 

    return 0; 
} 

표준 버전 :

#include <iostream> 
#include <mpi.h> 

int main() 
{ 
    MPI_Init(NULL, NULL); 

    int rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (rank == 0) 
    { 
     int a[70];    

     MPI_Request req; 
     MPI_Status stat; 

     MPI_Isend(a, 70, MPI_INT, 0, 0, MPI_COMM_WORLD, &req); 
     //MPI_Wait(&req, &stat); 

     int flag; 
     MPI_Iprobe(0, 0, MPI_COMM_WORLD, &flag, &stat); 
     if (flag) 
     { 
      int count; 
      MPI_Get_count(&stat, MPI_INT, &count); 
      std::cout << count << std::endl; // output: 70. 
     } 
    } 

    MPI_Finalize(); 

    return 0; 
} 

편집 :isend(dest, tag, values, n) 대신 isend(dest, tag, values) 사용은 n가의 요소 수는 정답을 준 정렬.

답변

1

귀하의 부스트 버전은 실제로는을 전송하지만 70 int은 보내지 않습니다. Boost의 경우이 유형은 MPI 데이터 유형이 아니므로 올바른 (*stat).count<decltype(a)>();은 빈 옵션을 반환합니다.

이제 documentation 조금 오해 :

타입 T 즉, is_mpi_datatype<T>mpl::true_를 유도해야 관련된 데이터 유형을 가져야한다. 유형 T이 전송 된 유형과 일치하지 않는 경우,이 루틴은 빈 optional<int>을 리턴합니다.

내가 대신 T가 전송 된 유형과 일치하지 않는 경우에, 당신은 가짜 결과 또는 빈 optional<int> 중 하나를 얻을 것으로 보인다. mpi 데이터 유형이 아닌 경우 비어있는 optional<int>이 표시됩니다.

2를 얻는 이유는 Boost.MPI가 각 비 MPI 데이터 유형 메시지에 대해 2 개의 메시지를 전송한다는 것입니다. 하나는 직렬화 된 버퍼의 크기와 실제 메시지를 포함합니다. 귀하의 검침은 크기가인 size_t을 포함하는 크기 메시지를 채 웁니다.

불행히도 Boost.MPI는 메시지가 실제로 전송되는 다른 방식과 관련된 미묘한 문제와 버그로 ​​가득합니다.

관련 문제