Isend的奇怪行为

时间:2014-06-25 17:29:59

标签: c++ mpi

以下是一个简单的代码,只需使用Isend将探测器i的数据发送到i + 1并探测所有发送是否完整。

代码:

std::vector<double> sendbuffer;
int myrank, nprocs;
std::vector <MPI::Request> req_v;

MPI::Init ();
nprocs = MPI::COMM_WORLD.Get_size ();
myrank = MPI::COMM_WORLD.Get_rank ();

sendbuffer.resize(20000);

int startin = 0;
if(myrank != nprocs-1)
for (int i = myrank+1; i <= (myrank+1);i++)
  {
        int sendrank = i;
        int msgtag = myrank * sendrank;
        int msgsz = sendbuffer.size();
        double *sdata = &(sendbuffer[startin]);
        MPI::Request req;
        req = MPI::COMM_WORLD.Isend (sdata, msgsz, MPI::DOUBLE, sendrank, msgtag);
        req_v.push_back (req);
  }

  printf("Size-%d %d\n", myrank,(int) req_v.size());
  if(req_v.size() > 0)
  MPI::Request::Waitall (req_v.size(), &(req_v[0]));

  printf("Over-%d\n", myrank);
  MPI::COMM_WORLD.Barrier();

  MPI::Finalize ();

代码完成缓冲区大小为1500但是对于20000它停止。这种行为似乎有点奇怪。我认为Isend不需要匹配接收。请提出可能导致此行为的原因。

1 个答案:

答案 0 :(得分:1)

您实际上从未收到过这些消息。如果没有相应的Recv(或Irecv)调用,发送调用可能永远不会完成。

您可以在this问题上获得更多详细信息,但通常情况下,只要消息可以在MPI中缓存(发送方或接收方),就可以完成发送而不会发布相应的接收侧)。最终,您的系统将用尽缓冲区,并且发送调用将停止完成,直到您调用相应的接收调用并释放一些系统缓冲区。