伊森德的奇怪行为

Strange behavior with Isend

本文关键字:      更新时间:2023-10-16

下面是一个简单的代码,它只是使用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 %dn", myrank,(int) req_v.size());
  if(req_v.size() > 0)
  MPI::Request::Waitall (req_v.size(), &(req_v[0]));
  printf("Over-%dn", myrank);
  MPI::COMM_WORLD.Barrier();
  MPI::Finalize ();

当缓冲区大小为1500时,代码完成,但当缓冲区大小为20000时,代码停止运行。这种行为似乎有点奇怪。我以为Isend不需要匹配接收。请给出可能的原因

您从未真正收到消息。如果没有对Recv(或Irecv)的相应调用,则send调用可能永远不会完成。

你可以在这个问题上得到更多的细节,但一般来说,只要消息可以在MPI内缓冲(无论是在发送方还是接收方),发送是允许完成的,而不需要发布相应的接收。最终,您的系统将耗尽缓冲区,发送调用将停止完成,直到您调用相应的接收调用并释放一些系统缓冲区。

相关文章:
  • 没有找到相关文章