接收方未发布接收时标准和非阻塞发送会发生什么

时间:2018-10-30 15:23:43

标签: c++ mpi openmpi

如果我使用MPI_SendMPI_Isend发送邮件,并且接收进程没有收到死信或太忙而无法答复怎么办?

我怎么知道我应该停止发送到该进程,因为它没有收到/死或忙碌

我尝试了1:

MPI_Send (&destNode, strlen(destNode)+1, MPI_CHAR, nameServer, TAG_NAME_RESOLUTION, MPI_COMM_WORLD, &req);

但是,当nameServer未处于接收模式时,发送将被阻止

我使用MPI_Isend尝试了2次,并测试是否发送了味精:

    //Ask nameServer (process 1) to resolve destNode 
    MPI_Isend (&destNode, strlen(destNode)+1, MPI_CHAR, nameServer, TAG_NAME_RESOLUTION, MPI_COMM_WORLD, &req);

    int flag = 0;
    MPI_Test(&req, &flag,  &stat);

但是,即使我知道flag = 1由于该进程未收到而挂起,我仍会收到MPI_Send

1 个答案:

答案 0 :(得分:2)

MPI_Send返回还是MPI_Isend请求完成(flag==true)不一定取决于所发布的匹配接收。在这两种情况下,这仅意味着可以重新使用发送缓冲区。

虽然条件相似,但是您的MPI实现可能只决定在一种情况下进行缓冲,而不在另一种情况下进行缓冲。否则可能会在星期三的满月时缓冲。您不能对此承担任何责任。

如果出于某种原因需要返回函数或完成操作以指示实际上已接收到消息,则需要使用同步模式调用,即MPI_SsendMPI_Issend

引用MPI_Send(3.4)的标准

  

第3.2.1节中描述的发送呼叫使用标准通信模式。在   在此模式下,由MPI决定是否将缓冲传出的消息。 MPI可以缓冲传出消息。在这种情况下,发送调用可以在调用匹配的接收之前完成。另一方面,出于性能原因,缓冲区空间可能不可用,或者MPI可能选择不缓存传出消息。在这种情况下,只有在发布了匹配的接收方并将数据移至接收方之后,发送呼叫才会完成。

如果您想确保即使没有收到消息,程序也可以继续运行,请继续使用MPI_Isend,并确保在MPI_Test指示完成之前不触摸缓冲区和请求。

对于MPI_Isend / MPI_Test(3.7.3)

  

发送操作完成表示发件人现在可以自由更新   发送缓冲区中的位置(发送操作本身不会更改发送缓冲区的内容)。它并不表示已接收到该消息,而是可能已被通信子系统缓冲。

P.S。如果您的接收者排名是 dead ,则您的MPI程序很可能是错误的。