存在MPI_ANY_SOURCE和MPI_ANY_TAG时MPI消息的非超越属性

时间:2014-08-02 09:53:02

标签: parallel-processing mpi

假设我有一台服务器处理由不同类型的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型消息之前收到强>

1 个答案:

答案 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
 ...

由于服务器收到的所有这些呼叫都匹配,因此可以保证按照该客户端的确切顺序接收消息。因此,您的问题的答案是:在任何一个客户端上,邮件都会按照发布的顺序发送。


另一方面,没有要求收到来自不同客户的邮件的顺序。例如,以下场景是完全合法的:

  1. 服务器发布第一次接收
  2. 所有客户发布第一次发送和阻止
  3. 服务器将其接收与客户端X的第一条消息进行匹配,并发布其第二次接收
  4. 客户X的第一次发送完成,并发布第二次发送
  5. 同时,服务器将其第二次接收与客户Y的第一次发送匹配并发布其第三次接收
  6. 客户Y的第一次发送完成,并发布第二次发送
  7. 此时,服务器可以自由地将其第三次接收与客户X的第二次发送相匹配,而不是任何其他客户端的第一次发送
  8. 等等,服务器可以在接受来自客户端X和Y的发送之间交替,让其他人保持饥饿状态。