在MPI_Send / MPI_Recv对中,如果数据未正确同步,数据是否会丢失?

时间:2010-11-24 10:21:22

标签: c++ implementation openmpi mpich mpic++

让我解释一下。考虑4个从节点1,2,3,4和主节点0.现在,1,2,3,4需要将数据发送到0. 0以下列格式接收该数据。

for(int proc = 1;proc<procCount;proc++) // for each processor cpu (procCount = 5)
{
    for(int p = 0;p<50;p++)
    {

    std::cout<<proc<<"\tA\t"<<p<<std::endl;

    // read in binary datas
   int chunkP;
   int realP;
   real fitnessVal;
   real fitnessValB;
   real fitnessValC;
   int conCount;
   real subConCount;
   real networkEnergyLoss;
   real movementEnergyLoss;
   long spikeCount;

   MPI_Recv (reinterpret_cast < char *>(&chunkP),
      sizeof (chunkP),
                     MPI_CHAR,proc,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
   MPI_Recv (reinterpret_cast < char *>(&realP),
      sizeof (realP),
                        .
                        .
                        .
           }
     }

显然,不能假设1,2,3和4将数据发送到0的顺序(因为它们彼此独立地运行 - 2可能在1之前发送数据)。因此假设2确实在1之前发送其数据(例如),上面显示的0中的接收循环将不会启动,直到MPI_Recv命令中的源标记'proc'与处理器'1'匹配,因为外部for循环强制这个顺序。

所发生的事情就是循环'等待',直到有数据从1传入,即使已经存在从2,3和4到达的数据,它还会发生任何其他事情。这些数据来自2,3和4如果它在1之前到达?从'1'的数据开始到达然后proc增加到2的意义上它是否可以被“遗忘”,它最初试图从2接收的数据根本就不存在了?如果它被“遗忘”,整个分布式仿真就会挂起,因为它永远不会最终能够正确处理特定从属进程的数据。

谢谢, 本。

1 个答案:

答案 0 :(得分:3)

首先,您是否真的想接收MPI_CHAR到chunkP - int - 您是否应该收到MPI_INT

来自等级1:4的消息不会丢失 - 它们将排队,直到0级选择接收它们。此行为是MPI标准强制执行的。

如果消息足够大,则排名1:4可能会阻塞,直到他们实际上可以将他们的消息发送到排名0(大多数MPI实现具有有限的缓冲)。

您也可以考虑让排名0为第一次接收做MPI_ANY_SOURCE次接收,以查看谁准备好发送。您需要注意确保为相应的源发布后续接收 - 请查看MPI_Status结构以查看实际发送消息的位置。