![](/img/trans.png)
[英]Elegantly stop the thread for blocking or non-blocking when accept or receive using asio and C++11
[英]What happens for standard and non-blocking sends when the receiver does not post a receive
如果我发送使用或者MPI_Send
或MPI_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);
但是,即使我知道MPI_Send
因为进程未接收而挂起,我MPI_Send
得到flag = 1
。
不论是否MPI_Send
返回或MPI_Isend
请求完成( flag==true
)不一定依赖于匹配接收被张贴。 在两种情况下,这仅意味着可以重新使用发送缓冲区。
当条件相似时,您的MPI实现可能只决定在一种情况下缓冲而不在另一种情况下缓冲。 否则可能会在星期三的满月时缓冲。 您不能对此承担任何责任。
如果出于某种原因需要函数返回或操作完成以指示实际上已接收到消息,则需要使用同步模式调用,即MPI_Ssend
或MPI_Issend
。
引用MPI_Send
(3.4)的标准
3.2.1节中描述的发送呼叫使用标准通信模式。 在这种模式下,由MPI决定是否将缓冲传出的消息。 MPI可以缓冲传出消息。 在这种情况下,发送调用可以在调用匹配的接收之前完成。 另一方面,出于性能原因,缓冲区空间可能不可用,或者MPI可能选择不缓存传出消息。 在这种情况下,只有在发送了匹配的接收方并将数据移至接收方之前,发送呼叫才会完成。
如果您想确保尽管没有收到消息,您的程序仍可以继续,那么请继续使用MPI_Isend
并确保直到MPI_Test
指示完成为止,才触摸缓冲区和请求。
对于MPI_Isend
/ MPI_Test
(3.7.3)
发送操作的完成表示发送方现在可以自由更新发送缓冲区中的位置(发送操作本身不更改发送缓冲区的内容)。 它并不表示已接收到该消息,而是可能已被通信子系统缓冲。
PS:如果您的接收器等级已失效 ,则您的MPI程序很可能不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.