gpt4 book ai didi

c++ - Isend 的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:51 26 4
gpt4 key购买 nike

下面是一个简单的代码,它使用 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 不需要匹配接收。请提出此行为的可能原因。

最佳答案

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

您可以在 this 获取更多详细信息问题,但一般来说,只要消息可以在 MPI 中缓冲(在发送方或接收方),发送就可以在没有发布相应接收的情况下完成。最终,您的系统将耗尽缓冲区并且发送调用将停止完成,直到您调用相应的接收调用并释放一些系统缓冲区。

关于c++ - Isend 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com