2010-11-24 61 views
1

讓我解釋一下。考慮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接收的數據是否已經不存在?是否可以'遺忘'這個意義上?如果它被「忘記」了,整個分佈式仿真就會掛起,因爲它永遠不會正確地處理特定從屬進程的數據。

感謝, 奔。

回答

3

首先,你是否真的想把MPI_CHAR分成chunkP - 一個int - 你不應該收到一個MPI_INT

從隊伍1中的消息:4也不會迷路 - 他們將得到排隊,直到等級0選擇接收他們。這種行爲是由MPI標準強制的。

如果消息是足夠大時,居1:4可以阻塞,直到他們實際上可以發送它們的消息進行排序0(最MPI實現具有有限的緩衝)。

您也可以考慮有秩0做一個MPI_ANY_SOURCE收到第一個收到看看誰的準備發送。儘管如此,爲了確保隨後的接收被髮布到相應的源代碼中,您需要小心 - 查看MPI_Status結構以查看消息實際發送的位置。

+0

其實,關於你的第一個評論,不,我並不一定意味着MPI_INT。由於我有很多不同的數據類型需要接收(包括浮點數,整數,布爾等),我更願意將它們全部作爲MPI_CHAR接收,然後將它們重新解釋爲所需的數據類型。你可以看到這個方法的任何問題?...也感謝你的其他評論,我會看看MPI_ANY_SOURCE的建議。 – 2010-11-24 12:24:14