如何向多个进程广播或发送单个值(但不是全部)?

时间:2014-11-01 16:06:22

标签: c++ c mpi broadcast

我想要做的是将值(我的支点)广播到我的超立方体通信器的子域。 因此,例如,过程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);

2 个答案:

答案 0 :(得分:1)

最好的解决方案可能是使用MPI_COMM_SPLIT将您的流程分解为子通信器。那描述通信域的方式。

MPI_GROUP对象用于描述组,但大多数情况下不能用于执行通信。

另一种选择是使用MPI_ALLTOALLV。但这很糟糕,并且有很多矫枉过正。

答案 1 :(得分:0)

您可以使用 mpi_comm_split 但如果群组成员更改太频繁,则必须重复此操作。

另一个解决方案(在我看来很脏但很有效)会在发出计算命令之前播放类似进程掩码的内容。因此,进程0将广播一个包含8个bool类值的数组,其中true仅设置为掩码1,掩码[2],掩码[3] ......