假设我有一台服务器处理由不同类型的MPI标记识别的多种请求。
while(!stop)
{
MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&ready,&status);
if(ready)
{
src = status.MPI_SOURCE;
switch(status.MPI_TAG)
{
case MPI_REQ_A:
MPI_Irecv(...);
//do something else useful while waiting
MPI_Wait(...);
break;
case MPI_REQ_B:
MPI_Irecv(...);
//do something else useful while waiting
MPI_Wait(...);
break;
}
}
//do something else before calling MPI_Iprobe() again
}
并且有N个客户端向服务器发送请求。 如果每个客户端都发送消息,如下面的代码所示:
for( int i=0; i<k ; i++ )
{
MPI_Send(....,MPI_REQ_A,..);
MPI_Send(....,MPI_REQ_B,..);
}
如果MPI_Probe()或MPI_Iprobe()与接收方的MPI_ANY_SOURCE和MPI_ANY_TAG一起使用,如上面的代码所示,
问题1)是否仍然保证在消息之前收到迭代 i 中发送的 A类型消息同一客户在迭代 i + 1 中发送的相同类型?
问题2)是否仍然保证在迭代 i 中发送的类型A 消息是 在同一客户 我 同一客户 同一客户的 B型消息之前收到>强>
答案 0 :(得分:2)
根据this:
如果发件人连续向同一目的地发送两条消息, 并且两者匹配相同的接收,则此操作无法接收 第二条消息,如果第一条消息仍然未决。
现在,如果您在客户端中展开该循环,它基本上会这样做:
MPI_Send(....,MPI_REQ_A,..); // i
MPI_Send(....,MPI_REQ_B,..); // i
MPI_Send(....,MPI_REQ_A,..); // i + 1
MPI_Send(....,MPI_REQ_B,..); // i + 1
MPI_Send(....,MPI_REQ_A,..); // i + 2
MPI_Send(....,MPI_REQ_B,..); // i + 2
...
由于服务器收到的所有这些呼叫都匹配,因此可以保证按照该客户端的确切顺序接收消息。因此,您的问题的答案是是:在任何一个客户端上,邮件都会按照发布的顺序发送。
另一方面,没有要求收到来自不同客户的邮件的顺序。例如,以下场景是完全合法的:
等等,服务器可以在接受来自客户端X和Y的发送之间交替,让其他人保持饥饿状态。