2012-06-28 67 views
3

我在使用MPI同步主/從進程時遇到問題。 我希望主控制奴隸執行的順序。每個奴隸必須這樣做:1-讀取2個過程。 這裏是我的代碼:使用MPI同步主/從模型

int main(int argc, char* argv []){ 

int rank,numprocess; 

MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &numprocess); 


if(rank==0){ //master 

    MPI_Status s;int Sstate=1;int Rstate; 

    int p; 
    for(p=1;p<numprocess;p++){ 

     fflush(stdout);printf("master : order P%d to start reading\n",p); 
     MPI_Send(&Sstate, sizeof(int), MPI_INT, p, 20, MPI_COMM_WORLD); 

     MPI_Recv(&Rstate,sizeof(int),MPI_INT,p,21,MPI_COMM_WORLD,&s); 
     fflush(stdout);printf("master : P%d finished reading\n",p); 
    } 

} 
else{ //workers 

    int state; MPI_Status s; 
    MPI_Recv(&state,sizeof(int),MPI_INT,0,20,MPI_COMM_WORLD,&s); 

    //read here 
    Sleep(1000); 

    //send to master : finish reading 
    state=2; 
    MPI_Send(&state, sizeof(int), MPI_INT, 0, 21, MPI_COMM_WORLD); 

    //processing 
    Sleep(3000); 
    fflush(stdout);printf("worker %d ended processing\n",rank); 
} 

MPI_Finalize(); 
return 0; 
} 

我的問題是與最後一個過程。事實上,它沒有像其他人一樣行事。這裏是我的輸出:

mpiexec -n 4 master.exe 
master : order P1 to start reading 
master : p1 finished reading 
master : order P2 to start reading 
master : p2 finished reading 
master : order P3 to start reading 
worker 1 ended processing 
worker 2 ended processing 
master : p3 finished reading 
worker 3 ended processing 

爲什麼第三個進程不同步? 感謝您寶貴的幫助!

+0

爲什麼你認爲它是不同步? – user7116

回答

4

你已經顯示的是正常爲多線程或多進程架構。基本上,在你的進程調用MPI_Send到主進程後,它們被釋放以獨立運行,因爲它們沒有更多的阻塞MPI調用。因此,在他們睡覺之後,他們將彼此獨立地與主人本身打印他們的結束語,

下面我有一個圖,我希望將說明你看到的:

Prints happen independently

+0

非常感謝你的清晰圖表。這正是我想要做的。 P2打印3秒後打印(「完成讀取」)的問題。但是我希望他們充當以下: 1- P1讀完 後1第二 2- P2讀完 1後第二 3- P3讀完 x秒之後 4種裨ennded方法(i = 1。 .3) – ezzakrem

+0

你希望他們都等到他們都完成了嗎? – user7116

+0

事實上,我想確保處理是並行執行的。然而,我想同步閱讀等一次讀取過程。由於處理是一項並行任務,我希望P1讀取然後開始處理。在p1開始處理的同時,p2應該開始讀取。等等。 – ezzakrem

1

您的輸出是預期的。您已經同步了從屬進程的讀取部分,但沒有做任何事情來同步從屬進程的處理部分。您的奴隸將按順序讀取(P1,然後是P2,然後是P3),但沒有任何限制處理完成的順序。另外,在下一個過程完成閱讀之前,過程可能開始處理。

+0

感謝您的回覆。其實,我認爲處理是並行完成的。但是,從磁盤讀取是串行(相互排斥)。我預期具有: 1-順序P1開始 (等待1秒,處理應該已經開始) 2-爲了P2開始 (等待1秒,處理應該已經開始) 3-順序P3開始 ( 1秒後和剩餘的處理時間) 4 pi完成(i:1..3) – ezzakrem

+1

我建議你用期望的輸出更新你的問題。 – user1202136

+0

@ezzakrem:從文件讀取不是對用戶空間應用程序進行過程串行操作而不鎖定。 – user7116