2017-02-17 7 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

あなたのBoostバージョンは、実際には、を送信するのではなく、1つだけのint [70]を送信します。 Boostでは、この型はMPIデータ型ではないため、正しい(*stat).count<decltype(a)>();は空のオプションを返します。

documentationは少し誤解を招く:

タイプT、すなわち、is_mpi_datatype<T>mpl::true_を導出する必要があり、関連付けられたデータ型を持たなければなりません。タイプTが送信されたタイプと一致しない場合、このルーチンは空のoptional<int>を返します。

私の代わりにTが送信型と一致しない場合には、あなたが偽の結果または空optional<int>のいずれかを取得しますようです。 mpiデータ型でない場合は、空のoptional<int>が返されます。

なぜなら、Boost.MPIは、MPI以外のデータ型メッセージごとに2つのメッセージを送信するからです。 1つは直列化されたバッファのサイズと実際のメッセージを含んでいます。あなたのプローブは、size_tという1つのサイズメッセージを埋め込みます。サイズは2 intです。

残念ながら、Boost.MPIには、メッセージが実際に転送されるさまざまな方法に関するこの種の微妙な問題やバグがたくさんあります。

関連する問題