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);
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

问题中显示的代码根本没有错。然而,生产代码在一个关键方面有所不同(我愚蠢地认为这与问题无关)。

错误出现在以下代码中(发件人保持不变):

// 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 回答