我想要做的是将值(我的支点)广播到我的超立方体通信器的子域。 因此,例如,过程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 :(得分:1)
最好的解决方案可能是使用MPI_COMM_SPLIT
将您的流程分解为子通信器。那是描述通信域的方式。
MPI_GROUP
对象用于描述组,但大多数情况下不能用于执行通信。
另一种选择是使用MPI_ALLTOALLV
。但这很糟糕,并且有很多矫枉过正。
答案 1 :(得分:0)
您可以使用 mpi_comm_split 但如果群组成员更改太频繁,则必须重复此操作。
另一个解决方案(在我看来很脏但很有效)会在发出计算命令之前播放类似进程掩码的内容。因此,进程0将广播一个包含8个bool类值的数组,其中true仅设置为掩码1,掩码[2],掩码[3] ......