我正在尝试使用MPI实现分布式遗传算法(岛模型)。所有节点将重复生成新的群体,并在每次k次迭代后交换最佳个体。我希望交换随机,以便任何进程都可以向任何其他进程发送消息。因此,在每k次迭代之后,每个进程都会向随机选择的进程发送消息。但是,我不确定如何使用MPI实现此功能。从这篇文章 - Sending data to randomly selected hosts by using MPI我知道异步通信会有所帮助,但我不确定究竟是怎么回事。
答案 0 :(得分:3)
随机通信模式很难在MPI中实现。 MPI基于具有确定性通信模式集的所有等级。
对于点对点解决方案,每个等级将在MPI_ANY_SOURCE上调用MPI_Irecv。当数据交换发生时,每个等级可以将MPI_Send调用到特定目标等级。目标等级将需要再次调用MPI_Irecv以准备下一次迭代。作业完成后,任何未使用的MPI_Irecv调用都可以是MPI_Cancel'd。
对于集体方法,每个等级将调用MPI_Alltoall或MPI_Alltoallv(如果交换的数据量不同)。每个等级仅将数据填充到随机选择以接收数据的单个等级。这种“稀疏”数据交换与MPI_Alltoall非常相似。集合体可能很昂贵,但它确实允许每k次迭代进行硬同步,并且避免了MPI_Cancel的清理。