2014-11-01 32 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

相关问题