2014-11-01 18 views
1

我想要做的是向我的超立方體通信器的子域廣播一個值(我的透視)。 因此,例如進程0發送到進程1,2 & 3當進程4發送到4,5 6.是否需要我手動創建通信器或者是否有方法來執行廣播/發送到選定的進程?如何向多個進程廣播或發送單個值(但不是全部)?

int broadcaster = 0;  
if(isBroadcaster) 
{ 
    cout << "rank " << mpiRank << " currentd:" << currentd << " selecting pivot: " << pivot << endl; 
    pivot = currentValues[0]; 
    broadcaster = mpiRank; 
} 

//TODO: Broadcast to processes 0 to 4 only. 
//here, MPI_COMM_HYPERCUBE contains process 0 to 8 
MPI_Bcast(&pivot, 1, MPI_INT, broadcaster, MPI_COMM_HYPERCUBE); 
+0

@WesleyBland建議的(子)通信器的替代方法將是使用MPI的虛擬拓撲之一,可能是圖形拓撲。這是一段時間,因爲我用它們,所以不能將適當的答案拖在一起。 – 2014-11-04 06:43:59

回答

1

最好的解決方案可能是使用MPI_COMM_SPLIT將您的進程分解爲子通信器。描述通信域的方式是

MPI_GROUP對象用於描述組,但大部分不能用於執行通信。

另一種選擇是使用MPI_ALLTOALLV。雖然這很討厭,而且很多矯枉過正。

+0

謝謝,我不確定創建傳播者是要走的路。它證實了它。 我會試試看。 – Aymeric 2014-11-02 15:59:30

0

您可以使用mpi_comm_split但如果組成員變化太頻繁,您必須重複此操作。

另一個解決方案(骯髒,但在我看來有效)將播出計算命令之前廣播像過程掩碼。因此,進程0將廣播一個8 bool數值類似的值,其中真正被設置爲僅用於掩碼1,mask [2],mask [3] ...

+0

我想我喜歡在超立方體的情況下創建通信器的想法。謝謝! (不能upvote你呢,太新手在這裏,對不起)。 – Aymeric 2014-11-02 16:00:49

相關問題