我在使用MPI同步主/从进程时遇到问题。 我希望主控制从属执行的顺序。 Eeach奴隶必须做: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
为什么第三个进程不同步? 谢谢你的宝贵帮助!
答案 0 :(得分:5)
您展示的是多线程或多进程架构的 Normal 。基本上,在您的进程将MPI_Send
调用到主进程之后,它们将被释放以自行运行,因为它们不再有阻塞MPI调用。因此,在他们睡觉之后,他们打印他们的结束陈述,彼此独立地和主人本身!
下面我有一张图表,希望能说明你所看到的内容:
答案 1 :(得分:1)
您的输出是预期的。您已同步从属进程的读取部分,但尚未执行任何操作来同步从属进程的处理部分。您的从站将按顺序读取(P1,然后是P2,然后是P3),但没有任何限制处理完成的顺序。此外,在下一个流程完成读取之前,流程可能会开始处理。