4

MPI を使用したマスター/スレーブ プロセスの同期に問題があります。マスターがスレーブの実行順序を制御することを望みます。各スレーブは、次のことを行う必要があります: 1 - 読み取り 2 - プロセス。これが私のコードです:

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 

3 番目のプロセスが同期されないのはなぜですか? 貴重な助けをありがとう!

4

2 に答える 2

6

あなたが示したのは、マルチスレッドまたはマルチプロセス アーキテクチャの標準です。基本的に、プロセスMPI_Sendがマスター プロセスを呼び出した後、ブロックしている MPI 呼び出しがなくなるため、プロセスは解放されて独自に機能します。したがって、彼らが眠った後、彼らはお互いに独立して、そしてマスター自身からも独立して、彼らのエンドステートメントを印刷します!

以下に、あなたが見ているものを説明するための図を示します。

印刷は独立して行われます

于 2012-06-28T14:09:32.430 に答える
1

あなたの出力は期待されるべきです。スレーブ プロセスの読み取り部分を同期しましたが、スレーブの処理部分を同期するために何もしていません。スレーブは順番に (P1、次に P2、次に P3) 読み取りますが、処理が行われる順序を制限するものは何もありません。また、次のプロセスが読み取りを完了する前に、プロセスが処理を開始する場合があります。

于 2012-06-28T14:03:21.347 に答える