让我解释。考虑 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 接收的数据就不再存在了,它是否可以被“遗忘”?如果它被“遗忘”,整个分布式模拟就会挂起,因为它永远无法正确处理特定从属进程的数据。
谢谢,本。