讓我解釋一下。考慮4個從節點1,2,3,4和一個主節點0.現在,1,2,3,4需要向0發送數據。0以下面的格式接收這些數據。在MPI_Send/MPI_Recv對中,如果數據不正確同步,數據會丟失嗎?
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循環力這個順序。
所以會發生什麼是循環「等待」直到有數據傳入1,纔可以做任何事情,即使已經存在的數據,從2,3和4恰巧這個數據從2,3到達到達什麼如果它在1之前到達,則爲4?從'1'的數據開始到達,然後將增量增加到2,它最初試圖從2接收的數據是否已經不存在?是否可以'遺忘'這個意義上?如果它被「忘記」了,整個分佈式仿真就會掛起,因爲它永遠不會正確地處理特定從屬進程的數據。
感謝, 奔。
其實,關於你的第一個評論,不,我並不一定意味着MPI_INT。由於我有很多不同的數據類型需要接收(包括浮點數,整數,布爾等),我更願意將它們全部作爲MPI_CHAR接收,然後將它們重新解釋爲所需的數據類型。你可以看到這個方法的任何問題?...也感謝你的其他評論,我會看看MPI_ANY_SOURCE的建議。 – 2010-11-24 12:24:14