1

让我解释。考虑 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 之前发送了它的数据(例如),在 MPI_Recv 命令中的源标签“proc”与处理器“1”匹配之前,上面显示的 0 中的接收循环不会启动,因为外部 for 循环强制这个排序。

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

谢谢,本。

4

1 回答 1

3

首先,你真的是要接收一个MPI_CHARinto chunkP - an int- 你不应该接收一个MPI_INT吗?

来自等级 1:4 的消息不会丢失 - 它们将排队等待等级 0 选择接收它们。这种行为是 MPI 标准规定的。

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

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

于 2010-11-24T12:19:53.670 回答