我正在尝试使用 MPI 实现分布式遗传算法(孤岛模型)。所有节点都会重复生成新的种群,并在每 k 次迭代后交换最佳个体。我希望交换是随机的,这样任何进程都可以向任何其他进程发送消息。因此,在每 k 次迭代之后,每个进程都会向随机选择的进程发送一条消息。但是,我不确定如何使用 MPI 实现它。来自这篇文章 - Sending data to randomly selected hosts by using MPI我认为异步通信会有所帮助,但我不确定具体有多大帮助。
最佳答案
随机通信模式很难在 MPI 中实现。 MPI 基于具有一组确定性通信模式的所有级别。
对于点对点解决方案,每个等级将在 MPI_ANY_SOURCE 上调用 MPI_Irecv。当发生数据交换时,每个rank可以调用MPI_Send到特定的目标rank。目标排名将需要再次调用 MPI_Irecv 以准备下一次迭代。当作业完成时,任何未使用的 MPI_Irecv 调用都可以被 MPI_Cancel'd。
对于集体方法,每个等级将调用 MPI_Alltoall 或 MPI_Alltoallv(如果交换的数据量不同)。每个等级只会将数据填充到随机选择接收数据的单个等级。这种“稀疏”数据交换在 MPI_Alltoall 中很常见。集体可能很昂贵,但它确实允许每 k 次迭代进行硬同步,并避免清除 MPI_Cancel。
关于c - mpi 向随机选择的节点发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246569/