1

プロセッサ間で可変長のベクトルを送信する必要があります。より具体的には、1つのプロセッサが他の2つのプロセッサの送信をリッスンします。これで十分ですが、これで十分です。

// receiving processor (rank 0):
MPI::Status status;
MPI::COMM_WORLD.Probe(MPI::ANY_SOURCE, my_tag, status);
const auto sender = status.Get_source();
const auto n_bytes = status.Get_count(MPI::BYTE);
std::cerr << n_bytes << std::endl;
auto row = std::vector<size_t>(n_bytes / sizeof(size_t));
MPI::COMM_WORLD.Recv(&row.front(), n_bytes, MPI::BYTE, sender, my_tag);

// sending processor:
const size_t n = 10; // example value
auto row = std::vector<size_t>(n, 0);
const auto n_bytes = n * sizeof(size_t);
MPI::COMM_WORLD.Send(&row.front(), n_bytes, MPI::BYTE, 0, my_tag);

ただし、受信側のプロセッサは報告しn_bytes == 0ます。使用はProbe / Recv正しいですか?

4

1 に答える 1

2

質問に示されているコードはまったく間違っていません。ただし、製品コードは1つの重要な側面で異なっていました(私は愚かにも質問とは無関係だと思いました)。

エラーは次のコードにありました(送信者は同じままです):

// receiving processor (rank 0):
MPI::Status status;
MPI::COMM_WORLD.Probe(MPI::ANY_SOURCE, my_tag, status);
const auto sender = status.Get_source();
const auto n_bytes = status.Get_count(MPI::BYTE);
if ( n_bytes == 0 )
{
   std::cerr << "nothing transmitted\n";
   return; // BAD
}
auto row = std::vector<size_t>(n_bytes / sizeof(size_t));
MPI::COMM_WORLD.Recv(&row.front(), n_bytes, MPI::BYTE, sender, my_tag);

間違いは、受け取っていない状態でプロービングした後、メソッドから戻ることでした。空の送信でも消費する必要があります。それ以外の場合、プローブの次の呼び出しは、まったく同じ送信のステータスを取得します。

MPI::COMM_WORLD.Recv(NULL, 0, MPI::BYTE, sender, my_tag);戻る前に呼び出すことで修正できます。

于 2013-03-27T11:00:39.473 に答える