让我解释一下。考虑4个从节点1、2、3、4和一个主节点0。现在,1、2、3、4需要将数据发送到0。0接收以下格式的数据。
for(int proc = 1;proc<procCount;proc++)
{
for(int p = 0;p<50;p++)
{
std::cout<<proc<<"\tA\t"<<p<<std::endl;
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接收的数据就不再存在了,这是否可以“忘记”?如果它被“遗忘”,整个分布式模拟将被挂起,因为它永远无法正确地处理特定从进程的数据。
谢谢,
本。