Позвольте мне объяснить. Рассмотрим 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, показанный выше, не будет инициирован до тех пор, пока исходный тег 'proc' в команде MPI_Recv не будет сопоставлен с процессором '1', потому что внешние для цикла вызывают этот порядок.
Итак, что происходит, так это то, что цикл «ждет», пока не поступят данные, поступающие от 1, прежде чем он сможет делать что-либо еще, даже если уже есть данные, поступающие с 2, 3 и 4. Что происходит с этими данными, поступающими с 2,3 и 4 если он прибудет раньше 1? Может ли это быть «забыто» в том смысле, что как только данные из «1» начинают поступать, а затем proc увеличивается до 2, данных, которые он первоначально пытался получить из 2, просто больше не существует? Если оно «забыто», то все распределенное моделирование просто зависнет, потому что оно никогда не сможет правильно обработать данные определенного подчиненного процесса.
Спасибо,
Бен.