2016-01-10 30 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