代码之家  ›  专栏  ›  技术社区  ›  Ben J

在mpi-send/mpi-recv对中,如果数据未正确同步,数据会丢失吗?

  •  1
  • Ben J  · 技术社区  · 14 年前

    让我解释一下。考虑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-loop强制执行此顺序。

    所以会发生的是循环“等待”,直到有来自1的数据传入,然后它才能执行任何其他操作,即使已经有来自2、3和4的数据传入。如果此数据在1之前到达,那么从2、3和4到达的数据会发生什么情况?从这个意义上说,一旦“1”中的数据开始到达,然后proc递增到2,它最初试图从2接收的数据就不再存在了,这是否可以“忘记”?如果它被“遗忘”,整个分布式模拟将被挂起,因为它永远无法正确地处理特定从进程的数据。

    谢谢, 本。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Edric    14 年前

    MPI_CHAR int MPI_INT

    MPI_ANY_SOURCE MPI_Status