伊森德的奇怪行为
Strange behavior with Isend
下面是一个简单的代码,它只是使用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内缓冲(无论是在发送方还是接收方),发送是允许完成的,而不需要发布相应的接收。最终,您的系统将耗尽缓冲区,发送调用将停止完成,直到您调用相应的接收调用并释放一些系统缓冲区。
相关文章:
- 没有找到相关文章