2016-01-10 28 views
1

我的MPI程序中有一个主从模型。我想在下一次迭代之前让奴隶等待对方。使MPI中的slave彼此等待

if (rank == 0) { 
    // master process 
} else { 
    // slave process 
    for (int i = 0; i < 10; i++) { 
     // do stuff 
     // wait for all slaves to end iteration i 
    } 
} 

基本上,我不希望任何处理器进入下一次迭代而没有其他所有从站完成当前迭代。我怎样才能做到这一点?用MPI_Barrier

回答

2

您可以创建一个包含所有从属进程的通信器,并在MPI_Barrier()上使用它。 FRO创建此通信器,最简单的/最安全的是使用MPI_Comm_split()这种方式:

MPI_Comm slaves; 
MPI_Comm_split(MPI_COMM_WORLD, (rank == 0), rank, &slaves); 

这实际上全局创建2个传播者:一个仅包括主进程和一个包括所有过程,但主站。

在实际使用时,可以这样来做:

if (rank == 0) { 
    // master process 
} else { 
    // slave process 
    for (int i = 0; i < 10; i++) { 
     // do stuff 
     // wait for all slaves to end iteration i 
     MPI_Barrier(slaves); 
    } 
} 
+0

工作就像一个伤害。你还可以看看[这个](http://stackoverflow.com/questions/34706087/check-if-adjacent-slave-process-is-ended-in-mpi)? – user3616495

+0

另外,如果我将while循环更改为3次,其他5次,其他12次迭代。它会陷入僵局,是吗?我怎样才能防止它? – user3616495

+0

是的,它会死锁。问题变成了,你为什么要首先同步? – Gilles